1515 * -----------------------
1616 */
1717
18+ static void test_irange_basic (void * * state );
19+
1820static void test_irange_list_union_merge (void * * state );
1921static void test_irange_list_union_lossy_cov (void * * state );
2022static void test_irange_list_union_complete_cov (void * * state );
@@ -30,6 +32,7 @@ main(void)
3032/* Array of test functions */
3133const struct CMUnitTest tests []=
3234{
35+ cmocka_unit_test (test_irange_basic ),
3336cmocka_unit_test (test_irange_list_union_merge ),
3437cmocka_unit_test (test_irange_list_union_lossy_cov ),
3538cmocka_unit_test (test_irange_list_union_complete_cov ),
@@ -47,6 +50,38 @@ main(void)
4750 * ----------------------
4851 */
4952
53+ /* Basic behavior tests */
54+ static void
55+ test_irange_basic (void * * state )
56+ {
57+ IndexRange irange ;
58+ List * irange_list ;
59+
60+ /* test irb_pred() */
61+ assert_int_equal (99 ,irb_pred (100 ));
62+ assert_int_equal (0 ,irb_pred (1 ));
63+ assert_int_equal (0 ,irb_pred (0 ));
64+
65+ /* test irb_succ() */
66+ assert_int_equal (100 ,irb_succ (99 ));
67+ assert_int_equal (IRANGE_BONDARY_MASK ,irb_succ (IRANGE_BONDARY_MASK ));
68+ assert_int_equal (IRANGE_BONDARY_MASK ,irb_succ (IRANGE_BONDARY_MASK + 1 ));
69+
70+ /* test convenience macros */
71+ irange = make_irange (0 ,IRANGE_BONDARY_MASK ,IR_LOSSY );
72+ assert_int_equal (irange_lower (irange ),0 );
73+ assert_int_equal (irange_upper (irange ),IRANGE_BONDARY_MASK );
74+ assert_true (is_irange_lossy (irange ));
75+ assert_true (is_irange_valid (irange ));
76+
77+ /* test allocation */
78+ irange_list = NIL ;
79+ irange_list = lappend_irange (irange_list ,irange );
80+ assert_memory_equal (& irange ,& linitial_irange (irange_list ),sizeof (IndexRange ));
81+ assert_memory_equal (& irange ,& llast_irange (irange_list ),sizeof (IndexRange ));
82+ }
83+
84+
5085/* Test merges of adjoint IndexRanges */
5186static void
5287test_irange_list_union_merge (void * * state )
@@ -288,7 +323,9 @@ static void
288323test_irange_list_intersection (void * * state )
289324{
290325IndexRange a ,b ;
291- List * intersection_result ;
326+ List * intersection_result ,
327+ * left_list ,
328+ * right_list ;
292329
293330
294331/* Subtest #0 */
@@ -340,4 +377,91 @@ test_irange_list_intersection(void **state)
340377
341378assert_string_equal (rangeset_print (intersection_result ),
342379"[15-20]C" );
380+
381+ /* Subtest #5 */
382+ left_list = NIL ;
383+ left_list = lappend_irange (left_list ,make_irange (0 ,11 ,IR_LOSSY ));
384+ left_list = lappend_irange (left_list ,make_irange (12 ,20 ,IR_COMPLETE ));
385+ right_list = NIL ;
386+ right_list = lappend_irange (right_list ,make_irange (1 ,15 ,IR_COMPLETE ));
387+ right_list = lappend_irange (right_list ,make_irange (16 ,20 ,IR_LOSSY ));
388+
389+ intersection_result = irange_list_intersection (left_list ,right_list );
390+
391+ assert_string_equal (rangeset_print (intersection_result ),
392+ "[1-11]L, [12-15]C, [16-20]L" );
393+
394+ /* Subtest #6 */
395+ left_list = NIL ;
396+ left_list = lappend_irange (left_list ,make_irange (0 ,11 ,IR_LOSSY ));
397+ left_list = lappend_irange (left_list ,make_irange (12 ,20 ,IR_COMPLETE ));
398+ right_list = NIL ;
399+ right_list = lappend_irange (right_list ,make_irange (1 ,15 ,IR_COMPLETE ));
400+ right_list = lappend_irange (right_list ,make_irange (16 ,20 ,IR_COMPLETE ));
401+
402+ intersection_result = irange_list_intersection (left_list ,right_list );
403+
404+ assert_string_equal (rangeset_print (intersection_result ),
405+ "[1-11]L, [12-20]C" );
406+
407+ /* Subtest #7 */
408+ a = make_irange (0 ,10 ,IR_COMPLETE );
409+ b = make_irange (20 ,20 ,IR_COMPLETE );
410+
411+ intersection_result = irange_list_intersection (list_make1_irange (a ),
412+ list_make1_irange (b ));
413+
414+ assert_string_equal (rangeset_print (intersection_result ),
415+ "" );/* empty set */
416+
417+ /* Subtest #8 */
418+ a = make_irange (0 ,10 ,IR_LOSSY );
419+ right_list = NIL ;
420+ right_list = lappend_irange (right_list ,make_irange (10 ,10 ,IR_COMPLETE ));
421+ right_list = lappend_irange (right_list ,make_irange (16 ,20 ,IR_LOSSY ));
422+
423+ intersection_result = irange_list_intersection (list_make1_irange (a ),
424+ right_list );
425+
426+ assert_string_equal (rangeset_print (intersection_result ),
427+ "10L" );
428+
429+ /* Subtest #9 */
430+ left_list = NIL ;
431+ left_list = lappend_irange (left_list ,make_irange (15 ,15 ,IR_LOSSY ));
432+ left_list = lappend_irange (left_list ,make_irange (25 ,25 ,IR_COMPLETE ));
433+ right_list = NIL ;
434+ right_list = lappend_irange (right_list ,make_irange (0 ,20 ,IR_COMPLETE ));
435+ right_list = lappend_irange (right_list ,make_irange (21 ,40 ,IR_LOSSY ));
436+
437+ intersection_result = irange_list_intersection (left_list ,right_list );
438+
439+ assert_string_equal (rangeset_print (intersection_result ),
440+ "15L, 25L" );
441+
442+ /* Subtest #10 */
443+ left_list = NIL ;
444+ left_list = lappend_irange (left_list ,make_irange (21 ,21 ,IR_LOSSY ));
445+ left_list = lappend_irange (left_list ,make_irange (22 ,22 ,IR_COMPLETE ));
446+ right_list = NIL ;
447+ right_list = lappend_irange (right_list ,make_irange (0 ,21 ,IR_COMPLETE ));
448+ right_list = lappend_irange (right_list ,make_irange (22 ,40 ,IR_LOSSY ));
449+
450+ intersection_result = irange_list_intersection (left_list ,right_list );
451+
452+ assert_string_equal (rangeset_print (intersection_result ),
453+ "[21-22]L" );
454+
455+ /* Subtest #11 */
456+ left_list = NIL ;
457+ left_list = lappend_irange (left_list ,make_irange (21 ,21 ,IR_LOSSY ));
458+ left_list = lappend_irange (left_list ,make_irange (22 ,25 ,IR_COMPLETE ));
459+ right_list = NIL ;
460+ right_list = lappend_irange (right_list ,make_irange (0 ,21 ,IR_COMPLETE ));
461+ right_list = lappend_irange (right_list ,make_irange (22 ,40 ,IR_COMPLETE ));
462+
463+ intersection_result = irange_list_intersection (left_list ,right_list );
464+
465+ assert_string_equal (rangeset_print (intersection_result ),
466+ "21L, [22-25]C" );
343467}