Arve Hjønnevåg | ac9261c | 2024-02-26 14:26:06 -0800 | [diff] [blame] | 1 | use BitArray; |
| 2 | use BitField; |
| 3 | |
| 4 | #[test] |
| 5 | fn 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] |
| 20 | fn 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] |
| 36 | fn 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] |
| 52 | fn 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] |
| 87 | fn 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] |
| 103 | fn 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] |
| 143 | fn 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] |
| 183 | fn 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] |
| 199 | fn 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] |
| 243 | fn 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] |
| 283 | fn 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] |
| 299 | fn 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] |
| 343 | fn 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] |
| 358 | fn 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] |
| 374 | fn 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] |
| 386 | fn 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] |
| 429 | fn 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 | } |