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() -> [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); }