@@ -1208,6 +1208,75 @@ mod tests {
12081208 }
12091209 }
12101210
1211+ // Test struct for array encoding/decoding with derive macros.
1212+ #[ derive( Debug , PartialEq , Cbor ) ]
1213+ #[ cbor( array) ]
1214+ struct TestArray {
1215+ first : u64 ,
1216+ second : String ,
1217+ third : Vec < u8 > ,
1218+ }
1219+
1220+ // Tests that array structs encode correctly in field declaration order.
1221+ #[ test]
1222+ fn test_array_encoding ( ) {
1223+ let arr = TestArray {
1224+ first : 42 ,
1225+ second : "hello" . to_string ( ) ,
1226+ third : vec ! [ 1 , 2 , 3 ] ,
1227+ } ;
1228+ let encoded = encode ( & arr) ;
1229+
1230+ // Should be: [42, "hello", h'010203']
1231+ let mut expected = vec ! [ 0x83 ] ; // array with 3 elements
1232+ expected. extend_from_slice ( & encode ( & 42u64 ) ) ;
1233+ expected. extend_from_slice ( & encode ( & "hello" . to_string ( ) ) ) ;
1234+ expected. extend_from_slice ( & encode ( & vec ! [ 1u8 , 2 , 3 ] ) ) ;
1235+
1236+ assert_eq ! ( encoded, expected) ;
1237+ }
1238+
1239+ // Tests that array structs decode correctly.
1240+ #[ test]
1241+ fn test_array_decoding ( ) {
1242+ let mut data = vec ! [ 0x83 ] ; // array with 3 elements
1243+ data. extend_from_slice ( & encode ( & 100u64 ) ) ;
1244+ data. extend_from_slice ( & encode ( & "world" . to_string ( ) ) ) ;
1245+ data. extend_from_slice ( & encode ( & vec ! [ 4u8 , 5 , 6 ] ) ) ;
1246+
1247+ let decoded = decode :: < TestArray > ( & data) . unwrap ( ) ;
1248+ assert_eq ! ( decoded. first, 100 ) ;
1249+ assert_eq ! ( decoded. second, "world" ) ;
1250+ assert_eq ! ( decoded. third, vec![ 4 , 5 , 6 ] ) ;
1251+ }
1252+
1253+ // Tests that array structs are rejected if the size does not match.
1254+ #[ test]
1255+ fn test_array_rejection ( ) {
1256+ // Too few elements (2 instead of 3)
1257+ let mut data = vec ! [ 0x82 ] ; // array with 2 elements
1258+ data. extend_from_slice ( & encode ( & 42u64 ) ) ;
1259+ data. extend_from_slice ( & encode ( & "test" . to_string ( ) ) ) ;
1260+ let result = decode :: < TestArray > ( & data) ;
1261+ assert ! ( result. is_err( ) ) ;
1262+ match result. unwrap_err ( ) {
1263+ Error :: UnexpectedItemCount ( 2 , 3 ) => { }
1264+ other => panic ! ( "Expected UnexpectedItemCount(2, 3) error, got {:?}" , other) ,
1265+ }
1266+ // Too many elements (4 instead of 3)
1267+ let mut data = vec ! [ 0x84 ] ; // array with 4 elements
1268+ data. extend_from_slice ( & encode ( & 42u64 ) ) ;
1269+ data. extend_from_slice ( & encode ( & "test" . to_string ( ) ) ) ;
1270+ data. extend_from_slice ( & encode ( & vec ! [ 1u8 ] ) ) ;
1271+ data. extend_from_slice ( & encode ( & 42u64 ) ) ;
1272+ let result = decode :: < TestArray > ( & data) ;
1273+ assert ! ( result. is_err( ) ) ;
1274+ match result. unwrap_err ( ) {
1275+ Error :: UnexpectedItemCount ( 4 , 3 ) => { }
1276+ other => panic ! ( "Expected UnexpectedItemCount(4, 3) error, got {:?}" , other) ,
1277+ }
1278+ }
1279+
12111280 // Test struct for map encoding/decoding with derive macros.
12121281 #[ derive( Debug , PartialEq , Cbor ) ]
12131282 struct TestMap {
0 commit comments