Skip to content

Commit fcccced

Browse files
committed
fix irb_succ(), more tests, add rule 'check' to Makefile
1 parent 949840f commit fcccced

File tree

3 files changed

+131
-4
lines changed

3 files changed

+131
-4
lines changed

src/rangeset.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct {
4747
#define lfirst_irange(lc) ( *(IndexRange *) lfirst(lc) )
4848
#define lappend_irange(list, irange) ( lappend((list), alloc_irange(irange)) )
4949
#define lcons_irange(irange, list) ( lcons(alloc_irange(irange), (list)) )
50-
#define list_make1_irange(irange) ( lcons(alloc_irange(irange), NIL) )
50+
#define list_make1_irange(irange) ( lcons_irange(irange, NIL) )
5151
#define llast_irange(list) ( lfirst_irange(list_tail(list)) )
5252
#define linitial_irange(list) ( lfirst_irange(list_head(list)) )
5353

@@ -90,12 +90,12 @@ irb_pred(uint32 boundary)
9090
return 0;
9191
}
9292

93-
/* Return predecessor or IRANGE_BONDARY_MASK */
93+
/* Return successor or IRANGE_BONDARY_MASK */
9494
inline static uint32
9595
irb_succ(uint32 boundary)
9696
{
9797
if (boundary >= IRANGE_BONDARY_MASK)
98-
return boundary;
98+
return IRANGE_BONDARY_MASK;
9999

100100
return boundary + 1;
101101
}

tests/cmocka/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,6 @@ build_extension:
2626

2727
clean:
2828
rm -f $(OBJ) $(TEST_BIN)
29+
30+
check: all
31+
./$(TEST_BIN)

tests/cmocka/rangeset_tests.c

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* -----------------------
1616
*/
1717

18+
static void test_irange_basic(void **state);
19+
1820
static void test_irange_list_union_merge(void **state);
1921
static void test_irange_list_union_lossy_cov(void **state);
2022
static void test_irange_list_union_complete_cov(void **state);
@@ -30,6 +32,7 @@ main(void)
3032
/* Array of test functions */
3133
const struct CMUnitTest tests[] =
3234
{
35+
cmocka_unit_test(test_irange_basic),
3336
cmocka_unit_test(test_irange_list_union_merge),
3437
cmocka_unit_test(test_irange_list_union_lossy_cov),
3538
cmocka_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 */
5186
static void
5287
test_irange_list_union_merge(void **state)
@@ -288,7 +323,9 @@ static void
288323
test_irange_list_intersection(void **state)
289324
{
290325
IndexRange 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

341378
assert_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
}

0 commit comments

Comments
 (0)