@@ -526,6 +526,84 @@ test_avl_random(void)
526
526
validate_avl (sizeof (keys ) / sizeof (* keys ), keys );
527
527
}
528
528
529
+ static void
530
+ test_bit_arrays (void )
531
+ {
532
+ // NB: This test is only valid for the 32 bit implementation of bit arrays. If we
533
+ // were to change the chunk size of a bit array, we'd need to update these tests
534
+ tsk_bit_array_t arr ;
535
+ tsk_bit_array_init (& arr , 90 , 1 );
536
+ for (tsk_bit_array_value_t i = 0 ; i < 20 ; i ++ ) {
537
+ tsk_bit_array_add_bit (& arr , i );
538
+ }
539
+ tsk_bit_array_add_bit (& arr , 63 );
540
+ tsk_bit_array_add_bit (& arr , 65 );
541
+
542
+ // these assertions are only valid for 32-bit values
543
+ CU_ASSERT_EQUAL_FATAL (arr .data [0 ], 1048575 );
544
+ CU_ASSERT_EQUAL_FATAL (arr .data [1 ], 2147483648 );
545
+ CU_ASSERT_EQUAL_FATAL (arr .data [2 ], 2 );
546
+
547
+ // verify our assumptions about bit array counting
548
+ CU_ASSERT_EQUAL_FATAL (tsk_bit_array_count (& arr ), 22 );
549
+
550
+ tsk_bit_array_free (& arr );
551
+
552
+ // create a length-2 array with 64 bit capacity
553
+ tsk_bit_array_init (& arr , 64 , 2 );
554
+ tsk_bit_array_t arr_row1 , arr_row2 ;
555
+
556
+ // select the first and second row
557
+ tsk_bit_array_get_row (& arr , 0 , & arr_row1 );
558
+ tsk_bit_array_get_row (& arr , 1 , & arr_row2 );
559
+
560
+ // fill the first 50 bits of the first row
561
+ for (tsk_bit_array_value_t i = 0 ; i < 50 ; i ++ ) {
562
+ tsk_bit_array_add_bit (& arr_row1 , i );
563
+ }
564
+ // fill bits 20-40 of the second row
565
+ for (tsk_bit_array_value_t i = 20 ; i < 40 ; i ++ ) {
566
+ tsk_bit_array_add_bit (& arr_row2 , i );
567
+ }
568
+
569
+ // verify our assumptions about row selection
570
+ CU_ASSERT_EQUAL_FATAL (arr .data [0 ], 4294967295 );
571
+ CU_ASSERT_EQUAL_FATAL (arr .data [1 ], 262143 );
572
+ CU_ASSERT_EQUAL_FATAL (arr_row1 .data [0 ], 4294967295 );
573
+ CU_ASSERT_EQUAL_FATAL (arr_row1 .data [1 ], 262143 );
574
+
575
+ CU_ASSERT_EQUAL_FATAL (arr .data [2 ], 4293918720 );
576
+ CU_ASSERT_EQUAL_FATAL (arr .data [3 ], 255 );
577
+ CU_ASSERT_EQUAL_FATAL (arr_row2 .data [0 ], 4293918720 );
578
+ CU_ASSERT_EQUAL_FATAL (arr_row2 .data [1 ], 255 );
579
+
580
+ // subtract the second from the first row, store in first
581
+ tsk_bit_array_subtract (& arr_row1 , & arr_row2 );
582
+
583
+ // verify our assumptions about subtraction
584
+ CU_ASSERT_EQUAL_FATAL (arr_row1 .data [0 ], 1048575 );
585
+ CU_ASSERT_EQUAL_FATAL (arr_row1 .data [1 ], 261888 );
586
+
587
+ tsk_bit_array_t int_result ;
588
+ tsk_bit_array_init (& int_result , 64 , 1 );
589
+
590
+ // their intersection should be zero
591
+ tsk_bit_array_intersect (& arr_row1 , & arr_row2 , & int_result );
592
+ CU_ASSERT_EQUAL_FATAL (int_result .data [0 ], 0 );
593
+ CU_ASSERT_EQUAL_FATAL (int_result .data [1 ], 0 );
594
+
595
+ // now, add them back together, storing back in a
596
+ tsk_bit_array_add (& arr_row1 , & arr_row2 );
597
+
598
+ // now, their intersection should be the subtracted chunk (20-40)
599
+ tsk_bit_array_intersect (& arr_row1 , & arr_row2 , & int_result );
600
+ CU_ASSERT_EQUAL_FATAL (int_result .data [0 ], 4293918720 );
601
+ CU_ASSERT_EQUAL_FATAL (int_result .data [1 ], 255 );
602
+
603
+ tsk_bit_array_free (& int_result );
604
+ tsk_bit_array_free (& arr );
605
+ }
606
+
529
607
static void
530
608
test_meson_version (void )
531
609
{
@@ -554,6 +632,7 @@ main(int argc, char **argv)
554
632
{ "test_avl_sequential" , test_avl_sequential },
555
633
{ "test_avl_interleaved" , test_avl_interleaved },
556
634
{ "test_avl_random" , test_avl_random },
635
+ { "test_bit_arrays" , test_bit_arrays },
557
636
{ "test_meson_version" , test_meson_version },
558
637
{ NULL , NULL },
559
638
};
0 commit comments