1818static void test_irange_list_union_merge (void * * state );
1919static void test_irange_list_union_lossy_cov (void * * state );
2020static void test_irange_list_union_complete_cov (void * * state );
21+ static void test_irange_list_union_intersection (void * * state );
2122
2223
2324/* Entrypoint */
@@ -30,6 +31,7 @@ main(void)
3031cmocka_unit_test (test_irange_list_union_merge ),
3132cmocka_unit_test (test_irange_list_union_lossy_cov ),
3233cmocka_unit_test (test_irange_list_union_complete_cov ),
34+ cmocka_unit_test (test_irange_list_union_intersection ),
3335};
3436
3537/* Run series of tests */
@@ -46,14 +48,13 @@ main(void)
4648static void
4749test_irange_list_union_merge (void * * state )
4850{
49- IndexRange a ;
51+ IndexRange a , b ;
5052List * unmerged ,
5153* union_result ;
5254
5355
5456/* Subtest #0 */
5557a = make_irange (0 ,8 ,IR_COMPLETE );
56-
5758unmerged = NIL ;
5859unmerged = lappend_irange (unmerged ,make_irange (9 ,10 ,IR_COMPLETE ));
5960unmerged = lappend_irange (unmerged ,make_irange (11 ,11 ,IR_LOSSY ));
@@ -66,6 +67,31 @@ test_irange_list_union_merge(void **state)
6667
6768assert_string_equal (rangeset_print (union_result ),
6869"[0-10]C, 11L, [12-24]C" );
70+
71+ union_result = irange_list_union (unmerged ,unmerged );
72+
73+ assert_string_equal (rangeset_print (union_result ),
74+ "[9-10]C, 11L, [12-24]C" );
75+
76+
77+ /* Subtest #1 */
78+ a = make_irange (0 ,10 ,IR_COMPLETE );
79+ b = make_irange (12 ,20 ,IR_COMPLETE );
80+ union_result = irange_list_union (list_make1_irange (a ),
81+ list_make1_irange (b ));
82+
83+ assert_string_equal (rangeset_print (union_result ),
84+ "[0-10]C, [12-20]C" );
85+
86+ /* Subtest #2 */
87+ a = make_irange (0 ,10 ,IR_LOSSY );
88+ b = make_irange (11 ,20 ,IR_LOSSY );
89+ union_result = irange_list_union (list_make1_irange (a ),
90+ list_make1_irange (b ));
91+
92+ assert_string_equal (rangeset_print (union_result ),
93+ "[0-20]L" );
94+
6995}
7096
7197/* Lossy IndexRange covers complete IndexRange */
@@ -184,3 +210,70 @@ test_irange_list_union_complete_cov(void **state)
184210assert_string_equal (rangeset_print (union_result ),
185211"[0-100]C" );
186212}
213+
214+ static void
215+ test_irange_list_union_intersection (void * * state )
216+ {
217+ IndexRange a ,b ;
218+ List * unmerged ,
219+ * union_result ;
220+
221+
222+ /* Subtest #0 */
223+ a = make_irange (0 ,55 ,IR_COMPLETE );
224+ b = make_irange (55 ,100 ,IR_COMPLETE );
225+ union_result = irange_list_union (list_make1_irange (a ),
226+ list_make1_irange (b ));
227+
228+ assert_string_equal (rangeset_print (union_result ),
229+ "[0-100]C" );
230+
231+ /* Subtest #1 */
232+ a = make_irange (0 ,55 ,IR_COMPLETE );
233+ b = make_irange (55 ,100 ,IR_LOSSY );
234+ union_result = irange_list_union (list_make1_irange (a ),
235+ list_make1_irange (b ));
236+
237+ assert_string_equal (rangeset_print (union_result ),
238+ "[0-55]C, [56-100]L" );
239+
240+ /* Subtest #2 */
241+ unmerged = NIL ;
242+ unmerged = lappend_irange (unmerged ,make_irange (0 ,45 ,IR_LOSSY ));
243+ unmerged = lappend_irange (unmerged ,make_irange (100 ,100 ,IR_LOSSY ));
244+ b = make_irange (40 ,65 ,IR_COMPLETE );
245+ union_result = irange_list_union (unmerged ,list_make1_irange (b ));
246+
247+ assert_string_equal (rangeset_print (union_result ),
248+ "[0-39]L, [40-65]C, 100L" );
249+
250+ /* Subtest #3 */
251+ unmerged = NIL ;
252+ unmerged = lappend_irange (unmerged ,make_irange (0 ,45 ,IR_LOSSY ));
253+ unmerged = lappend_irange (unmerged ,make_irange (64 ,100 ,IR_LOSSY ));
254+ b = make_irange (40 ,65 ,IR_COMPLETE );
255+ union_result = irange_list_union (unmerged ,list_make1_irange (b ));
256+
257+ assert_string_equal (rangeset_print (union_result ),
258+ "[0-39]L, [40-65]C, [66-100]L" );
259+
260+ /* Subtest #4 */
261+ unmerged = NIL ;
262+ unmerged = lappend_irange (unmerged ,make_irange (0 ,45 ,IR_COMPLETE ));
263+ unmerged = lappend_irange (unmerged ,make_irange (64 ,100 ,IR_COMPLETE ));
264+ b = make_irange (40 ,65 ,IR_COMPLETE );
265+ union_result = irange_list_union (unmerged ,list_make1_irange (b ));
266+
267+ assert_string_equal (rangeset_print (union_result ),
268+ "[0-100]C" );
269+
270+ /* Subtest #5 */
271+ unmerged = NIL ;
272+ unmerged = lappend_irange (unmerged ,make_irange (0 ,45 ,IR_COMPLETE ));
273+ unmerged = lappend_irange (unmerged ,make_irange (64 ,100 ,IR_COMPLETE ));
274+ b = make_irange (40 ,65 ,IR_LOSSY );
275+ union_result = irange_list_union (unmerged ,list_make1_irange (b ));
276+
277+ assert_string_equal (rangeset_print (union_result ),
278+ "[0-45]C, [46-63]L, [64-100]C" );
279+ }