bencode inspired tight self describing serialization format
Diffstat (limited to 'src/ser/tests.rs')
| -rw-r--r-- | src/ser/tests.rs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/ser/tests.rs b/src/ser/tests.rs new file mode 100644 index 0000000..eb9e968 --- /dev/null +++ b/src/ser/tests.rs @@ -0,0 +1,107 @@ +use super::*; +use atools::prelude::*; +const fn lenleb128(x: u128) -> usize { + let mut n2 = 0; + let mut w = x; + loop { + w >>= 7; + if w == 0 { + n2 += 1; + break; + } else { + n2 += 1; + } + } + n2 +} +const fn leb128<const X: u128>() -> [u8; lenleb128(X)] { + let mut i = 0; + let mut into: [u8; _] = [0; _]; + let mut w = X; + loop { + let n = (w & 127) as u8; + w >>= 7; + if w == 0 { + into[i] = n; + break; + } else { + into[i] = n | 1 << 7; + } + i += 1; + } + into +} + +#[test] +fn test_struct() { + #[derive(Serialize)] + struct Test { + int: u32, + seq: Vec<&'static str>, + } + + let test = Test { + int: 1, + seq: vec!["hello", "bendncode"], + }; + let expected = (*b"m") + .couple(leb128::<2>()) + .couple(*b"s\x03intu") + .couple(leb128::<1>()) + .couple(*b"s\x03seq") + .join(b'l') + .couple(leb128::<2>()) + .join(b's') + .couple(leb128::<5>()) + .couple(*b"hello") + .join(b's') + .couple(leb128::<9>()) + .couple(*b"bendncode"); + + assert_eq!(to_bytes(&test).unwrap(), expected); +} + +#[test] +fn test_enum() { + #[derive(Serialize)] + enum E { + Unit, + Newtype(u32), + Tuple(u32, u32), + Struct { a: u32 }, + } + + let u = E::Unit; + let expected = [b'n', b'u', 0]; + assert_eq!(to_bytes(&u).unwrap(), expected); + + // println!("--"); + + let n = E::Newtype(51); + let expected = b"vu" + .couple(leb128::<1>()) + .join(b'u') // i rather dislike this byte + .couple(leb128::<51>()); + + assert_eq!(to_bytes(&n).unwrap(), expected); + // println!("--"); + let t = E::Tuple(1, 24151561); + let expected = b"xu" + .couple(leb128::<2>()) + .couple(leb128::<2>()) + .join(b'u') + .couple(leb128::<1>()) + .join(b'u') + .couple(leb128::<24151561>()); + assert_eq!(to_bytes(&t).unwrap(), expected); + // println!("--"); + let s = E::Struct { a: 1 }; + let expected = b"yu" + .couple(leb128::<3>()) + .couple(leb128::<1>()) + .join(b's') + .couple(leb128::<1>()) + .couple(*b"au") + .couple(leb128::<1>()); + assert_eq!(to_bytes(&s).unwrap(), expected); +} |