1pub mod acc;
2pub mod dto;
3pub mod int;
4
5pub use acc::*;
6pub use int::*;
7
8#[cfg(test)]
9mod tests {
10 use yevm_misc::hex::Hex;
11
12 use super::*;
13
14 fn roundtrip<T: for<'a> From<&'a [u8]> + AsRef<[u8]>>(s: &str) -> String {
15 let buf = hex::decode(s).unwrap_or_default();
16 let t = T::from(&buf);
17 hex::encode(t.as_ref())
18 }
19
20 fn check<const N: usize>(s: &str) {
21 let actual = roundtrip::<Hex<N>>(s);
22 let expected = s.chars().take(s.len().min(N * 2)).collect::<String>();
23 let zeroes = N * 2 - (N * 2).min(s.len());
24 let zeroes = "0".repeat(zeroes);
25 let expected = format!("{zeroes}{expected}");
26 assert_eq!(actual, expected, "case '{s}'");
27 }
28
29 #[test]
30 fn test_int_roundtrip() {
31 for s in [
32 "ff",
33 "deadbeef",
34 "0102030405060708090a",
35 "aabbccddeeff00112233445566778899aabbccdd",
36 "aabbccddeeff00112233445566778899aabbccddee",
37 "aabbccddeeff00112233445566778899aabbccddeeff001122",
38 "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
39 ] {
40 check::<{ Int::N }>(s);
41 }
42 }
43
44 #[test]
45 fn test_acc_roundtrip() {
46 for s in [
47 "ff",
48 "deadbeef",
49 "0102030405060708090a",
50 "aabbccddeeff00112233445566778899aabbccdd",
51 ] {
52 check::<{ Acc::N }>(s);
53 }
54 }
55}