2 * Copyright © 2013 Google, Inc.
4 * This is part of HarfBuzz, a text shaping library.
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24 * Google Author(s): Behdad Esfahbod
29 /* Unit tests for hb-set.h */
33 test_empty (hb_set_t *s)
36 g_assert_cmpint (hb_set_get_population (s), ==, 0);
37 g_assert_cmpint (hb_set_get_min (s), ==, HB_SET_VALUE_INVALID);
38 g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
39 g_assert (!hb_set_has (s, 13));
41 g_assert (!hb_set_next (s, &next));
42 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
44 g_assert (!hb_set_previous (s, &next));
45 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
46 g_assert (hb_set_is_empty (s));
50 test_not_empty (hb_set_t *s)
53 g_assert_cmpint (hb_set_get_population (s), !=, 0);
54 g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID);
55 g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID);
56 next = HB_SET_VALUE_INVALID;
57 g_assert (hb_set_next (s, &next));
58 g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
59 next = HB_SET_VALUE_INVALID;
60 g_assert (hb_set_previous (s, &next));
61 g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
67 hb_set_t *s = hb_set_create ();
76 hb_set_add (s, 33000);
80 hb_set_add_range (s, 10, 29);
82 g_assert (hb_set_has (s, 13));
83 g_assert_cmpint (hb_set_get_population (s), ==, 20);
84 g_assert_cmpint (hb_set_get_min (s), ==, 10);
85 g_assert_cmpint (hb_set_get_max (s), ==, 29);
88 g_assert (hb_set_has (s, 13));
89 g_assert_cmpint (hb_set_get_population (s), ==, 20);
90 g_assert_cmpint (hb_set_get_min (s), ==, 10);
91 g_assert_cmpint (hb_set_get_max (s), ==, 29);
93 hb_set_del_range (s, 10, 18);
95 g_assert (!hb_set_has (s, 13));
97 hb_set_add_range (s, 200, 800);
99 g_assert (!hb_set_has (s, 100));
100 g_assert (!hb_set_has (s, 199));
101 g_assert (hb_set_has (s, 200));
102 g_assert (hb_set_has (s, 201));
103 g_assert (hb_set_has (s, 243));
104 g_assert (hb_set_has (s, 254));
105 g_assert (hb_set_has (s, 255));
106 g_assert (hb_set_has (s, 256));
107 g_assert (hb_set_has (s, 257));
108 g_assert (hb_set_has (s, 511));
109 g_assert (hb_set_has (s, 512));
110 g_assert (hb_set_has (s, 600));
111 g_assert (hb_set_has (s, 767));
112 g_assert (hb_set_has (s, 768));
113 g_assert (hb_set_has (s, 769));
114 g_assert (hb_set_has (s, 782));
115 g_assert (hb_set_has (s, 798));
116 g_assert (hb_set_has (s, 799));
117 g_assert (hb_set_has (s, 800));
118 g_assert (!hb_set_has (s, 801));
119 g_assert (!hb_set_has (s, 802));
122 g_assert (!hb_set_has (s, 800));
124 g_assert_cmpint (hb_set_get_max (s), ==, 799);
126 hb_set_del_range (s, 0, 799);
127 g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
133 // static inline void
134 // print_set (hb_set_t *s)
136 // hb_codepoint_t next;
138 // for (next = HB_SET_VALUE_INVALID; hb_set_next (s, &next); )
139 // printf ("%d, ", next);
143 static void test_set_intersect_empty (void)
145 hb_set_t* a = hb_set_create ();
146 hb_set_add (a, 3585);
147 hb_set_add (a, 21333);
148 hb_set_add (a, 24405);
150 hb_set_t* b = hb_set_create();
151 hb_set_add (b, 21483);
152 hb_set_add (b, 24064);
154 hb_set_intersect (a, b);
155 g_assert (hb_set_is_empty (a));
161 a = hb_set_create ();
162 hb_set_add (a, 16777216);
167 hb_set_intersect (a, b);
168 g_assert (hb_set_is_empty (a));
174 static void test_set_intersect_page_reduction (void)
176 hb_set_t* a = hb_set_create ();
177 hb_set_add (a, 3585);
178 hb_set_add (a, 21333);
179 hb_set_add (a, 24405);
181 hb_set_t* b = hb_set_create();
182 hb_set_add (b, 3585);
183 hb_set_add (b, 24405);
185 hb_set_intersect(a, b);
186 g_assert (hb_set_is_equal (a, b));
192 static void test_set_union (void)
194 hb_set_t* a = hb_set_create();
195 hb_set_add (a, 3585);
196 hb_set_add (a, 21333);
197 hb_set_add (a, 24405);
199 hb_set_t* b = hb_set_create();
200 hb_set_add (b, 21483);
201 hb_set_add (b, 24064);
203 hb_set_t* u = hb_set_create ();
204 hb_set_add (u, 3585);
205 hb_set_add (u, 21333);
206 hb_set_add (u, 21483);
207 hb_set_add (u, 24064);
208 hb_set_add (u, 24405);
211 g_assert (hb_set_is_equal (u, b));
219 test_set_subsets (void)
221 hb_set_t *s = hb_set_create ();
222 hb_set_t *l = hb_set_create ();
224 hb_set_add (l, 0x0FFFF);
225 hb_set_add (s, 0x1FFFF);
226 g_assert (!hb_set_is_subset (s, l));
229 hb_set_add (s, 0x0FFF0);
230 g_assert (!hb_set_is_subset (s, l));
233 hb_set_add (s, 0x0AFFF);
234 g_assert (!hb_set_is_subset (s, l));
237 g_assert (hb_set_is_subset (s, l));
240 g_assert (hb_set_is_subset (s, l));
242 hb_set_add (s, 0x1FFFF);
243 g_assert (!hb_set_is_subset (s, l));
246 hb_set_add (s, 0xFF);
247 hb_set_add (s, 0x1FFFF);
248 hb_set_add (s, 0x2FFFF);
250 hb_set_add (l, 0xFF);
251 hb_set_add (l, 0x1FFFF);
252 hb_set_add (l, 0x2FFFF);
254 g_assert (hb_set_is_subset (s, l));
255 hb_set_del (l, 0xFF);
256 g_assert (!hb_set_is_subset (s, l));
257 hb_set_add (l, 0xFF);
259 hb_set_del (l, 0x2FFFF);
260 g_assert (!hb_set_is_subset (s, l));
261 hb_set_add (l, 0x2FFFF);
263 hb_set_del (l, 0x1FFFF);
264 g_assert (!hb_set_is_subset (s, l));
271 test_set_algebra (void)
273 hb_set_t *s = hb_set_create ();
274 hb_set_t *o = hb_set_create ();
275 hb_set_t *o2 = hb_set_create ();
280 hb_set_add (o2, 0x660E);
283 g_assert (!hb_set_is_equal (s, o));
284 g_assert (hb_set_is_subset (s, o));
285 g_assert (!hb_set_is_subset (o, s));
287 g_assert (hb_set_is_equal (s, o));
288 g_assert (hb_set_is_subset (s, o));
289 g_assert (hb_set_is_subset (o, s));
291 g_assert_cmpint (hb_set_get_population (s), ==, 2);
296 g_assert_cmpint (hb_set_get_population (s), ==, 1);
298 g_assert_cmpint (hb_set_get_population (s), ==, 3);
299 g_assert (hb_set_has (s, 10));
300 g_assert (hb_set_has (s, 13));
304 g_assert_cmpint (hb_set_get_population (s), ==, 0);
305 hb_set_union (s, o2);
306 g_assert_cmpint (hb_set_get_population (s), ==, 1);
307 g_assert (hb_set_has (s, 0x660E));
311 hb_set_add_range (s, 10, 17);
312 g_assert (!hb_set_is_equal (s, o));
313 hb_set_intersect (s, o);
314 g_assert (!hb_set_is_equal (s, o));
316 g_assert_cmpint (hb_set_get_population (s), ==, 1);
317 g_assert (!hb_set_has (s, 10));
318 g_assert (hb_set_has (s, 13));
322 hb_set_add_range (s, 10, 17);
323 g_assert (!hb_set_is_equal (s, o));
324 hb_set_subtract (s, o);
325 g_assert (!hb_set_is_equal (s, o));
327 g_assert_cmpint (hb_set_get_population (s), ==, 7);
328 g_assert (hb_set_has (s, 12));
329 g_assert (!hb_set_has (s, 13));
330 g_assert (!hb_set_has (s, 19));
334 hb_set_add_range (s, 10, 17);
335 g_assert (!hb_set_is_equal (s, o));
336 hb_set_symmetric_difference (s, o);
337 g_assert (!hb_set_is_equal (s, o));
339 g_assert_cmpint (hb_set_get_population (s), ==, 8);
340 g_assert (hb_set_has (s, 12));
341 g_assert (!hb_set_has (s, 13));
342 g_assert (hb_set_has (s, 19));
344 /* https://github.com/harfbuzz/harfbuzz/issues/579 */
347 hb_set_add_range (s, 886, 895);
348 hb_set_add (s, 1024);
349 hb_set_add (s, 1152);
353 hb_set_add (o, 1024);
354 g_assert (!hb_set_is_equal (s, o));
355 hb_set_intersect (o, s);
357 g_assert (!hb_set_is_equal (s, o));
358 g_assert_cmpint (hb_set_get_population (o), ==, 2);
359 g_assert (hb_set_has (o, 889));
360 g_assert (hb_set_has (o, 1024));
363 hb_set_add_range (o, 887, 889);
364 hb_set_add (o, 1121);
365 g_assert (!hb_set_is_equal (s, o));
366 hb_set_intersect (o, s);
368 g_assert (!hb_set_is_equal (s, o));
369 g_assert_cmpint (hb_set_get_population (o), ==, 3);
370 g_assert (hb_set_has (o, 887));
371 g_assert (hb_set_has (o, 888));
372 g_assert (hb_set_has (o, 889));
376 hb_set_add_range (s, 886, 895);
377 hb_set_add (s, 1014);
378 hb_set_add (s, 1017);
379 hb_set_add (s, 1024);
380 hb_set_add (s, 1113);
381 hb_set_add (s, 1121);
382 g_assert_cmpint (hb_set_get_population (s), ==, 15);
387 g_assert_cmpint (hb_set_get_population (o), ==, 1);
388 hb_set_intersect (o, s);
389 g_assert_cmpint (hb_set_get_population (o), ==, 1);
390 g_assert (hb_set_has (o, 889));
393 g_assert_cmpint (hb_set_get_population (o), ==, 2);
394 hb_set_intersect (o, s);
395 g_assert_cmpint (hb_set_get_population (o), ==, 1);
396 g_assert (hb_set_has (o, 889));
406 hb_codepoint_t next, first, last;
407 hb_set_t *s = hb_set_create ();
410 hb_set_add_range (s, 6, 6);
411 hb_set_add_range (s, 10, 15);
412 hb_set_add (s, 1100);
413 hb_set_add (s, 1200);
414 hb_set_add (s, 20005);
418 next = HB_SET_VALUE_INVALID;
419 g_assert (hb_set_next (s, &next));
420 g_assert_cmpint (next, ==, 6);
421 g_assert (hb_set_next (s, &next));
422 g_assert_cmpint (next, ==, 10);
423 g_assert (hb_set_next (s, &next));
424 g_assert (hb_set_next (s, &next));
425 g_assert (hb_set_next (s, &next));
426 g_assert_cmpint (next, ==, 13);
427 g_assert (hb_set_next (s, &next));
428 g_assert (hb_set_next (s, &next));
429 g_assert_cmpint (next, ==, 15);
430 g_assert (hb_set_next (s, &next));
431 g_assert_cmpint (next, ==, 1100);
432 g_assert (hb_set_next (s, &next));
433 g_assert_cmpint (next, ==, 1200);
434 g_assert (hb_set_next (s, &next));
435 g_assert_cmpint (next, ==, 20005);
436 g_assert (!hb_set_next (s, &next));
437 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
439 next = HB_SET_VALUE_INVALID;
440 g_assert (hb_set_previous (s, &next));
441 g_assert_cmpint (next, ==, 20005);
442 g_assert (hb_set_previous (s, &next));
443 g_assert_cmpint (next, ==, 1200);
444 g_assert (hb_set_previous (s, &next));
445 g_assert_cmpint (next, ==, 1100);
446 g_assert (hb_set_previous (s, &next));
447 g_assert_cmpint (next, ==, 15);
448 g_assert (hb_set_previous (s, &next));
449 g_assert (hb_set_previous (s, &next));
450 g_assert_cmpint (next, ==, 13);
451 g_assert (hb_set_previous (s, &next));
452 g_assert (hb_set_previous (s, &next));
453 g_assert (hb_set_previous (s, &next));
454 g_assert_cmpint (next, ==, 10);
455 g_assert (hb_set_previous (s, &next));
456 g_assert_cmpint (next, ==, 6);
457 g_assert (!hb_set_previous (s, &next));
458 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
460 first = last = HB_SET_VALUE_INVALID;
461 g_assert (hb_set_next_range (s, &first, &last));
462 g_assert_cmpint (first, ==, 6);
463 g_assert_cmpint (last, ==, 6);
464 g_assert (hb_set_next_range (s, &first, &last));
465 g_assert_cmpint (first, ==, 10);
466 g_assert_cmpint (last, ==, 15);
467 g_assert (hb_set_next_range (s, &first, &last));
468 g_assert_cmpint (first, ==, 1100);
469 g_assert_cmpint (last, ==, 1100);
470 g_assert (hb_set_next_range (s, &first, &last));
471 g_assert_cmpint (first, ==, 1200);
472 g_assert_cmpint (last, ==, 1200);
473 g_assert (hb_set_next_range (s, &first, &last));
474 g_assert_cmpint (first, ==, 20005);
475 g_assert_cmpint (last, ==, 20005);
476 g_assert (!hb_set_next_range (s, &first, &last));
477 g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
478 g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
480 first = last = HB_SET_VALUE_INVALID;
481 g_assert (hb_set_previous_range (s, &first, &last));
482 g_assert_cmpint (first, ==, 20005);
483 g_assert_cmpint (last, ==, 20005);
484 g_assert (hb_set_previous_range (s, &first, &last));
485 g_assert_cmpint (first, ==, 1200);
486 g_assert_cmpint (last, ==, 1200);
487 g_assert (hb_set_previous_range (s, &first, &last));
488 g_assert_cmpint (first, ==, 1100);
489 g_assert_cmpint (last, ==, 1100);
490 g_assert (hb_set_previous_range (s, &first, &last));
491 g_assert_cmpint (first, ==, 10);
492 g_assert_cmpint (last, ==, 15);
493 g_assert (hb_set_previous_range (s, &first, &last));
494 g_assert_cmpint (first, ==, 6);
495 g_assert_cmpint (last, ==, 6);
496 g_assert (!hb_set_previous_range (s, &first, &last));
497 g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
498 g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
504 test_set_empty (void)
506 hb_set_t *b = hb_set_get_empty ();
508 g_assert (hb_set_get_empty ());
509 g_assert (hb_set_get_empty () == b);
511 g_assert (!hb_set_allocation_successful (b));
519 g_assert (!hb_set_allocation_successful (b));
525 g_assert (!hb_set_allocation_successful (b));
531 test_set_delrange (void)
533 const unsigned P = 512; /* Page size. */
534 struct { unsigned b, e; } ranges[] = {
535 { 35, P-15 }, /* From page middle thru middle. */
536 { P, P+100 }, /* From page start thru middle. */
537 { P+300, P*2-1 }, /* From page middle thru end. */
538 { P*3, P*4+100 }, /* From page start thru next page middle. */
539 { P*4+300, P*6-1 }, /* From page middle thru next page end. */
540 { P*6+200,P*8+100 }, /* From page middle covering one page thru page middle. */
541 { P*9, P*10+105 }, /* From page start covering one page thru page middle. */
542 { P*10+305, P*12-1 }, /* From page middle covering one page thru page end. */
543 { P*13, P*15-1 }, /* From page start covering two pages thru page end. */
544 { P*15+100, P*18+100 } /* From page middle covering two pages thru page middle. */
546 unsigned n = sizeof (ranges) / sizeof(ranges[0]);
548 hb_set_t *s = hb_set_create ();
551 for (unsigned int g = 0; g < ranges[n - 1].e + P; g += 2)
554 hb_set_add (s, P*2-1);
555 hb_set_add (s, P*6-1);
556 hb_set_add (s, P*12-1);
557 hb_set_add (s, P*15-1);
559 for (unsigned i = 0; i < n; i++)
560 hb_set_del_range (s, ranges[i].b, ranges[i].e);
562 hb_set_del_range (s, P*13+5, P*15-10); /* Deletion from deleted pages. */
564 for (unsigned i = 0; i < n; i++)
566 unsigned b = ranges[i].b;
567 unsigned e = ranges[i].e;
568 g_assert (hb_set_has (s, (b-2)&~1));
570 g_assert (!hb_set_has (s, b++));
571 g_assert (hb_set_has (s, (e+2)&~1));
577 static const unsigned max_set_elements = -1;
580 test_set_inverted_basics (void)
583 // add, del, has, get_population, is_empty, get_min, get_max
584 // for inverted sets.
585 hb_set_t *s = hb_set_create ();
588 g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
589 g_assert (hb_set_has (s, 0));
590 g_assert (hb_set_has (s, 13));
591 g_assert (hb_set_has (s, max_set_elements - 1));
592 g_assert (!hb_set_is_empty (s));
593 g_assert_cmpint (hb_set_get_min (s), ==, 0);
594 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
597 g_assert (!hb_set_has (s, 13));
598 g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 1);
599 g_assert_cmpint (hb_set_get_min (s), ==, 0);
600 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
603 g_assert (hb_set_has (s, 13));
604 g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
607 hb_set_del (s, max_set_elements - 1);
608 g_assert (!hb_set_has (s, 0));
609 g_assert (hb_set_has (s, 13));
610 g_assert (!hb_set_has (s, max_set_elements - 1));
611 g_assert (!hb_set_is_empty (s));
612 g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 2);
613 g_assert_cmpint (hb_set_get_min (s), ==, 1);
614 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 2);
620 test_set_inverted_ranges (void)
623 // add_range, del_range, has, get_population, is_empty, get_min, get_max
624 // for inverted sets.
625 hb_set_t *s = hb_set_create ();
628 hb_set_del_range (s, 41, 4000);
629 hb_set_add_range (s, 78, 601);
631 g_assert (hb_set_has (s, 40));
632 g_assert (!hb_set_has (s, 41));
633 g_assert (!hb_set_has (s, 64));
634 g_assert (!hb_set_has (s, 77));
635 g_assert (hb_set_has (s, 78));
636 g_assert (hb_set_has (s, 300));
637 g_assert (hb_set_has (s, 601));
638 g_assert (!hb_set_has (s, 602));
639 g_assert (!hb_set_has (s, 3000));
640 g_assert (!hb_set_has (s, 4000));
641 g_assert (hb_set_has (s, 4001));
643 g_assert (!hb_set_is_empty (s));
644 g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 3436);
645 g_assert_cmpint (hb_set_get_min (s), ==, 0);
646 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
648 hb_set_del_range (s, 0, 37);
649 g_assert (!hb_set_has (s, 0));
650 g_assert (!hb_set_has (s, 37));
651 g_assert (hb_set_has (s, 38));
652 g_assert (!hb_set_is_empty (s));
653 g_assert_cmpint (hb_set_get_population (s), ==,
654 max_set_elements - 3436 - 38);
655 g_assert_cmpint (hb_set_get_min (s), ==, 38);
656 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
658 hb_set_del_range (s, max_set_elements - 13, max_set_elements - 1);
659 g_assert (!hb_set_has (s, max_set_elements - 1));
660 g_assert (!hb_set_has (s, max_set_elements - 13));
661 g_assert (hb_set_has (s, max_set_elements - 14));
663 g_assert (!hb_set_is_empty (s));
664 g_assert_cmpint (hb_set_get_population (s), ==,
665 max_set_elements - 3436 - 38 - 13);
666 g_assert_cmpint (hb_set_get_min (s), ==, 38);
667 g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 14);
673 test_set_inverted_iteration_next (void)
677 hb_set_t *s = hb_set_create ();
680 hb_set_del_range (s, 41, 4000);
681 hb_set_add_range (s, 78, 601);
683 hb_codepoint_t cp = HB_SET_VALUE_INVALID;
684 hb_codepoint_t start = 0;
685 hb_codepoint_t end = 0;
686 g_assert (hb_set_next (s, &cp));
687 g_assert_cmpint (cp, ==, 0);
688 g_assert (hb_set_next (s, &cp));
689 g_assert_cmpint (cp, ==, 1);
691 g_assert (hb_set_next_range (s, &start, &end));
692 g_assert_cmpint (start, ==, 1);
693 g_assert_cmpint (end, ==, 40);
697 g_assert (hb_set_next_range (s, &start, &end));
698 g_assert_cmpint (start, ==, 78);
699 g_assert_cmpint (end, ==, 601);
703 g_assert (hb_set_next_range (s, &start, &end));
704 g_assert_cmpint (start, ==, 78);
705 g_assert_cmpint (end, ==, 601);
708 g_assert (hb_set_next (s, &cp));
709 g_assert_cmpint (cp, ==, 40);
711 g_assert (hb_set_next (s, &cp));
712 g_assert_cmpint (cp, ==, 78);
715 g_assert (hb_set_next (s, &cp));
716 g_assert_cmpint (cp, ==, 78);
719 g_assert (hb_set_next (s, &cp));
720 g_assert_cmpint (cp, ==, 79);
723 g_assert (hb_set_next (s, &cp));
724 g_assert_cmpint (cp, ==, 4001);
726 cp = HB_SET_VALUE_INVALID;
728 g_assert (hb_set_next (s, &cp));
729 g_assert_cmpint (cp, ==, 1);
733 g_assert (hb_set_next_range (s, &start, &end));
734 g_assert_cmpint (start, ==, 1);
735 g_assert_cmpint (end, ==, 40);
737 cp = max_set_elements - 1;
738 g_assert (!hb_set_next (s, &cp));
739 g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
743 g_assert (hb_set_next_range (s, &start, &end));
744 g_assert_cmpint (start, ==, 4001);
745 g_assert_cmpint (end, ==, max_set_elements - 1);
747 start = max_set_elements - 1;
748 end = max_set_elements - 1;
749 g_assert (!hb_set_next_range (s, &start, &end));
750 g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
751 g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
753 cp = max_set_elements - 3;
754 hb_set_del (s, max_set_elements - 1);
755 g_assert (hb_set_next (s, &cp));
756 g_assert_cmpint (cp, ==, max_set_elements - 2);
757 g_assert (!hb_set_next (s, &cp));
758 g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
761 start = max_set_elements - 2;
762 end = max_set_elements - 2;
763 g_assert (!hb_set_next_range (s, &start, &end));
764 g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
765 g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
767 start = max_set_elements - 3;
768 end = max_set_elements - 3;
769 g_assert (hb_set_next_range (s, &start, &end));
770 g_assert_cmpint (start, ==, max_set_elements - 2);
771 g_assert_cmpint (end, ==, max_set_elements - 2);
777 test_set_inverted_iteration_prev (void)
780 // previous, previous_range
781 hb_set_t *s = hb_set_create ();
784 hb_set_del_range (s, 41, 4000);
785 hb_set_add_range (s, 78, 601);
787 hb_codepoint_t cp = HB_SET_VALUE_INVALID;
788 hb_codepoint_t start = max_set_elements - 1;
789 hb_codepoint_t end = max_set_elements - 1;
790 g_assert (hb_set_previous (s, &cp));
791 g_assert_cmpint (cp, ==, max_set_elements - 1);
792 g_assert (hb_set_previous (s, &cp));
793 g_assert_cmpint (cp, ==, max_set_elements - 2);
795 g_assert (hb_set_previous_range (s, &start, &end));
796 g_assert_cmpint (start, ==, 4001);
797 g_assert_cmpint (end, ==, max_set_elements - 2);
801 g_assert (hb_set_previous_range (s, &start, &end));
802 g_assert_cmpint (start, ==, 78);
803 g_assert_cmpint (end, ==, 601);
807 g_assert (hb_set_previous_range (s, &start, &end));
808 g_assert_cmpint (start, ==, 78);
809 g_assert_cmpint (end, ==, 601);
812 g_assert (hb_set_previous (s, &cp));
813 g_assert_cmpint (cp, ==, 4001);
815 g_assert (hb_set_previous (s, &cp));
816 g_assert_cmpint (cp, ==, 601);
819 g_assert (hb_set_previous (s, &cp));
820 g_assert_cmpint (cp, ==, 601);
823 g_assert (hb_set_previous (s, &cp));
824 g_assert_cmpint (cp, ==, 600);
827 g_assert (hb_set_previous (s, &cp));
828 g_assert_cmpint (cp, ==, 40);
830 cp = HB_SET_VALUE_INVALID;
831 hb_set_del (s, max_set_elements - 1);
832 g_assert (hb_set_previous (s, &cp));
833 g_assert_cmpint (cp, ==, max_set_elements - 2);
835 start = max_set_elements - 1;
836 end = max_set_elements - 1;
837 g_assert (hb_set_previous_range (s, &start, &end));
838 g_assert_cmpint (start, ==, 4001);
839 g_assert_cmpint (end, ==, max_set_elements - 2);
842 g_assert (!hb_set_previous (s, &cp));
843 g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
846 g_assert (hb_set_previous (s, &cp));
847 g_assert_cmpint (cp, ==, 39);
851 g_assert (hb_set_previous_range (s, &start, &end));
852 g_assert_cmpint (start, ==, 0);
853 g_assert_cmpint (end, ==, 39);
857 g_assert (!hb_set_previous_range (s, &start, &end));
858 g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
859 g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
864 g_assert (hb_set_previous (s, &cp));
865 g_assert_cmpint (cp, ==, 1);
866 g_assert (!hb_set_previous (s, &cp));
867 g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
871 g_assert (!hb_set_previous_range (s, &start, &end));
872 g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
873 g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
877 g_assert (hb_set_previous_range (s, &start, &end));
878 g_assert_cmpint (start, ==, 1);
879 g_assert_cmpint (end, ==, 1);
886 test_set_inverted_equality (void)
888 hb_set_t *a = hb_set_create ();
889 hb_set_t *b = hb_set_create ();
893 g_assert (hb_set_is_equal (a, b));
894 g_assert (hb_set_is_equal (b, a));
897 g_assert (hb_set_is_equal (a, b));
898 g_assert (hb_set_is_equal (b, a));
901 g_assert (!hb_set_is_equal (a, b));
902 g_assert (!hb_set_is_equal (b, a));
905 g_assert (hb_set_is_equal (a, b));
906 g_assert (hb_set_is_equal (b, a));
908 hb_set_del_range (a, 43, 50);
909 hb_set_del_range (a, 51, 76);
910 hb_set_del_range (b, 43, 76);
911 g_assert (hb_set_is_equal (a, b));
912 g_assert (hb_set_is_equal (b, a));
915 g_assert (!hb_set_is_equal (a, b));
916 g_assert (!hb_set_is_equal (b, a));
919 g_assert (hb_set_is_equal (a, b));
920 g_assert (hb_set_is_equal (b, a));
922 hb_set_del (a, max_set_elements - 1);
923 g_assert (!hb_set_is_equal (a, b));
924 g_assert (!hb_set_is_equal (b, a));
926 hb_set_del (b, max_set_elements - 1);
927 g_assert (hb_set_is_equal (a, b));
928 g_assert (hb_set_is_equal (b, a));
931 g_assert (!hb_set_is_equal (a, b));
932 g_assert (!hb_set_is_equal (b, a));
935 g_assert (hb_set_is_equal (a, b));
936 g_assert (hb_set_is_equal (b, a));
950 static hb_set_t* prepare_set(hb_bool_t has_x,
955 static const hb_codepoint_t x = 13;
957 return hb_set_get_empty ();
959 hb_set_t* s = hb_set_create ();
960 if (inverted) hb_set_invert (s);
963 // Ensure a page exists for x.
964 inverted ? hb_set_del (s, x) : hb_set_add (s, x);
975 check_set_operations(hb_bool_t a_has_x,
976 hb_bool_t a_inverted,
977 hb_bool_t a_has_page,
980 hb_bool_t b_inverted,
981 hb_bool_t b_has_page,
985 hb_codepoint_t x = 13;
986 hb_set_t* a = prepare_set (a_has_x, a_inverted, a_has_page, a_is_null);
987 hb_set_t* b = prepare_set (b_has_x, b_inverted, b_has_page, b_is_null);
990 hb_bool_t has_expected;
991 hb_bool_t should_have_x;
997 should_have_x = (a_has_x || b_has_x) && !a_is_null;
999 has_expected = (hb_set_has (a, x) == should_have_x);
1002 op_name = "intersect";
1003 should_have_x = (a_has_x && b_has_x) && !a_is_null;
1004 hb_set_intersect (a, b);
1005 has_expected = (hb_set_has (a, x) == should_have_x);
1008 op_name = "subtract";
1009 should_have_x = (a_has_x && !b_has_x) && !a_is_null;
1010 hb_set_subtract (a, b);
1011 has_expected = (hb_set_has (a, x) == should_have_x);
1014 op_name = "sym_diff";
1015 should_have_x = (a_has_x ^ b_has_x) && !a_is_null;
1016 hb_set_symmetric_difference (a, b);
1017 has_expected = (hb_set_has (a, x) == should_have_x);
1021 printf ("%s%s%s%s %-9s %s%s%s%s == %s [%s]\n",
1022 a_inverted ? "i" : " ",
1023 a_has_page ? "p" : " ",
1024 a_is_null ? "n" : " ",
1025 a_has_x ? "{13}" : "{} ",
1027 b_inverted ? "i" : " ",
1028 b_has_page ? "p" : " ",
1029 b_is_null ? "n" : " ",
1030 b_has_x ? "{13}" : "{} ",
1031 should_have_x ? "{13}" : "{} ",
1032 has_expected ? "succeeded" : "failed");
1037 return has_expected;
1041 test_set_inverted_operations (void)
1043 hb_bool_t all_succeeded = 1;
1044 for (hb_bool_t a_has_x = 0; a_has_x <= 1; a_has_x++) {
1045 for (hb_bool_t a_inverted = 0; a_inverted <= 1; a_inverted++) {
1046 for (hb_bool_t b_has_x = 0; b_has_x <= 1; b_has_x++) {
1047 for (hb_bool_t b_inverted = 0; b_inverted <= 1; b_inverted++) {
1048 for (hb_bool_t a_has_page = 0; a_has_page <= !(a_has_x ^ a_inverted); a_has_page++) {
1049 for (hb_bool_t b_has_page = 0; b_has_page <= !(b_has_x ^ b_inverted); b_has_page++) {
1050 for (hb_bool_t a_is_null = 0; a_is_null <= (!a_has_x && !a_has_page && !a_inverted); a_is_null++) {
1051 for (hb_bool_t b_is_null = 0; b_is_null <= (!b_has_x && !b_has_page && !b_inverted); b_is_null++) {
1052 for (set_operation op = UNION; op < LAST; op++) {
1053 all_succeeded = check_set_operations (a_has_x, a_inverted, a_has_page, a_is_null,
1054 b_has_x, b_inverted, b_has_page, b_is_null,
1067 g_assert (all_succeeded);
1071 main (int argc, char **argv)
1073 hb_test_init (&argc, &argv);
1075 hb_test_add (test_set_basic);
1076 hb_test_add (test_set_subsets);
1077 hb_test_add (test_set_algebra);
1078 hb_test_add (test_set_iter);
1079 hb_test_add (test_set_empty);
1080 hb_test_add (test_set_delrange);
1082 hb_test_add (test_set_intersect_empty);
1083 hb_test_add (test_set_intersect_page_reduction);
1084 hb_test_add (test_set_union);
1086 hb_test_add (test_set_inverted_basics);
1087 hb_test_add (test_set_inverted_ranges);
1088 hb_test_add (test_set_inverted_iteration_next);
1089 hb_test_add (test_set_inverted_iteration_prev);
1090 hb_test_add (test_set_inverted_equality);
1091 hb_test_add (test_set_inverted_operations);
1093 return hb_test_run();