bencode inspired tight self describing serialization format
Diffstat (limited to 'src/ser/tests.rs')
-rw-r--r--src/ser/tests.rs107
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);
+}