use zr_protocol::{ codec::{decode::Decode, encode::Encode}, types::prefix::length::LenPrefixed, }; fn encode_to_bytes(value: T) -> Vec { let mut buf = Vec::new(); value.encode(&mut buf).unwrap(); buf } // ────────────────────── Données simples ───────── #[test] fn simple_u32_with_u8_length() { let lp = LenPrefixed::::new(42u32); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x04, 0x00, 0x00, 0x00, 0x2A]); } #[test] fn simple_u16_with_u16_length() { let lp = LenPrefixed::::new(256u16); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x00, 0x02, 0x01, 0x00]); } #[test] fn simple_u8_with_u8_length() { let lp = LenPrefixed::::new(0xABu8); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x01, 0xAB]); } #[test] fn simple_u64_with_u32_length() { let lp = LenPrefixed::::new(0x0102030405060708u64); let buf = encode_to_bytes(lp); assert_eq!( buf, vec![0x00, 0x00, 0x00, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08] ); } // ────────────────────── Booléen ───────────────── #[test] fn bool_true_with_u8_length() { let lp = LenPrefixed::::new(true); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x01, 0x01]); } #[test] fn bool_false_with_u8_length() { let lp = LenPrefixed::::new(false); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x01, 0x00]); } // ────────────────────── Tableaux ──────────────── #[test] fn array_4_bytes_with_u8_length() { let lp = LenPrefixed::::new([0x01, 0x02, 0x03, 0x04]); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x04, 0x01, 0x02, 0x03, 0x04]); } #[test] fn array_16_bytes_with_u16_length() { let data: [u8; 16] = std::array::from_fn(|i| i as u8); let lp = LenPrefixed::::new(data); let buf = encode_to_bytes(lp); assert_eq!(buf[0..2], [0x00, 0x10]); assert_eq!(&buf[2..], &data[..]); } #[test] fn array_256_bytes_with_u16_length() { let data: [u8; 256] = std::array::from_fn(|i| (i % 256) as u8); let lp = LenPrefixed::::new(data); let buf = encode_to_bytes(lp); assert_eq!(buf[0..2], [0x01, 0x00]); assert_eq!(&buf[2..], &data[..]); } // ────────────────────── Roundtrip ─────────────── #[test] fn roundtrip_u32_u8() { let lp = LenPrefixed::::new(42u32); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), 42u32); } #[test] fn roundtrip_u64_u16() { let lp = LenPrefixed::::new(u64::MAX); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), u64::MAX); } #[test] fn roundtrip_bool_u8() { let lp = LenPrefixed::::new(true); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert!(*decoded.as_ref()); } #[test] fn roundtrip_array_u8() { let data = [0xDE, 0xAD, 0xBE, 0xEF]; let lp = LenPrefixed::::new(data); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), data); } #[test] fn roundtrip_negative_i32() { let lp = LenPrefixed::::new(-12345); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), -12345); } #[test] fn roundtrip_f64() { let lp = LenPrefixed::::new(3.141592653589793); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), 3.141592653589793); } #[test] fn roundtrip_u128() { let lp = LenPrefixed::::new(u128::MAX); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), u128::MAX); } // ────────────────────── Imbrication ───────────── #[test] fn nested_len_prefixed_u16_u8_u32() { let inner = LenPrefixed::::new(42u32); let outer = LenPrefixed::>::new(inner); let buf = encode_to_bytes(outer); // outer length = 1 (u8 prefix of inner) + 4 (u32) = 5 assert_eq!(buf[0..2], [0x00, 0x05]); // inner length = 4 assert_eq!(buf[2], 0x04); // inner data = 42 assert_eq!(&buf[3..7], &[0x00, 0x00, 0x00, 0x2A]); } #[test] fn roundtrip_nested() { let inner = LenPrefixed::::new(1337u16); let outer = LenPrefixed::>::new(inner); let buf = encode_to_bytes(outer); let mut reader = &buf[..]; let decoded_outer = LenPrefixed::>::decode(&mut reader).unwrap(); let decoded_inner = decoded_outer.as_ref(); assert_eq!(decoded_inner.as_ref(), &1337u16); } #[test] fn triple_nested() { let l1 = LenPrefixed::::new(0xAA); let l2 = LenPrefixed::>::new(l1); let l3 = LenPrefixed::>>::new(l2); let buf = encode_to_bytes(l3); let mut reader = &buf[..]; let d3 = LenPrefixed::>>::decode(&mut reader).unwrap(); let d2 = d3.as_ref(); let d1 = d2.as_ref(); assert_eq!(*d1.as_ref(), 0xAAu8); } // ────────────────────── Erreurs de décodage ───── #[test] fn decode_empty_buffer_fails() { let result = LenPrefixed::::decode(&mut &[][..]); assert!(result.is_err()); } #[test] fn decode_truncated_length_fails() { let result = LenPrefixed::::decode(&mut &[0x01][..]); assert!(result.is_err()); } #[test] fn decode_length_exceeds_data_fails() { let mut buf = Vec::new(); 100u8.encode(&mut buf).unwrap(); buf.extend_from_slice(&[0x01, 0x02]); let result = LenPrefixed::::decode(&mut &buf[..]); assert!(result.is_err()); } #[test] fn decode_zero_length_with_zero_sized_type() { let lp = LenPrefixed::::new([]); let buf = encode_to_bytes(lp); let mut reader = &buf[..]; let decoded = LenPrefixed::::decode(&mut reader).unwrap(); assert_eq!(*decoded.as_ref(), []); } // ────────────────────── AsRef / AsMut ─────────── #[test] fn as_ref_returns_inner() { let lp = LenPrefixed::::new(99u32); assert_eq!(*lp.as_ref(), 99u32); } #[test] fn as_mut_allows_mutation() { let mut lp = LenPrefixed::::new(1u32); *lp.as_mut() = 42; assert_eq!(*lp.as_ref(), 42); } // ────────────────────── Taille du buffer ──────── #[test] fn u8_length_header_size() { let lp = LenPrefixed::::new(0); let buf = encode_to_bytes(lp); assert_eq!(buf.len(), 2); // 1 byte length + 1 byte data } #[test] fn u16_length_header_size() { let lp = LenPrefixed::::new(0); let buf = encode_to_bytes(lp); assert_eq!(buf.len(), 3); // 2 byte length + 1 byte data } #[test] fn u32_length_header_size() { let lp = LenPrefixed::::new(0); let buf = encode_to_bytes(lp); assert_eq!(buf.len(), 5); // 4 byte length + 1 byte data } #[test] fn u64_length_header_size() { let lp = LenPrefixed::::new(0); let buf = encode_to_bytes(lp); assert_eq!(buf.len(), 9); // 8 byte length + 1 byte data } #[test] fn large_data_length_correct() { let data: [u8; 1000] = std::array::from_fn(|i| (i % 256) as u8); let lp = LenPrefixed::::new(data); let buf = encode_to_bytes(lp); assert_eq!(buf.len(), 2 + 1000); assert_eq!(&buf[0..2], &[0x03, 0xE8]); // 1000 in u16 big-endian } // ────────────────────── Sérialisation exacte ──── #[test] fn exact_bytes_u8_prefix() { let lp = LenPrefixed::::new(256u16); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x02, 0x01, 0x00]); } #[test] fn exact_bytes_negative_i16() { let lp = LenPrefixed::::new(-1); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x02, 0xFF, 0xFF]); } #[test] fn exact_bytes_zero_u32() { let lp = LenPrefixed::::new(0u32); let buf = encode_to_bytes(lp); assert_eq!(buf, vec![0x04, 0x00, 0x00, 0x00, 0x00]); }