Skip to content

Commit c7f5fa1

Browse files
committed
poseidon: implement unit tests for test_item_as_bigint
1 parent fe13692 commit c7f5fa1

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
use poseidon::hash::Item;
2+
3+
#[test]
4+
fn test_item_bool_as_bigint() {
5+
let item_true = Item::Bool(true);
6+
let item_false = Item::Bool(false);
7+
8+
assert_eq!(item_true.as_bigint(), 1);
9+
assert_eq!(item_false.as_bigint(), 0);
10+
}
11+
12+
#[test]
13+
fn test_item_u2_as_bigint() {
14+
let item_0 = Item::U2(0);
15+
let item_1 = Item::U2(1);
16+
let item_2 = Item::U2(2);
17+
let item_3 = Item::U2(3);
18+
19+
assert_eq!(item_0.as_bigint(), 0);
20+
assert_eq!(item_1.as_bigint(), 1);
21+
assert_eq!(item_2.as_bigint(), 2);
22+
assert_eq!(item_3.as_bigint(), 3);
23+
}
24+
25+
#[test]
26+
fn test_item_u8_as_bigint() {
27+
let item_0 = Item::U8(0);
28+
let item_max = Item::U8(u8::MAX);
29+
let item_mid = Item::U8(128);
30+
31+
assert_eq!(item_0.as_bigint(), 0);
32+
assert_eq!(item_max.as_bigint(), 255);
33+
assert_eq!(item_mid.as_bigint(), 128);
34+
}
35+
36+
#[test]
37+
fn test_item_u32_as_bigint() {
38+
let item_0 = Item::U32(0);
39+
let item_max = Item::U32(u32::MAX);
40+
let item_mid = Item::U32(0x80000000);
41+
42+
assert_eq!(item_0.as_bigint(), 0);
43+
assert_eq!(item_max.as_bigint(), u32::MAX as u64);
44+
assert_eq!(item_mid.as_bigint(), 0x80000000);
45+
}
46+
47+
#[test]
48+
fn test_item_u64_as_bigint() {
49+
let item_0 = Item::U64(0);
50+
let item_max = Item::U64(u64::MAX);
51+
let item_mid = Item::U64(0x8000000000000000);
52+
53+
assert_eq!(item_0.as_bigint(), 0);
54+
assert_eq!(item_max.as_bigint(), u64::MAX);
55+
assert_eq!(item_mid.as_bigint(), 0x8000000000000000);
56+
}
57+
58+
#[test]
59+
fn test_item_u48_as_bigint() {
60+
// Test with all zeros
61+
let item_zeros = Item::U48([0, 0, 0, 0, 0, 0]);
62+
assert_eq!(item_zeros.as_bigint(), 0);
63+
64+
// Test with all ones (max 48-bit value)
65+
let item_max = Item::U48([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
66+
// 48 bits all set = 0xFFFFFFFFFFFF
67+
assert_eq!(item_max.as_bigint(), 0xFFFFFFFFFFFF);
68+
69+
// Test with specific pattern - little-endian bytes
70+
let item_pattern = Item::U48([0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
71+
// In big-endian format: 0x060504030201
72+
assert_eq!(item_pattern.as_bigint(), 0x060504030201);
73+
74+
// Test with high byte set
75+
let item_high = Item::U48([0x00, 0x00, 0x00, 0x00, 0x00, 0x80]);
76+
assert_eq!(item_high.as_bigint(), 0x800000000000);
77+
}
78+
79+
#[test]
80+
fn test_item_u48_edge_cases() {
81+
// Test powers of 2
82+
let item_1 = Item::U48([0x01, 0x00, 0x00, 0x00, 0x00, 0x00]);
83+
assert_eq!(item_1.as_bigint(), 1);
84+
85+
let item_256 = Item::U48([0x00, 0x01, 0x00, 0x00, 0x00, 0x00]);
86+
assert_eq!(item_256.as_bigint(), 0x0100);
87+
88+
let item_65536 = Item::U48([0x00, 0x00, 0x01, 0x00, 0x00, 0x00]);
89+
assert_eq!(item_65536.as_bigint(), 0x010000);
90+
91+
// Test byte boundary values
92+
let item_boundary = Item::U48([0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00]);
93+
assert_eq!(item_boundary.as_bigint(), 0x00FF00FF00FF);
94+
}
95+
96+
#[test]
97+
fn test_item_nbits() {
98+
assert_eq!(Item::Bool(true).nbits(), 1);
99+
assert_eq!(Item::Bool(false).nbits(), 1);
100+
101+
assert_eq!(Item::U2(0).nbits(), 2);
102+
assert_eq!(Item::U2(3).nbits(), 2);
103+
104+
assert_eq!(Item::U8(0).nbits(), 8);
105+
assert_eq!(Item::U8(255).nbits(), 8);
106+
107+
assert_eq!(Item::U32(0).nbits(), 32);
108+
assert_eq!(Item::U32(u32::MAX).nbits(), 32);
109+
110+
assert_eq!(Item::U48([0; 6]).nbits(), 48);
111+
assert_eq!(Item::U48([0xFF; 6]).nbits(), 48);
112+
113+
assert_eq!(Item::U64(0).nbits(), 64);
114+
assert_eq!(Item::U64(u64::MAX).nbits(), 64);
115+
}
116+
117+
#[test]
118+
fn test_item_u48_byte_order() {
119+
// Test that U48 uses correct byte order interpretation
120+
// The bytes should be interpreted as: [byte0, byte1, byte2, byte3, byte4, byte5]
121+
// And converted to big-endian u64
122+
123+
let test_cases = vec![
124+
([0x01, 0x00, 0x00, 0x00, 0x00, 0x00], 0x000000000001u64),
125+
([0x00, 0x01, 0x00, 0x00, 0x00, 0x00], 0x000000000100u64),
126+
([0x00, 0x00, 0x01, 0x00, 0x00, 0x00], 0x000000010000u64),
127+
([0x00, 0x00, 0x00, 0x01, 0x00, 0x00], 0x000001000000u64),
128+
([0x00, 0x00, 0x00, 0x00, 0x01, 0x00], 0x000100000000u64),
129+
([0x00, 0x00, 0x00, 0x00, 0x00, 0x01], 0x010000000000u64),
130+
];
131+
132+
for (bytes, expected) in test_cases {
133+
let item = Item::U48(bytes);
134+
assert_eq!(
135+
item.as_bigint(),
136+
expected,
137+
"U48({:02X?}) should equal 0x{:012X}",
138+
bytes,
139+
expected
140+
);
141+
}
142+
}

0 commit comments

Comments
 (0)