Skip to content

Commit 0db8644

Browse files
committed
cbor: add some sanity tests for array encoding/decoding from structs
1 parent 846afc7 commit 0db8644

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

src/cbor/mod.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)