blob: dd470e83e3001ba889077119211517d7d9d02cb0 [file] [log] [blame]
Arve Hjønnevågac9261c2024-02-26 14:26:06 -08001use BitArray;
2use BitField;
3
4#[test]
5fn test_integer_bit_lengths() {
6 assert_eq!(u8::BIT_LENGTH, 8);
7 assert_eq!(u16::BIT_LENGTH, 16);
8 assert_eq!(u32::BIT_LENGTH, 32);
9 assert_eq!(u64::BIT_LENGTH, 64);
10 assert_eq!(u128::BIT_LENGTH, 128);
11
12 assert_eq!(i8::BIT_LENGTH, 8);
13 assert_eq!(i16::BIT_LENGTH, 16);
14 assert_eq!(i32::BIT_LENGTH, 32);
15 assert_eq!(i64::BIT_LENGTH, 64);
16 assert_eq!(i128::BIT_LENGTH, 128);
17}
18
19#[test]
20fn test_set_reset_u8() {
21 let mut field = 0b11110010u8;
22 let mut bit_i = |i| {
23 field.set_bit(i, true);
24 assert_eq!(field.get_bit(i), true);
25 field.set_bit(i, false);
26 assert_eq!(field.get_bit(i), false);
27 field.set_bit(i, true);
28 assert_eq!(field.get_bit(i), true);
29 };
30 for i in 0..8 {
31 bit_i(i);
32 }
33}
34
35#[test]
36fn test_set_reset_u16() {
37 let mut field = 0b1111001010010110u16;
38 let mut bit_i = |i| {
39 field.set_bit(i, true);
40 assert_eq!(field.get_bit(i), true);
41 field.set_bit(i, false);
42 assert_eq!(field.get_bit(i), false);
43 field.set_bit(i, true);
44 assert_eq!(field.get_bit(i), true);
45 };
46 for i in 0..16 {
47 bit_i(i);
48 }
49}
50
51#[test]
52fn test_read_u32() {
53 let field = 0b1111111111010110u32;
54 assert_eq!(field.get_bit(0), false);
55 assert_eq!(field.get_bit(1), true);
56 assert_eq!(field.get_bit(2), true);
57 assert_eq!(field.get_bit(3), false);
58 assert_eq!(field.get_bit(4), true);
59 assert_eq!(field.get_bit(5), false);
60 for i in 6..16 {
61 assert_eq!(field.get_bit(i), true);
62 }
63 for i in 16..32 {
64 assert_eq!(field.get_bit(i), false);
65 }
66
67 assert_eq!(field.get_bits(16..), 0);
68 assert_eq!(field.get_bits(16..32), 0);
69 assert_eq!(field.get_bits(16..=31), 0);
70
71 assert_eq!(field.get_bits(6..16), 0b1111111111);
72 assert_eq!(field.get_bits(6..=15), 0b1111111111);
73
74 assert_eq!(field.get_bits(..6), 0b010110);
75 assert_eq!(field.get_bits(0..6), 0b010110);
76 assert_eq!(field.get_bits(0..=5), 0b010110);
77
78 assert_eq!(field.get_bits(..10), 0b1111010110);
79 assert_eq!(field.get_bits(0..10), 0b1111010110);
80 assert_eq!(field.get_bits(0..=9), 0b1111010110);
81
82 assert_eq!(field.get_bits(5..12), 0b1111110);
83 assert_eq!(field.get_bits(5..=11), 0b1111110);
84}
85
86#[test]
87fn test_set_reset_u32() {
88 let mut field = 0b1111111111010110u32;
89 let mut bit_i = |i| {
90 field.set_bit(i, true);
91 assert_eq!(field.get_bit(i), true);
92 field.set_bit(i, false);
93 assert_eq!(field.get_bit(i), false);
94 field.set_bit(i, true);
95 assert_eq!(field.get_bit(i), true);
96 };
97 for i in 0..32 {
98 bit_i(i);
99 }
100}
101
102#[test]
103fn test_set_range_u32() {
104 let mut field = 0b1111111111010110u32;
105 field.set_bits(10..15, 0b00000);
106 assert_eq!(field.get_bits(10..15), 0b00000);
107 assert_eq!(field.get_bits(10..=14), 0b00000);
108 field.set_bits(10..15, 0b10101);
109 assert_eq!(field.get_bits(10..15), 0b10101);
110 assert_eq!(field.get_bits(10..=14), 0b10101);
111 field.set_bits(10..15, 0b01010);
112 assert_eq!(field.get_bits(10..15), 0b01010);
113 assert_eq!(field.get_bits(10..=14), 0b01010);
114 field.set_bits(10..15, 0b11111);
115 assert_eq!(field.get_bits(10..15), 0b11111);
116 assert_eq!(field.get_bits(10..=14), 0b11111);
117
118 field.set_bits(10..=14, 0b00000);
119 assert_eq!(field.get_bits(10..15), 0b00000);
120 assert_eq!(field.get_bits(10..=14), 0b00000);
121 field.set_bits(10..=14, 0b10101);
122 assert_eq!(field.get_bits(10..15), 0b10101);
123 assert_eq!(field.get_bits(10..=14), 0b10101);
124 field.set_bits(10..=14, 0b01010);
125 assert_eq!(field.get_bits(10..15), 0b01010);
126 assert_eq!(field.get_bits(10..=14), 0b01010);
127 field.set_bits(10..=14, 0b11111);
128 assert_eq!(field.get_bits(10..15), 0b11111);
129 assert_eq!(field.get_bits(10..=14), 0b11111);
130
131 field.set_bits(0..16, 0xdead);
132 field.set_bits(14..32, 0xbeaf);
133 assert_eq!(field.get_bits(0..16), 0xdead);
134 assert_eq!(field.get_bits(14..32), 0xbeaf);
135
136 field.set_bits(..16, 0xdead);
137 field.set_bits(14.., 0xbeaf);
138 assert_eq!(field.get_bits(..16), 0xdead);
139 assert_eq!(field.get_bits(14..), 0xbeaf);
140}
141
142#[test]
143fn test_read_u64() {
144 let field = 0b1111111111010110u64 << 32;
145 for i in 0..32 {
146 assert_eq!(field.get_bit(i), false);
147 }
148 assert_eq!(field.get_bit(32), false);
149 assert_eq!(field.get_bit(33), true);
150 assert_eq!(field.get_bit(34), true);
151 assert_eq!(field.get_bit(35), false);
152 assert_eq!(field.get_bit(36), true);
153 assert_eq!(field.get_bit(37), false);
154 for i in 38..48 {
155 assert_eq!(field.get_bit(i), true);
156 }
157 for i in 48..64 {
158 assert_eq!(field.get_bit(i), false);
159 }
160
161 assert_eq!(field.get_bits(..32), 0);
162 assert_eq!(field.get_bits(0..32), 0);
163 assert_eq!(field.get_bits(0..=31), 0);
164
165 assert_eq!(field.get_bits(48..), 0);
166 assert_eq!(field.get_bits(48..64), 0);
167 assert_eq!(field.get_bits(48..=63), 0);
168
169 assert_eq!(field.get_bits(38..48), 0b1111111111);
170 assert_eq!(field.get_bits(38..=47), 0b1111111111);
171
172 assert_eq!(field.get_bits(32..38), 0b010110);
173 assert_eq!(field.get_bits(32..=37), 0b010110);
174
175 assert_eq!(field.get_bits(32..42), 0b1111010110);
176 assert_eq!(field.get_bits(32..=41), 0b1111010110);
177
178 assert_eq!(field.get_bits(37..44), 0b1111110);
179 assert_eq!(field.get_bits(37..=43), 0b1111110);
180}
181
182#[test]
183fn test_set_reset_u64() {
184 let mut field = 0b1111111111010110u64 << 32;
185 let mut bit_i = |i| {
186 field.set_bit(i, true);
187 assert_eq!(field.get_bit(i), true);
188 field.set_bit(i, false);
189 assert_eq!(field.get_bit(i), false);
190 field.set_bit(i, true);
191 assert_eq!(field.get_bit(i), true);
192 };
193 for i in 0..64 {
194 bit_i(i);
195 }
196}
197
198#[test]
199fn test_set_range_u64() {
200 let mut field = 0b1111111111010110u64 << 32;
201 field.set_bits(42..47, 0b00000);
202 assert_eq!(field.get_bits(42..47), 0b00000);
203 assert_eq!(field.get_bits(42..=46), 0b00000);
204 field.set_bits(10..15, 0b10101);
205 assert_eq!(field.get_bits(10..15), 0b10101);
206 assert_eq!(field.get_bits(10..=14), 0b10101);
207 field.set_bits(40..45, 0b01010);
208 assert_eq!(field.get_bits(40..45), 0b01010);
209 assert_eq!(field.get_bits(40..=44), 0b01010);
210 field.set_bits(40..45, 0b11111);
211 assert_eq!(field.get_bits(40..45), 0b11111);
212 assert_eq!(field.get_bits(40..=44), 0b11111);
213
214 field.set_bits(42..=46, 0b00000);
215 assert_eq!(field.get_bits(42..47), 0b00000);
216 assert_eq!(field.get_bits(42..=46), 0b00000);
217 field.set_bits(10..=14, 0b10101);
218 assert_eq!(field.get_bits(10..15), 0b10101);
219 assert_eq!(field.get_bits(10..=14), 0b10101);
220 field.set_bits(40..=44, 0b01010);
221 assert_eq!(field.get_bits(40..45), 0b01010);
222 assert_eq!(field.get_bits(40..=44), 0b01010);
223 field.set_bits(40..=44, 0b11111);
224 assert_eq!(field.get_bits(40..45), 0b11111);
225 assert_eq!(field.get_bits(40..=44), 0b11111);
226
227 field.set_bits(0..16, 0xdead);
228 field.set_bits(14..32, 0xbeaf);
229 field.set_bits(32..64, 0xcafebabe);
230 assert_eq!(field.get_bits(0..16), 0xdead);
231 assert_eq!(field.get_bits(14..32), 0xbeaf);
232 assert_eq!(field.get_bits(32..64), 0xcafebabe);
233
234 field.set_bits(..16, 0xdead);
235 field.set_bits(14..=31, 0xbeaf);
236 field.set_bits(32.., 0xcafebabe);
237 assert_eq!(field.get_bits(..16), 0xdead);
238 assert_eq!(field.get_bits(14..=31), 0xbeaf);
239 assert_eq!(field.get_bits(32..), 0xcafebabe);
240}
241
242#[test]
243fn test_read_u128() {
244 let field = 0b1111111111010110u128 << 32;
245 for i in 0..32 {
246 assert_eq!(field.get_bit(i), false);
247 }
248 assert_eq!(field.get_bit(32), false);
249 assert_eq!(field.get_bit(33), true);
250 assert_eq!(field.get_bit(34), true);
251 assert_eq!(field.get_bit(35), false);
252 assert_eq!(field.get_bit(36), true);
253 assert_eq!(field.get_bit(37), false);
254 for i in 38..48 {
255 assert_eq!(field.get_bit(i), true);
256 }
257 for i in 48..64 {
258 assert_eq!(field.get_bit(i), false);
259 }
260
261 assert_eq!(field.get_bits(..32), 0);
262 assert_eq!(field.get_bits(0..32), 0);
263 assert_eq!(field.get_bits(0..=31), 0);
264
265 assert_eq!(field.get_bits(48..), 0);
266 assert_eq!(field.get_bits(48..64), 0);
267 assert_eq!(field.get_bits(48..=63), 0);
268
269 assert_eq!(field.get_bits(38..48), 0b1111111111);
270 assert_eq!(field.get_bits(38..=47), 0b1111111111);
271
272 assert_eq!(field.get_bits(32..38), 0b010110);
273 assert_eq!(field.get_bits(32..=37), 0b010110);
274
275 assert_eq!(field.get_bits(32..42), 0b1111010110);
276 assert_eq!(field.get_bits(32..=41), 0b1111010110);
277
278 assert_eq!(field.get_bits(37..44), 0b1111110);
279 assert_eq!(field.get_bits(37..=43), 0b1111110);
280}
281
282#[test]
283fn test_set_reset_u128() {
284 let mut field = 0b1111111111010110u128 << 32;
285 let mut bit_i = |i| {
286 field.set_bit(i, true);
287 assert_eq!(field.get_bit(i), true);
288 field.set_bit(i, false);
289 assert_eq!(field.get_bit(i), false);
290 field.set_bit(i, true);
291 assert_eq!(field.get_bit(i), true);
292 };
293 for i in 0..64 {
294 bit_i(i);
295 }
296}
297
298#[test]
299fn test_set_range_u128() {
300 let mut field = 0b1111111111010110u128 << 32;
301 field.set_bits(42..47, 0b00000);
302 assert_eq!(field.get_bits(42..47), 0b00000);
303 assert_eq!(field.get_bits(42..=46), 0b00000);
304 field.set_bits(10..15, 0b10101);
305 assert_eq!(field.get_bits(10..15), 0b10101);
306 assert_eq!(field.get_bits(10..=14), 0b10101);
307 field.set_bits(40..45, 0b01010);
308 assert_eq!(field.get_bits(40..45), 0b01010);
309 assert_eq!(field.get_bits(40..=44), 0b01010);
310 field.set_bits(40..45, 0b11111);
311 assert_eq!(field.get_bits(40..45), 0b11111);
312 assert_eq!(field.get_bits(40..=44), 0b11111);
313
314 field.set_bits(42..=46, 0b00000);
315 assert_eq!(field.get_bits(42..47), 0b00000);
316 assert_eq!(field.get_bits(42..=46), 0b00000);
317 field.set_bits(10..=14, 0b10101);
318 assert_eq!(field.get_bits(10..15), 0b10101);
319 assert_eq!(field.get_bits(10..=14), 0b10101);
320 field.set_bits(40..=44, 0b01010);
321 assert_eq!(field.get_bits(40..45), 0b01010);
322 assert_eq!(field.get_bits(40..=44), 0b01010);
323 field.set_bits(40..=44, 0b11111);
324 assert_eq!(field.get_bits(40..45), 0b11111);
325 assert_eq!(field.get_bits(40..=44), 0b11111);
326
327 field.set_bits(0..16, 0xdead);
328 field.set_bits(14..32, 0xbeaf);
329 field.set_bits(32..64, 0xcafebabe);
330 assert_eq!(field.get_bits(0..16), 0xdead);
331 assert_eq!(field.get_bits(14..32), 0xbeaf);
332 assert_eq!(field.get_bits(32..64), 0xcafebabe);
333
334 field.set_bits(..16, 0xdead);
335 field.set_bits(14..=31, 0xbeaf);
336 field.set_bits(32.., 0xcafebabe);
337 assert_eq!(field.get_bits(..16), 0xdead);
338 assert_eq!(field.get_bits(14..=31), 0xbeaf);
339 assert_eq!(field.get_bits(32..), 0xcafebabe);
340}
341
342#[test]
343fn test_array_length() {
344 assert_eq!((&[2u8, 3u8, 4u8]).bit_length(), 24);
345 assert_eq!((&[2i8, 3i8, 4i8, 5i8]).bit_length(), 32);
346
347 assert_eq!((&[2u16, 3u16, 4u16]).bit_length(), 48);
348 assert_eq!((&[2i16, 3i16, 4i16, 5i16]).bit_length(), 64);
349
350 assert_eq!((&[2u32, 3u32, 4u32]).bit_length(), 96);
351 assert_eq!((&[2i32, 3i32, 4i32, 5i32]).bit_length(), 128);
352
353 assert_eq!((&[2u64, 3u64, 4u64]).bit_length(), 192);
354 assert_eq!((&[2i64, 3i64, 4i64, 5i64]).bit_length(), 256);
355}
356
357#[test]
358fn test_set_bit_array() {
359 let mut test_val = [0xffu8];
360 &test_val.set_bit(0, false);
361 assert_eq!(test_val, [0xfeu8]);
362 &test_val.set_bit(4, false);
363 assert_eq!(test_val, [0xeeu8]);
364
365 let mut test_array = [0xffu8, 0x00u8, 0xffu8];
366 &test_array.set_bit(7, false);
367 &test_array.set_bit(8, true);
368 &test_array.set_bit(16, false);
369
370 assert_eq!(test_array, [0x7fu8, 0x01u8, 0xfeu8]);
371}
372
373#[test]
374fn test_get_bit_array() {
375 let test_val = [0xefu8];
376 assert_eq!(test_val.get_bit(1), true);
377 assert_eq!(test_val.get_bit(4), false);
378
379 let test_array = [0xffu8, 0x00u8, 0xffu8];
380 assert_eq!(test_array.get_bit(7), true);
381 assert_eq!(test_array.get_bit(8), false);
382 assert_eq!(test_array.get_bit(16), true);
383}
384
385#[test]
386fn test_set_bits_array() {
387 let mut test_val = [0xffu8];
388
389 test_val.set_bits(0..4, 0x0u8);
390 assert_eq!(test_val, [0xf0u8]);
391
392 test_val.set_bits(0..4, 0xau8);
393 assert_eq!(test_val, [0xfau8]);
394
395 test_val.set_bits(4..8, 0xau8);
396 assert_eq!(test_val, [0xaau8]);
397
398 test_val.set_bits(.., 0xffu8);
399 assert_eq!(test_val, [0xffu8]);
400
401 test_val.set_bits(2..=5, 0x0u8);
402 assert_eq!(test_val, [0xc3u8]);
403
404 let mut test_array = [0xffu8, 0x00u8, 0xffu8];
405
406 test_array.set_bits(7..9, 0b10);
407 assert_eq!(test_array, [0x7f, 0x01, 0xff]);
408
409 test_array.set_bits(12..20, 0xaa);
410 assert_eq!(test_array, [0x7f, 0xa1, 0xfa]);
411
412 test_array.set_bits(16..24, 0xaa);
413 assert_eq!(test_array, [0x7f, 0xa1, 0xaa]);
414
415 test_array.set_bits(6..14, 0x00);
416 assert_eq!(test_array, [0x3f, 0x80, 0xaa]);
417
418 test_array.set_bits(..4, 0x00);
419 assert_eq!(test_array, [0x30, 0x80, 0xaa]);
420
421 test_array.set_bits(20.., 0x00);
422 assert_eq!(test_array, [0x30, 0x80, 0x0a]);
423
424 test_array.set_bits(7..=11, 0x1f);
425 assert_eq!(test_array, [0xb0, 0x8f, 0x0a]);
426}
427
428#[test]
429fn test_get_bits_array() {
430 let mut test_val = [0xf0u8];
431 assert_eq!(test_val.get_bits(0..4), 0x0u8);
432
433 test_val = [0xfau8];
434 assert_eq!(test_val.get_bits(0..4), 0xau8);
435
436 test_val = [0xaau8];
437 assert_eq!(test_val.get_bits(4..8), 0xau8);
438
439 let mut test_array: [u8; 3] = [0xff, 0x01, 0xff];
440 assert_eq!(test_array.get_bits(7..9), 0b11u8);
441
442 test_array = [0x7f, 0xa1, 0xfa];
443 assert_eq!(test_array.get_bits(12..20), 0xaa);
444
445 test_array = [0x7f, 0xa1, 0xaa];
446 assert_eq!(test_array.get_bits(16..24), 0xaa);
447
448 test_array = [0x3f, 0x80, 0xaa];
449 assert_eq!(test_array.get_bits(6..14), 0x00);
450}