@@ -462,4 +462,56 @@ protected Object createCollection(Class type) {
462462 }
463463 }
464464 }
465+
466+ // record deserialization (#26077)
467+
468+ public record ConfigRecord (String name , int age ) {}
469+
470+ @ Test
471+ @ Issue ("JENKINS-26077" )
472+ void unmarshalRecord () {
473+ XStream2 xs = new XStream2 ();
474+ xs .alias ("config-record" , ConfigRecord .class );
475+ String xml = "<config-record><name>Jenkins</name><age>20</age></config-record>" ;
476+ ConfigRecord rec = (ConfigRecord ) xs .fromXML (xml );
477+ assertEquals ("Jenkins" , rec .name ());
478+ assertEquals (20 , rec .age ());
479+ }
480+
481+ @ Test
482+ @ Issue ("JENKINS-26077" )
483+ void unmarshalRecordWithMissingField () {
484+ XStream2 xs = new XStream2 ();
485+ xs .alias ("config-record" , ConfigRecord .class );
486+ // age is omitted, should default to 0
487+ String xml = "<config-record><name>Jenkins</name></config-record>" ;
488+ ConfigRecord rec = (ConfigRecord ) xs .fromXML (xml );
489+ assertEquals ("Jenkins" , rec .name ());
490+ assertEquals (0 , rec .age (), "primitive int should default to 0 when missing from XML" );
491+ }
492+
493+ @ Test
494+ @ Issue ("JENKINS-26077" )
495+ void unmarshalRecordWithExtraField () {
496+ XStream2 xs = new XStream2 ();
497+ xs .alias ("config-record" , ConfigRecord .class );
498+ // extra element that doesn't exist on the record
499+ String xml = "<config-record><name>Jenkins</name><age>20</age><extra>ignored</extra></config-record>" ;
500+ ConfigRecord rec = (ConfigRecord ) xs .fromXML (xml );
501+ assertEquals ("Jenkins" , rec .name ());
502+ assertEquals (20 , rec .age ());
503+ }
504+
505+ @ Test
506+ @ Issue ("JENKINS-26077" )
507+ void recordRoundTrip () {
508+ XStream2 xs = new XStream2 ();
509+ xs .alias ("config-record" , ConfigRecord .class );
510+ ConfigRecord original = new ConfigRecord ("Jenkins" , 20 );
511+ String xml = xs .toXML (original );
512+ ConfigRecord deserialized = (ConfigRecord ) xs .fromXML (xml );
513+ assertEquals (original .name (), deserialized .name ());
514+ assertEquals (original .age (), deserialized .age ());
515+ }
516+
465517}
0 commit comments