1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2013 Google, Inc.
3*2d1272b8SAndroid Build Coastguard Worker *
4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker *
6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker *
12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker *
18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker *
24*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
25*2d1272b8SAndroid Build Coastguard Worker */
26*2d1272b8SAndroid Build Coastguard Worker
27*2d1272b8SAndroid Build Coastguard Worker #include "hb-test.h"
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker /* Unit tests for hb-set.h */
30*2d1272b8SAndroid Build Coastguard Worker
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker static void
test_empty(hb_set_t * s)33*2d1272b8SAndroid Build Coastguard Worker test_empty (hb_set_t *s)
34*2d1272b8SAndroid Build Coastguard Worker {
35*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t next;
36*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 0);
37*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, HB_SET_VALUE_INVALID);
38*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
39*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 13));
40*2d1272b8SAndroid Build Coastguard Worker next = 53043;
41*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next (s, &next));
42*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
43*2d1272b8SAndroid Build Coastguard Worker next = 07734;
44*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous (s, &next));
45*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
46*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_empty (s));
47*2d1272b8SAndroid Build Coastguard Worker }
48*2d1272b8SAndroid Build Coastguard Worker
49*2d1272b8SAndroid Build Coastguard Worker static void
test_not_empty(hb_set_t * s)50*2d1272b8SAndroid Build Coastguard Worker test_not_empty (hb_set_t *s)
51*2d1272b8SAndroid Build Coastguard Worker {
52*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t next;
53*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), !=, 0);
54*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID);
55*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID);
56*2d1272b8SAndroid Build Coastguard Worker next = HB_SET_VALUE_INVALID;
57*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
58*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
59*2d1272b8SAndroid Build Coastguard Worker next = HB_SET_VALUE_INVALID;
60*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
61*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
62*2d1272b8SAndroid Build Coastguard Worker }
63*2d1272b8SAndroid Build Coastguard Worker
64*2d1272b8SAndroid Build Coastguard Worker static void
test_set_basic(void)65*2d1272b8SAndroid Build Coastguard Worker test_set_basic (void)
66*2d1272b8SAndroid Build Coastguard Worker {
67*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
70*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 13);
71*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
72*2d1272b8SAndroid Build Coastguard Worker
73*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
74*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
75*2d1272b8SAndroid Build Coastguard Worker
76*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 33000);
77*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
78*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
79*2d1272b8SAndroid Build Coastguard Worker
80*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 10, 29);
81*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
82*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
83*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 20);
84*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 10);
85*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, 29);
86*2d1272b8SAndroid Build Coastguard Worker
87*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
88*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
89*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 20);
90*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 10);
91*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, 29);
92*2d1272b8SAndroid Build Coastguard Worker
93*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 10, 18);
94*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
95*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 13));
96*2d1272b8SAndroid Build Coastguard Worker
97*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 200, 800);
98*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
99*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 100));
100*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 199));
101*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 200));
102*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 201));
103*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 243));
104*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 254));
105*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 255));
106*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 256));
107*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 257));
108*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 511));
109*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 512));
110*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 600));
111*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 767));
112*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 768));
113*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 769));
114*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 782));
115*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 798));
116*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 799));
117*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 800));
118*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 801));
119*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 802));
120*2d1272b8SAndroid Build Coastguard Worker
121*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, 800);
122*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 800));
123*2d1272b8SAndroid Build Coastguard Worker
124*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, 799);
125*2d1272b8SAndroid Build Coastguard Worker
126*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 0, 799);
127*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
128*2d1272b8SAndroid Build Coastguard Worker
129*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
130*2d1272b8SAndroid Build Coastguard Worker }
131*2d1272b8SAndroid Build Coastguard Worker
132*2d1272b8SAndroid Build Coastguard Worker
133*2d1272b8SAndroid Build Coastguard Worker // static inline void
134*2d1272b8SAndroid Build Coastguard Worker // print_set (hb_set_t *s)
135*2d1272b8SAndroid Build Coastguard Worker // {
136*2d1272b8SAndroid Build Coastguard Worker // hb_codepoint_t next;
137*2d1272b8SAndroid Build Coastguard Worker // printf ("{");
138*2d1272b8SAndroid Build Coastguard Worker // for (next = HB_SET_VALUE_INVALID; hb_set_next (s, &next); )
139*2d1272b8SAndroid Build Coastguard Worker // printf ("%d, ", next);
140*2d1272b8SAndroid Build Coastguard Worker // printf ("}\n");
141*2d1272b8SAndroid Build Coastguard Worker // }
142*2d1272b8SAndroid Build Coastguard Worker
test_set_intersect_empty(void)143*2d1272b8SAndroid Build Coastguard Worker static void test_set_intersect_empty (void)
144*2d1272b8SAndroid Build Coastguard Worker {
145*2d1272b8SAndroid Build Coastguard Worker hb_set_t* a = hb_set_create ();
146*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 3585);
147*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 21333);
148*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 24405);
149*2d1272b8SAndroid Build Coastguard Worker
150*2d1272b8SAndroid Build Coastguard Worker hb_set_t* b = hb_set_create();
151*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 21483);
152*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 24064);
153*2d1272b8SAndroid Build Coastguard Worker
154*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (a, b);
155*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_empty (a));
156*2d1272b8SAndroid Build Coastguard Worker
157*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
158*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
159*2d1272b8SAndroid Build Coastguard Worker
160*2d1272b8SAndroid Build Coastguard Worker
161*2d1272b8SAndroid Build Coastguard Worker a = hb_set_create ();
162*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 16777216);
163*2d1272b8SAndroid Build Coastguard Worker
164*2d1272b8SAndroid Build Coastguard Worker b = hb_set_create();
165*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 0);
166*2d1272b8SAndroid Build Coastguard Worker
167*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (a, b);
168*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_empty (a));
169*2d1272b8SAndroid Build Coastguard Worker
170*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
171*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
172*2d1272b8SAndroid Build Coastguard Worker }
173*2d1272b8SAndroid Build Coastguard Worker
test_set_intersect_page_reduction(void)174*2d1272b8SAndroid Build Coastguard Worker static void test_set_intersect_page_reduction (void)
175*2d1272b8SAndroid Build Coastguard Worker {
176*2d1272b8SAndroid Build Coastguard Worker hb_set_t* a = hb_set_create ();
177*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 3585);
178*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 21333);
179*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 24405);
180*2d1272b8SAndroid Build Coastguard Worker
181*2d1272b8SAndroid Build Coastguard Worker hb_set_t* b = hb_set_create();
182*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 3585);
183*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 24405);
184*2d1272b8SAndroid Build Coastguard Worker
185*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect(a, b);
186*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
187*2d1272b8SAndroid Build Coastguard Worker
188*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
189*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
190*2d1272b8SAndroid Build Coastguard Worker }
191*2d1272b8SAndroid Build Coastguard Worker
test_set_union(void)192*2d1272b8SAndroid Build Coastguard Worker static void test_set_union (void)
193*2d1272b8SAndroid Build Coastguard Worker {
194*2d1272b8SAndroid Build Coastguard Worker hb_set_t* a = hb_set_create();
195*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 3585);
196*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 21333);
197*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 24405);
198*2d1272b8SAndroid Build Coastguard Worker
199*2d1272b8SAndroid Build Coastguard Worker hb_set_t* b = hb_set_create();
200*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 21483);
201*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 24064);
202*2d1272b8SAndroid Build Coastguard Worker
203*2d1272b8SAndroid Build Coastguard Worker hb_set_t* u = hb_set_create ();
204*2d1272b8SAndroid Build Coastguard Worker hb_set_add (u, 3585);
205*2d1272b8SAndroid Build Coastguard Worker hb_set_add (u, 21333);
206*2d1272b8SAndroid Build Coastguard Worker hb_set_add (u, 21483);
207*2d1272b8SAndroid Build Coastguard Worker hb_set_add (u, 24064);
208*2d1272b8SAndroid Build Coastguard Worker hb_set_add (u, 24405);
209*2d1272b8SAndroid Build Coastguard Worker
210*2d1272b8SAndroid Build Coastguard Worker hb_set_union(b, a);
211*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (u, b));
212*2d1272b8SAndroid Build Coastguard Worker
213*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
214*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
215*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (u);
216*2d1272b8SAndroid Build Coastguard Worker }
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker static void
test_set_subsets(void)219*2d1272b8SAndroid Build Coastguard Worker test_set_subsets (void)
220*2d1272b8SAndroid Build Coastguard Worker {
221*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
222*2d1272b8SAndroid Build Coastguard Worker hb_set_t *l = hb_set_create ();
223*2d1272b8SAndroid Build Coastguard Worker
224*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0x0FFFF);
225*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x1FFFF);
226*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
227*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
228*2d1272b8SAndroid Build Coastguard Worker
229*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x0FFF0);
230*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
231*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
232*2d1272b8SAndroid Build Coastguard Worker
233*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x0AFFF);
234*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
235*2d1272b8SAndroid Build Coastguard Worker
236*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
237*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (s, l));
238*2d1272b8SAndroid Build Coastguard Worker
239*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (l);
240*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (s, l));
241*2d1272b8SAndroid Build Coastguard Worker
242*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x1FFFF);
243*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
244*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
245*2d1272b8SAndroid Build Coastguard Worker
246*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0xFF);
247*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x1FFFF);
248*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 0x2FFFF);
249*2d1272b8SAndroid Build Coastguard Worker
250*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0xFF);
251*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0x1FFFF);
252*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0x2FFFF);
253*2d1272b8SAndroid Build Coastguard Worker
254*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (s, l));
255*2d1272b8SAndroid Build Coastguard Worker hb_set_del (l, 0xFF);
256*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
257*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0xFF);
258*2d1272b8SAndroid Build Coastguard Worker
259*2d1272b8SAndroid Build Coastguard Worker hb_set_del (l, 0x2FFFF);
260*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
261*2d1272b8SAndroid Build Coastguard Worker hb_set_add (l, 0x2FFFF);
262*2d1272b8SAndroid Build Coastguard Worker
263*2d1272b8SAndroid Build Coastguard Worker hb_set_del (l, 0x1FFFF);
264*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (s, l));
265*2d1272b8SAndroid Build Coastguard Worker
266*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
267*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (l);
268*2d1272b8SAndroid Build Coastguard Worker }
269*2d1272b8SAndroid Build Coastguard Worker
270*2d1272b8SAndroid Build Coastguard Worker static void
test_set_algebra(void)271*2d1272b8SAndroid Build Coastguard Worker test_set_algebra (void)
272*2d1272b8SAndroid Build Coastguard Worker {
273*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
274*2d1272b8SAndroid Build Coastguard Worker hb_set_t *o = hb_set_create ();
275*2d1272b8SAndroid Build Coastguard Worker hb_set_t *o2 = hb_set_create ();
276*2d1272b8SAndroid Build Coastguard Worker
277*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 13);
278*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 19);
279*2d1272b8SAndroid Build Coastguard Worker
280*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o2, 0x660E);
281*2d1272b8SAndroid Build Coastguard Worker
282*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
283*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
284*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (s, o));
285*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_subset (o, s));
286*2d1272b8SAndroid Build Coastguard Worker hb_set_set (s, o);
287*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (s, o));
288*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (s, o));
289*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_subset (o, s));
290*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
291*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 2);
292*2d1272b8SAndroid Build Coastguard Worker
293*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
294*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
295*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 10);
296*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 1);
297*2d1272b8SAndroid Build Coastguard Worker hb_set_union (s, o);
298*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 3);
299*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 10));
300*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
301*2d1272b8SAndroid Build Coastguard Worker
302*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
303*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
304*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 0);
305*2d1272b8SAndroid Build Coastguard Worker hb_set_union (s, o2);
306*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 1);
307*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 0x660E));
308*2d1272b8SAndroid Build Coastguard Worker
309*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
310*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
311*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 10, 17);
312*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
313*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (s, o);
314*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
315*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
316*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 1);
317*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 10));
318*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
319*2d1272b8SAndroid Build Coastguard Worker
320*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
321*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
322*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 10, 17);
323*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
324*2d1272b8SAndroid Build Coastguard Worker hb_set_subtract (s, o);
325*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
326*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
327*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 7);
328*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 12));
329*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 13));
330*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 19));
331*2d1272b8SAndroid Build Coastguard Worker
332*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
333*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
334*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 10, 17);
335*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
336*2d1272b8SAndroid Build Coastguard Worker hb_set_symmetric_difference (s, o);
337*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
338*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
339*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 8);
340*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 12));
341*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 13));
342*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 19));
343*2d1272b8SAndroid Build Coastguard Worker
344*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/harfbuzz/harfbuzz/issues/579 */
345*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
346*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
347*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 886, 895);
348*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1024);
349*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1152);
350*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (o);
351*2d1272b8SAndroid Build Coastguard Worker test_empty (o);
352*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 889);
353*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 1024);
354*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
355*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (o, s);
356*2d1272b8SAndroid Build Coastguard Worker test_not_empty (o);
357*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
358*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 2);
359*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 889));
360*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 1024));
361*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (o);
362*2d1272b8SAndroid Build Coastguard Worker test_empty (o);
363*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (o, 887, 889);
364*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 1121);
365*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
366*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (o, s);
367*2d1272b8SAndroid Build Coastguard Worker test_not_empty (o);
368*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (s, o));
369*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 3);
370*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 887));
371*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 888));
372*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 889));
373*2d1272b8SAndroid Build Coastguard Worker
374*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (s);
375*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
376*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 886, 895);
377*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1014);
378*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1017);
379*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1024);
380*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1113);
381*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1121);
382*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, 15);
383*2d1272b8SAndroid Build Coastguard Worker
384*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (o);
385*2d1272b8SAndroid Build Coastguard Worker test_empty (o);
386*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 889);
387*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 1);
388*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (o, s);
389*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 1);
390*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 889));
391*2d1272b8SAndroid Build Coastguard Worker
392*2d1272b8SAndroid Build Coastguard Worker hb_set_add (o, 511);
393*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 2);
394*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (o, s);
395*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (o), ==, 1);
396*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (o, 889));
397*2d1272b8SAndroid Build Coastguard Worker
398*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
399*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (o);
400*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (o2);
401*2d1272b8SAndroid Build Coastguard Worker }
402*2d1272b8SAndroid Build Coastguard Worker
403*2d1272b8SAndroid Build Coastguard Worker static void
test_set_iter(void)404*2d1272b8SAndroid Build Coastguard Worker test_set_iter (void)
405*2d1272b8SAndroid Build Coastguard Worker {
406*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t next, first, last;
407*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
408*2d1272b8SAndroid Build Coastguard Worker
409*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 13);
410*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 6, 6);
411*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 10, 15);
412*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1100);
413*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 1200);
414*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 20005);
415*2d1272b8SAndroid Build Coastguard Worker
416*2d1272b8SAndroid Build Coastguard Worker test_not_empty (s);
417*2d1272b8SAndroid Build Coastguard Worker
418*2d1272b8SAndroid Build Coastguard Worker next = HB_SET_VALUE_INVALID;
419*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
420*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 6);
421*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
422*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 10);
423*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
424*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
425*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
426*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 13);
427*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
428*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
429*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 15);
430*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
431*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 1100);
432*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
433*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 1200);
434*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &next));
435*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 20005);
436*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next (s, &next));
437*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
438*2d1272b8SAndroid Build Coastguard Worker
439*2d1272b8SAndroid Build Coastguard Worker next = HB_SET_VALUE_INVALID;
440*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
441*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 20005);
442*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
443*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 1200);
444*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
445*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 1100);
446*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
447*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 15);
448*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
449*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
450*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 13);
451*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
452*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
453*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
454*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 10);
455*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &next));
456*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, 6);
457*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous (s, &next));
458*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
459*2d1272b8SAndroid Build Coastguard Worker
460*2d1272b8SAndroid Build Coastguard Worker first = last = HB_SET_VALUE_INVALID;
461*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &first, &last));
462*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 6);
463*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 6);
464*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &first, &last));
465*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 10);
466*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 15);
467*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &first, &last));
468*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 1100);
469*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 1100);
470*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &first, &last));
471*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 1200);
472*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 1200);
473*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &first, &last));
474*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 20005);
475*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 20005);
476*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next_range (s, &first, &last));
477*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
478*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
479*2d1272b8SAndroid Build Coastguard Worker
480*2d1272b8SAndroid Build Coastguard Worker first = last = HB_SET_VALUE_INVALID;
481*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &first, &last));
482*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 20005);
483*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 20005);
484*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &first, &last));
485*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 1200);
486*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 1200);
487*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &first, &last));
488*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 1100);
489*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 1100);
490*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &first, &last));
491*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 10);
492*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 15);
493*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &first, &last));
494*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, 6);
495*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, 6);
496*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous_range (s, &first, &last));
497*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
498*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
499*2d1272b8SAndroid Build Coastguard Worker
500*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
501*2d1272b8SAndroid Build Coastguard Worker }
502*2d1272b8SAndroid Build Coastguard Worker
503*2d1272b8SAndroid Build Coastguard Worker static void
test_set_empty(void)504*2d1272b8SAndroid Build Coastguard Worker test_set_empty (void)
505*2d1272b8SAndroid Build Coastguard Worker {
506*2d1272b8SAndroid Build Coastguard Worker hb_set_t *b = hb_set_get_empty ();
507*2d1272b8SAndroid Build Coastguard Worker
508*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_get_empty ());
509*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_get_empty () == b);
510*2d1272b8SAndroid Build Coastguard Worker
511*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_allocation_successful (b));
512*2d1272b8SAndroid Build Coastguard Worker
513*2d1272b8SAndroid Build Coastguard Worker test_empty (b);
514*2d1272b8SAndroid Build Coastguard Worker
515*2d1272b8SAndroid Build Coastguard Worker hb_set_add (b, 13);
516*2d1272b8SAndroid Build Coastguard Worker
517*2d1272b8SAndroid Build Coastguard Worker test_empty (b);
518*2d1272b8SAndroid Build Coastguard Worker
519*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_allocation_successful (b));
520*2d1272b8SAndroid Build Coastguard Worker
521*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (b);
522*2d1272b8SAndroid Build Coastguard Worker
523*2d1272b8SAndroid Build Coastguard Worker test_empty (b);
524*2d1272b8SAndroid Build Coastguard Worker
525*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_allocation_successful (b));
526*2d1272b8SAndroid Build Coastguard Worker
527*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
528*2d1272b8SAndroid Build Coastguard Worker }
529*2d1272b8SAndroid Build Coastguard Worker
530*2d1272b8SAndroid Build Coastguard Worker static void
test_set_delrange(void)531*2d1272b8SAndroid Build Coastguard Worker test_set_delrange (void)
532*2d1272b8SAndroid Build Coastguard Worker {
533*2d1272b8SAndroid Build Coastguard Worker const unsigned P = 512; /* Page size. */
534*2d1272b8SAndroid Build Coastguard Worker struct { unsigned b, e; } ranges[] = {
535*2d1272b8SAndroid Build Coastguard Worker { 35, P-15 }, /* From page middle thru middle. */
536*2d1272b8SAndroid Build Coastguard Worker { P, P+100 }, /* From page start thru middle. */
537*2d1272b8SAndroid Build Coastguard Worker { P+300, P*2-1 }, /* From page middle thru end. */
538*2d1272b8SAndroid Build Coastguard Worker { P*3, P*4+100 }, /* From page start thru next page middle. */
539*2d1272b8SAndroid Build Coastguard Worker { P*4+300, P*6-1 }, /* From page middle thru next page end. */
540*2d1272b8SAndroid Build Coastguard Worker { P*6+200,P*8+100 }, /* From page middle covering one page thru page middle. */
541*2d1272b8SAndroid Build Coastguard Worker { P*9, P*10+105 }, /* From page start covering one page thru page middle. */
542*2d1272b8SAndroid Build Coastguard Worker { P*10+305, P*12-1 }, /* From page middle covering one page thru page end. */
543*2d1272b8SAndroid Build Coastguard Worker { P*13, P*15-1 }, /* From page start covering two pages thru page end. */
544*2d1272b8SAndroid Build Coastguard Worker { P*15+100, P*18+100 } /* From page middle covering two pages thru page middle. */
545*2d1272b8SAndroid Build Coastguard Worker };
546*2d1272b8SAndroid Build Coastguard Worker unsigned n = sizeof (ranges) / sizeof(ranges[0]);
547*2d1272b8SAndroid Build Coastguard Worker
548*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
549*2d1272b8SAndroid Build Coastguard Worker
550*2d1272b8SAndroid Build Coastguard Worker test_empty (s);
551*2d1272b8SAndroid Build Coastguard Worker for (unsigned int g = 0; g < ranges[n - 1].e + P; g += 2)
552*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, g);
553*2d1272b8SAndroid Build Coastguard Worker
554*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, P*2-1);
555*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, P*6-1);
556*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, P*12-1);
557*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, P*15-1);
558*2d1272b8SAndroid Build Coastguard Worker
559*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < n; i++)
560*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, ranges[i].b, ranges[i].e);
561*2d1272b8SAndroid Build Coastguard Worker
562*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, P*13+5, P*15-10); /* Deletion from deleted pages. */
563*2d1272b8SAndroid Build Coastguard Worker
564*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < n; i++)
565*2d1272b8SAndroid Build Coastguard Worker {
566*2d1272b8SAndroid Build Coastguard Worker unsigned b = ranges[i].b;
567*2d1272b8SAndroid Build Coastguard Worker unsigned e = ranges[i].e;
568*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, (b-2)&~1));
569*2d1272b8SAndroid Build Coastguard Worker while (b <= e)
570*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, b++));
571*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, (e+2)&~1));
572*2d1272b8SAndroid Build Coastguard Worker }
573*2d1272b8SAndroid Build Coastguard Worker
574*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
575*2d1272b8SAndroid Build Coastguard Worker }
576*2d1272b8SAndroid Build Coastguard Worker
577*2d1272b8SAndroid Build Coastguard Worker static const unsigned max_set_elements = -1;
578*2d1272b8SAndroid Build Coastguard Worker
579*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_basics(void)580*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_basics (void)
581*2d1272b8SAndroid Build Coastguard Worker {
582*2d1272b8SAndroid Build Coastguard Worker // Tests:
583*2d1272b8SAndroid Build Coastguard Worker // add, del, has, get_population, is_empty, get_min, get_max
584*2d1272b8SAndroid Build Coastguard Worker // for inverted sets.
585*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
586*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (s);
587*2d1272b8SAndroid Build Coastguard Worker
588*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
589*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 0));
590*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
591*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, max_set_elements - 1));
592*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_empty (s));
593*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 0);
594*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
595*2d1272b8SAndroid Build Coastguard Worker
596*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, 13);
597*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 13));
598*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 1);
599*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 0);
600*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
601*2d1272b8SAndroid Build Coastguard Worker
602*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, 13);
603*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
604*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
605*2d1272b8SAndroid Build Coastguard Worker
606*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, 0);
607*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, max_set_elements - 1);
608*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 0));
609*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 13));
610*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, max_set_elements - 1));
611*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_empty (s));
612*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 2);
613*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 1);
614*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 2);
615*2d1272b8SAndroid Build Coastguard Worker
616*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
617*2d1272b8SAndroid Build Coastguard Worker }
618*2d1272b8SAndroid Build Coastguard Worker
619*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_ranges(void)620*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_ranges (void)
621*2d1272b8SAndroid Build Coastguard Worker {
622*2d1272b8SAndroid Build Coastguard Worker // Tests:
623*2d1272b8SAndroid Build Coastguard Worker // add_range, del_range, has, get_population, is_empty, get_min, get_max
624*2d1272b8SAndroid Build Coastguard Worker // for inverted sets.
625*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
626*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (s);
627*2d1272b8SAndroid Build Coastguard Worker
628*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 41, 4000);
629*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 78, 601);
630*2d1272b8SAndroid Build Coastguard Worker
631*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 40));
632*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 41));
633*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 64));
634*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 77));
635*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 78));
636*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 300));
637*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 601));
638*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 602));
639*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 3000));
640*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 4000));
641*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 4001));
642*2d1272b8SAndroid Build Coastguard Worker
643*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_empty (s));
644*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 3436);
645*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 0);
646*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
647*2d1272b8SAndroid Build Coastguard Worker
648*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 0, 37);
649*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 0));
650*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, 37));
651*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, 38));
652*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_empty (s));
653*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==,
654*2d1272b8SAndroid Build Coastguard Worker max_set_elements - 3436 - 38);
655*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 38);
656*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
657*2d1272b8SAndroid Build Coastguard Worker
658*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, max_set_elements - 13, max_set_elements - 1);
659*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, max_set_elements - 1));
660*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_has (s, max_set_elements - 13));
661*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (s, max_set_elements - 14));
662*2d1272b8SAndroid Build Coastguard Worker
663*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_empty (s));
664*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (s), ==,
665*2d1272b8SAndroid Build Coastguard Worker max_set_elements - 3436 - 38 - 13);
666*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_min (s), ==, 38);
667*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 14);
668*2d1272b8SAndroid Build Coastguard Worker
669*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
670*2d1272b8SAndroid Build Coastguard Worker }
671*2d1272b8SAndroid Build Coastguard Worker
672*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_iteration_next(void)673*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_iteration_next (void)
674*2d1272b8SAndroid Build Coastguard Worker {
675*2d1272b8SAndroid Build Coastguard Worker // Tests:
676*2d1272b8SAndroid Build Coastguard Worker // next, next_range
677*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
678*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (s);
679*2d1272b8SAndroid Build Coastguard Worker
680*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 41, 4000);
681*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 78, 601);
682*2d1272b8SAndroid Build Coastguard Worker
683*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t cp = HB_SET_VALUE_INVALID;
684*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t start = 0;
685*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t end = 0;
686*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
687*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 0);
688*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
689*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 1);
690*2d1272b8SAndroid Build Coastguard Worker
691*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
692*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 1);
693*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 40);
694*2d1272b8SAndroid Build Coastguard Worker
695*2d1272b8SAndroid Build Coastguard Worker start = 40;
696*2d1272b8SAndroid Build Coastguard Worker end = 40;
697*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
698*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 78);
699*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 601);
700*2d1272b8SAndroid Build Coastguard Worker
701*2d1272b8SAndroid Build Coastguard Worker start = 40;
702*2d1272b8SAndroid Build Coastguard Worker end = 57;
703*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
704*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 78);
705*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 601);
706*2d1272b8SAndroid Build Coastguard Worker
707*2d1272b8SAndroid Build Coastguard Worker cp = 39;
708*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
709*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 40);
710*2d1272b8SAndroid Build Coastguard Worker
711*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
712*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 78);
713*2d1272b8SAndroid Build Coastguard Worker
714*2d1272b8SAndroid Build Coastguard Worker cp = 56;
715*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
716*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 78);
717*2d1272b8SAndroid Build Coastguard Worker
718*2d1272b8SAndroid Build Coastguard Worker cp = 78;
719*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
720*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 79);
721*2d1272b8SAndroid Build Coastguard Worker
722*2d1272b8SAndroid Build Coastguard Worker cp = 601;
723*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
724*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 4001);
725*2d1272b8SAndroid Build Coastguard Worker
726*2d1272b8SAndroid Build Coastguard Worker cp = HB_SET_VALUE_INVALID;
727*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, 0);
728*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
729*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 1);
730*2d1272b8SAndroid Build Coastguard Worker
731*2d1272b8SAndroid Build Coastguard Worker start = 0;
732*2d1272b8SAndroid Build Coastguard Worker end = 0;
733*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
734*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 1);
735*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 40);
736*2d1272b8SAndroid Build Coastguard Worker
737*2d1272b8SAndroid Build Coastguard Worker cp = max_set_elements - 1;
738*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next (s, &cp));
739*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
740*2d1272b8SAndroid Build Coastguard Worker
741*2d1272b8SAndroid Build Coastguard Worker start = 4000;
742*2d1272b8SAndroid Build Coastguard Worker end = 4000;
743*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
744*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 4001);
745*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, max_set_elements - 1);
746*2d1272b8SAndroid Build Coastguard Worker
747*2d1272b8SAndroid Build Coastguard Worker start = max_set_elements - 1;
748*2d1272b8SAndroid Build Coastguard Worker end = max_set_elements - 1;
749*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next_range (s, &start, &end));
750*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
751*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
752*2d1272b8SAndroid Build Coastguard Worker
753*2d1272b8SAndroid Build Coastguard Worker cp = max_set_elements - 3;
754*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, max_set_elements - 1);
755*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next (s, &cp));
756*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, max_set_elements - 2);
757*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next (s, &cp));
758*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
759*2d1272b8SAndroid Build Coastguard Worker
760*2d1272b8SAndroid Build Coastguard Worker
761*2d1272b8SAndroid Build Coastguard Worker start = max_set_elements - 2;
762*2d1272b8SAndroid Build Coastguard Worker end = max_set_elements - 2;
763*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_next_range (s, &start, &end));
764*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
765*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
766*2d1272b8SAndroid Build Coastguard Worker
767*2d1272b8SAndroid Build Coastguard Worker start = max_set_elements - 3;
768*2d1272b8SAndroid Build Coastguard Worker end = max_set_elements - 3;
769*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_next_range (s, &start, &end));
770*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, max_set_elements - 2);
771*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, max_set_elements - 2);
772*2d1272b8SAndroid Build Coastguard Worker
773*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
774*2d1272b8SAndroid Build Coastguard Worker }
775*2d1272b8SAndroid Build Coastguard Worker
776*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_iteration_prev(void)777*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_iteration_prev (void)
778*2d1272b8SAndroid Build Coastguard Worker {
779*2d1272b8SAndroid Build Coastguard Worker // Tests:
780*2d1272b8SAndroid Build Coastguard Worker // previous, previous_range
781*2d1272b8SAndroid Build Coastguard Worker hb_set_t *s = hb_set_create ();
782*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (s);
783*2d1272b8SAndroid Build Coastguard Worker
784*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (s, 41, 4000);
785*2d1272b8SAndroid Build Coastguard Worker hb_set_add_range (s, 78, 601);
786*2d1272b8SAndroid Build Coastguard Worker
787*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t cp = HB_SET_VALUE_INVALID;
788*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t start = max_set_elements - 1;
789*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t end = max_set_elements - 1;
790*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
791*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, max_set_elements - 1);
792*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
793*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, max_set_elements - 2);
794*2d1272b8SAndroid Build Coastguard Worker
795*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
796*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 4001);
797*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, max_set_elements - 2);
798*2d1272b8SAndroid Build Coastguard Worker
799*2d1272b8SAndroid Build Coastguard Worker start = 4001;
800*2d1272b8SAndroid Build Coastguard Worker end = 4001;
801*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
802*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 78);
803*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 601);
804*2d1272b8SAndroid Build Coastguard Worker
805*2d1272b8SAndroid Build Coastguard Worker start = 2500;
806*2d1272b8SAndroid Build Coastguard Worker end = 3000;
807*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
808*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 78);
809*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 601);
810*2d1272b8SAndroid Build Coastguard Worker
811*2d1272b8SAndroid Build Coastguard Worker cp = 4002;
812*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
813*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 4001);
814*2d1272b8SAndroid Build Coastguard Worker
815*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
816*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 601);
817*2d1272b8SAndroid Build Coastguard Worker
818*2d1272b8SAndroid Build Coastguard Worker cp = 3500;
819*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
820*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 601);
821*2d1272b8SAndroid Build Coastguard Worker
822*2d1272b8SAndroid Build Coastguard Worker cp = 601;
823*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
824*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 600);
825*2d1272b8SAndroid Build Coastguard Worker
826*2d1272b8SAndroid Build Coastguard Worker cp = 78;
827*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
828*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 40);
829*2d1272b8SAndroid Build Coastguard Worker
830*2d1272b8SAndroid Build Coastguard Worker cp = HB_SET_VALUE_INVALID;
831*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, max_set_elements - 1);
832*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
833*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, max_set_elements - 2);
834*2d1272b8SAndroid Build Coastguard Worker
835*2d1272b8SAndroid Build Coastguard Worker start = max_set_elements - 1;
836*2d1272b8SAndroid Build Coastguard Worker end = max_set_elements - 1;
837*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
838*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 4001);
839*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, max_set_elements - 2);
840*2d1272b8SAndroid Build Coastguard Worker
841*2d1272b8SAndroid Build Coastguard Worker cp = 0;
842*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous (s, &cp));
843*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
844*2d1272b8SAndroid Build Coastguard Worker
845*2d1272b8SAndroid Build Coastguard Worker cp = 40;
846*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
847*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 39);
848*2d1272b8SAndroid Build Coastguard Worker
849*2d1272b8SAndroid Build Coastguard Worker start = 40;
850*2d1272b8SAndroid Build Coastguard Worker end = 40;
851*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
852*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 0);
853*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 39);
854*2d1272b8SAndroid Build Coastguard Worker
855*2d1272b8SAndroid Build Coastguard Worker start = 0;
856*2d1272b8SAndroid Build Coastguard Worker end = 0;
857*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous_range (s, &start, &end));
858*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
859*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
860*2d1272b8SAndroid Build Coastguard Worker
861*2d1272b8SAndroid Build Coastguard Worker
862*2d1272b8SAndroid Build Coastguard Worker cp = 2;
863*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, 0);
864*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous (s, &cp));
865*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, 1);
866*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous (s, &cp));
867*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
868*2d1272b8SAndroid Build Coastguard Worker
869*2d1272b8SAndroid Build Coastguard Worker start = 1;
870*2d1272b8SAndroid Build Coastguard Worker end = 1;
871*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_previous_range (s, &start, &end));
872*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
873*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
874*2d1272b8SAndroid Build Coastguard Worker
875*2d1272b8SAndroid Build Coastguard Worker start = 2;
876*2d1272b8SAndroid Build Coastguard Worker end = 2;
877*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_previous_range (s, &start, &end));
878*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (start, ==, 1);
879*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (end, ==, 1);
880*2d1272b8SAndroid Build Coastguard Worker
881*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (s);
882*2d1272b8SAndroid Build Coastguard Worker }
883*2d1272b8SAndroid Build Coastguard Worker
884*2d1272b8SAndroid Build Coastguard Worker
885*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_equality(void)886*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_equality (void)
887*2d1272b8SAndroid Build Coastguard Worker {
888*2d1272b8SAndroid Build Coastguard Worker hb_set_t *a = hb_set_create ();
889*2d1272b8SAndroid Build Coastguard Worker hb_set_t *b = hb_set_create ();
890*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (a);
891*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (b);
892*2d1272b8SAndroid Build Coastguard Worker
893*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
894*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
895*2d1272b8SAndroid Build Coastguard Worker
896*2d1272b8SAndroid Build Coastguard Worker hb_set_add (a, 10);
897*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
898*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
899*2d1272b8SAndroid Build Coastguard Worker
900*2d1272b8SAndroid Build Coastguard Worker hb_set_del (a, 42);
901*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (a, b));
902*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (b, a));
903*2d1272b8SAndroid Build Coastguard Worker
904*2d1272b8SAndroid Build Coastguard Worker hb_set_del (b, 42);
905*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
906*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
907*2d1272b8SAndroid Build Coastguard Worker
908*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (a, 43, 50);
909*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (a, 51, 76);
910*2d1272b8SAndroid Build Coastguard Worker hb_set_del_range (b, 43, 76);
911*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
912*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
913*2d1272b8SAndroid Build Coastguard Worker
914*2d1272b8SAndroid Build Coastguard Worker hb_set_del (a, 0);
915*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (a, b));
916*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (b, a));
917*2d1272b8SAndroid Build Coastguard Worker
918*2d1272b8SAndroid Build Coastguard Worker hb_set_del (b, 0);
919*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
920*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
921*2d1272b8SAndroid Build Coastguard Worker
922*2d1272b8SAndroid Build Coastguard Worker hb_set_del (a, max_set_elements - 1);
923*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (a, b));
924*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (b, a));
925*2d1272b8SAndroid Build Coastguard Worker
926*2d1272b8SAndroid Build Coastguard Worker hb_set_del (b, max_set_elements - 1);
927*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
928*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
929*2d1272b8SAndroid Build Coastguard Worker
930*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (a);
931*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (a, b));
932*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_set_is_equal (b, a));
933*2d1272b8SAndroid Build Coastguard Worker
934*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (b);
935*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (a, b));
936*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_is_equal (b, a));
937*2d1272b8SAndroid Build Coastguard Worker
938*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
939*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
940*2d1272b8SAndroid Build Coastguard Worker }
941*2d1272b8SAndroid Build Coastguard Worker
942*2d1272b8SAndroid Build Coastguard Worker typedef enum {
943*2d1272b8SAndroid Build Coastguard Worker UNION = 0,
944*2d1272b8SAndroid Build Coastguard Worker INTERSECT,
945*2d1272b8SAndroid Build Coastguard Worker SUBTRACT,
946*2d1272b8SAndroid Build Coastguard Worker SYM_DIFF,
947*2d1272b8SAndroid Build Coastguard Worker LAST,
948*2d1272b8SAndroid Build Coastguard Worker } set_operation;
949*2d1272b8SAndroid Build Coastguard Worker
prepare_set(hb_bool_t has_x,hb_bool_t inverted,hb_bool_t has_page,hb_bool_t is_null)950*2d1272b8SAndroid Build Coastguard Worker static hb_set_t* prepare_set(hb_bool_t has_x,
951*2d1272b8SAndroid Build Coastguard Worker hb_bool_t inverted,
952*2d1272b8SAndroid Build Coastguard Worker hb_bool_t has_page,
953*2d1272b8SAndroid Build Coastguard Worker hb_bool_t is_null)
954*2d1272b8SAndroid Build Coastguard Worker {
955*2d1272b8SAndroid Build Coastguard Worker static const hb_codepoint_t x = 13;
956*2d1272b8SAndroid Build Coastguard Worker if (is_null)
957*2d1272b8SAndroid Build Coastguard Worker return hb_set_get_empty ();
958*2d1272b8SAndroid Build Coastguard Worker
959*2d1272b8SAndroid Build Coastguard Worker hb_set_t* s = hb_set_create ();
960*2d1272b8SAndroid Build Coastguard Worker if (inverted) hb_set_invert (s);
961*2d1272b8SAndroid Build Coastguard Worker if (has_page)
962*2d1272b8SAndroid Build Coastguard Worker {
963*2d1272b8SAndroid Build Coastguard Worker // Ensure a page exists for x.
964*2d1272b8SAndroid Build Coastguard Worker inverted ? hb_set_del (s, x) : hb_set_add (s, x);
965*2d1272b8SAndroid Build Coastguard Worker }
966*2d1272b8SAndroid Build Coastguard Worker if (has_x)
967*2d1272b8SAndroid Build Coastguard Worker hb_set_add (s, x);
968*2d1272b8SAndroid Build Coastguard Worker else
969*2d1272b8SAndroid Build Coastguard Worker hb_set_del (s, x);
970*2d1272b8SAndroid Build Coastguard Worker
971*2d1272b8SAndroid Build Coastguard Worker return s;
972*2d1272b8SAndroid Build Coastguard Worker }
973*2d1272b8SAndroid Build Coastguard Worker
974*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
check_set_operations(hb_bool_t a_has_x,hb_bool_t a_inverted,hb_bool_t a_has_page,hb_bool_t a_is_null,hb_bool_t b_has_x,hb_bool_t b_inverted,hb_bool_t b_has_page,hb_bool_t b_is_null,set_operation op)975*2d1272b8SAndroid Build Coastguard Worker check_set_operations(hb_bool_t a_has_x,
976*2d1272b8SAndroid Build Coastguard Worker hb_bool_t a_inverted,
977*2d1272b8SAndroid Build Coastguard Worker hb_bool_t a_has_page,
978*2d1272b8SAndroid Build Coastguard Worker hb_bool_t a_is_null,
979*2d1272b8SAndroid Build Coastguard Worker hb_bool_t b_has_x,
980*2d1272b8SAndroid Build Coastguard Worker hb_bool_t b_inverted,
981*2d1272b8SAndroid Build Coastguard Worker hb_bool_t b_has_page,
982*2d1272b8SAndroid Build Coastguard Worker hb_bool_t b_is_null,
983*2d1272b8SAndroid Build Coastguard Worker set_operation op)
984*2d1272b8SAndroid Build Coastguard Worker {
985*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t x = 13;
986*2d1272b8SAndroid Build Coastguard Worker hb_set_t* a = prepare_set (a_has_x, a_inverted, a_has_page, a_is_null);
987*2d1272b8SAndroid Build Coastguard Worker hb_set_t* b = prepare_set (b_has_x, b_inverted, b_has_page, b_is_null);
988*2d1272b8SAndroid Build Coastguard Worker
989*2d1272b8SAndroid Build Coastguard Worker const char* op_name;
990*2d1272b8SAndroid Build Coastguard Worker hb_bool_t has_expected;
991*2d1272b8SAndroid Build Coastguard Worker hb_bool_t should_have_x;
992*2d1272b8SAndroid Build Coastguard Worker switch (op) {
993*2d1272b8SAndroid Build Coastguard Worker default:
994*2d1272b8SAndroid Build Coastguard Worker case LAST:
995*2d1272b8SAndroid Build Coastguard Worker case UNION:
996*2d1272b8SAndroid Build Coastguard Worker op_name = "union";
997*2d1272b8SAndroid Build Coastguard Worker should_have_x = (a_has_x || b_has_x) && !a_is_null;
998*2d1272b8SAndroid Build Coastguard Worker hb_set_union (a, b);
999*2d1272b8SAndroid Build Coastguard Worker has_expected = (hb_set_has (a, x) == should_have_x);
1000*2d1272b8SAndroid Build Coastguard Worker break;
1001*2d1272b8SAndroid Build Coastguard Worker case INTERSECT:
1002*2d1272b8SAndroid Build Coastguard Worker op_name = "intersect";
1003*2d1272b8SAndroid Build Coastguard Worker should_have_x = (a_has_x && b_has_x) && !a_is_null;
1004*2d1272b8SAndroid Build Coastguard Worker hb_set_intersect (a, b);
1005*2d1272b8SAndroid Build Coastguard Worker has_expected = (hb_set_has (a, x) == should_have_x);
1006*2d1272b8SAndroid Build Coastguard Worker break;
1007*2d1272b8SAndroid Build Coastguard Worker case SUBTRACT:
1008*2d1272b8SAndroid Build Coastguard Worker op_name = "subtract";
1009*2d1272b8SAndroid Build Coastguard Worker should_have_x = (a_has_x && !b_has_x) && !a_is_null;
1010*2d1272b8SAndroid Build Coastguard Worker hb_set_subtract (a, b);
1011*2d1272b8SAndroid Build Coastguard Worker has_expected = (hb_set_has (a, x) == should_have_x);
1012*2d1272b8SAndroid Build Coastguard Worker break;
1013*2d1272b8SAndroid Build Coastguard Worker case SYM_DIFF:
1014*2d1272b8SAndroid Build Coastguard Worker op_name = "sym_diff";
1015*2d1272b8SAndroid Build Coastguard Worker should_have_x = (a_has_x ^ b_has_x) && !a_is_null;
1016*2d1272b8SAndroid Build Coastguard Worker hb_set_symmetric_difference (a, b);
1017*2d1272b8SAndroid Build Coastguard Worker has_expected = (hb_set_has (a, x) == should_have_x);
1018*2d1272b8SAndroid Build Coastguard Worker break;
1019*2d1272b8SAndroid Build Coastguard Worker }
1020*2d1272b8SAndroid Build Coastguard Worker
1021*2d1272b8SAndroid Build Coastguard Worker printf ("%s%s%s%s %-9s %s%s%s%s == %s [%s]\n",
1022*2d1272b8SAndroid Build Coastguard Worker a_inverted ? "i" : " ",
1023*2d1272b8SAndroid Build Coastguard Worker a_has_page ? "p" : " ",
1024*2d1272b8SAndroid Build Coastguard Worker a_is_null ? "n" : " ",
1025*2d1272b8SAndroid Build Coastguard Worker a_has_x ? "{13}" : "{} ",
1026*2d1272b8SAndroid Build Coastguard Worker op_name,
1027*2d1272b8SAndroid Build Coastguard Worker b_inverted ? "i" : " ",
1028*2d1272b8SAndroid Build Coastguard Worker b_has_page ? "p" : " ",
1029*2d1272b8SAndroid Build Coastguard Worker b_is_null ? "n" : " ",
1030*2d1272b8SAndroid Build Coastguard Worker b_has_x ? "{13}" : "{} ",
1031*2d1272b8SAndroid Build Coastguard Worker should_have_x ? "{13}" : "{} ",
1032*2d1272b8SAndroid Build Coastguard Worker has_expected ? "succeeded" : "failed");
1033*2d1272b8SAndroid Build Coastguard Worker
1034*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (a);
1035*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (b);
1036*2d1272b8SAndroid Build Coastguard Worker
1037*2d1272b8SAndroid Build Coastguard Worker return has_expected;
1038*2d1272b8SAndroid Build Coastguard Worker }
1039*2d1272b8SAndroid Build Coastguard Worker
1040*2d1272b8SAndroid Build Coastguard Worker static void
test_set_inverted_operations(void)1041*2d1272b8SAndroid Build Coastguard Worker test_set_inverted_operations (void)
1042*2d1272b8SAndroid Build Coastguard Worker {
1043*2d1272b8SAndroid Build Coastguard Worker hb_bool_t all_succeeded = 1;
1044*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t a_has_x = 0; a_has_x <= 1; a_has_x++) {
1045*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t a_inverted = 0; a_inverted <= 1; a_inverted++) {
1046*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t b_has_x = 0; b_has_x <= 1; b_has_x++) {
1047*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t b_inverted = 0; b_inverted <= 1; b_inverted++) {
1048*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t a_has_page = 0; a_has_page <= !(a_has_x ^ a_inverted); a_has_page++) {
1049*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t b_has_page = 0; b_has_page <= !(b_has_x ^ b_inverted); b_has_page++) {
1050*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t a_is_null = 0; a_is_null <= (!a_has_x && !a_has_page && !a_inverted); a_is_null++) {
1051*2d1272b8SAndroid Build Coastguard Worker for (hb_bool_t b_is_null = 0; b_is_null <= (!b_has_x && !b_has_page && !b_inverted); b_is_null++) {
1052*2d1272b8SAndroid Build Coastguard Worker for (set_operation op = UNION; op < LAST; op++) {
1053*2d1272b8SAndroid Build Coastguard Worker all_succeeded = check_set_operations (a_has_x, a_inverted, a_has_page, a_is_null,
1054*2d1272b8SAndroid Build Coastguard Worker b_has_x, b_inverted, b_has_page, b_is_null,
1055*2d1272b8SAndroid Build Coastguard Worker op)
1056*2d1272b8SAndroid Build Coastguard Worker && all_succeeded;
1057*2d1272b8SAndroid Build Coastguard Worker }
1058*2d1272b8SAndroid Build Coastguard Worker }
1059*2d1272b8SAndroid Build Coastguard Worker }
1060*2d1272b8SAndroid Build Coastguard Worker }
1061*2d1272b8SAndroid Build Coastguard Worker }
1062*2d1272b8SAndroid Build Coastguard Worker }
1063*2d1272b8SAndroid Build Coastguard Worker }
1064*2d1272b8SAndroid Build Coastguard Worker }
1065*2d1272b8SAndroid Build Coastguard Worker }
1066*2d1272b8SAndroid Build Coastguard Worker
1067*2d1272b8SAndroid Build Coastguard Worker g_assert (all_succeeded);
1068*2d1272b8SAndroid Build Coastguard Worker }
1069*2d1272b8SAndroid Build Coastguard Worker
1070*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_set_add_sorted_array(void)1071*2d1272b8SAndroid Build Coastguard Worker test_hb_set_add_sorted_array (void)
1072*2d1272b8SAndroid Build Coastguard Worker {
1073*2d1272b8SAndroid Build Coastguard Worker hb_set_t *set = hb_set_create ();
1074*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t array[7] = {1, 2, 3, 1000, 2000, 2001, 2002};
1075*2d1272b8SAndroid Build Coastguard Worker hb_set_add_sorted_array (set, array, 7);
1076*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (hb_set_get_population (set), ==, 7);
1077*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 1));
1078*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 2));
1079*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 3));
1080*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 1000));
1081*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 2000));
1082*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 2001));
1083*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_has (set, 2002));
1084*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (set);
1085*2d1272b8SAndroid Build Coastguard Worker }
1086*2d1272b8SAndroid Build Coastguard Worker
1087*2d1272b8SAndroid Build Coastguard Worker static void
test_set_next_many(void)1088*2d1272b8SAndroid Build Coastguard Worker test_set_next_many (void)
1089*2d1272b8SAndroid Build Coastguard Worker {
1090*2d1272b8SAndroid Build Coastguard Worker hb_set_t *set = hb_set_create ();
1091*2d1272b8SAndroid Build Coastguard Worker for (unsigned i=0; i<600; i++)
1092*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, i);
1093*2d1272b8SAndroid Build Coastguard Worker for (unsigned i=6000; i<6100; i++)
1094*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, i);
1095*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_get_population (set) == 700);
1096*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t array[700];
1097*2d1272b8SAndroid Build Coastguard Worker
1098*2d1272b8SAndroid Build Coastguard Worker unsigned int n = hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 700);
1099*2d1272b8SAndroid Build Coastguard Worker
1100*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint(n, ==, 700);
1101*2d1272b8SAndroid Build Coastguard Worker for (unsigned i=0; i<600; i++)
1102*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[i], ==, i);
1103*2d1272b8SAndroid Build Coastguard Worker for (unsigned i=0; i<100; i++)
1104*2d1272b8SAndroid Build Coastguard Worker g_assert (array[600 + i] == 6000u + i);
1105*2d1272b8SAndroid Build Coastguard Worker
1106*2d1272b8SAndroid Build Coastguard Worker // Try skipping initial values.
1107*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < 700; i++)
1108*2d1272b8SAndroid Build Coastguard Worker array[i] = 0;
1109*2d1272b8SAndroid Build Coastguard Worker
1110*2d1272b8SAndroid Build Coastguard Worker n = hb_set_next_many (set, 42, array, 700);
1111*2d1272b8SAndroid Build Coastguard Worker
1112*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (n, ==, 657);
1113*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[0], ==, 43);
1114*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[n - 1], ==, 6099);
1115*2d1272b8SAndroid Build Coastguard Worker
1116*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (set);
1117*2d1272b8SAndroid Build Coastguard Worker }
1118*2d1272b8SAndroid Build Coastguard Worker
1119*2d1272b8SAndroid Build Coastguard Worker static void
test_set_next_many_restricted(void)1120*2d1272b8SAndroid Build Coastguard Worker test_set_next_many_restricted (void)
1121*2d1272b8SAndroid Build Coastguard Worker {
1122*2d1272b8SAndroid Build Coastguard Worker hb_set_t *set = hb_set_create ();
1123*2d1272b8SAndroid Build Coastguard Worker for (int i=0; i<600; i++)
1124*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, i);
1125*2d1272b8SAndroid Build Coastguard Worker for (int i=6000; i<6100; i++)
1126*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, i);
1127*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_set_get_population (set) == 700);
1128*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1129*2d1272b8SAndroid Build Coastguard Worker
1130*2d1272b8SAndroid Build Coastguard Worker hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 9);
1131*2d1272b8SAndroid Build Coastguard Worker
1132*2d1272b8SAndroid Build Coastguard Worker for (int i=0; i<9; i++)
1133*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[i], ==, i);
1134*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[9], ==, 0);
1135*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (set);
1136*2d1272b8SAndroid Build Coastguard Worker }
1137*2d1272b8SAndroid Build Coastguard Worker
1138*2d1272b8SAndroid Build Coastguard Worker static void
test_set_next_many_inverted(void)1139*2d1272b8SAndroid Build Coastguard Worker test_set_next_many_inverted (void)
1140*2d1272b8SAndroid Build Coastguard Worker {
1141*2d1272b8SAndroid Build Coastguard Worker hb_set_t *set = hb_set_create ();
1142*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, 1);
1143*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, 3);
1144*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (set);
1145*2d1272b8SAndroid Build Coastguard Worker
1146*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t array[] = {0, 0, 0, 0, 0, 999};
1147*2d1272b8SAndroid Build Coastguard Worker
1148*2d1272b8SAndroid Build Coastguard Worker // Single page.
1149*2d1272b8SAndroid Build Coastguard Worker hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 5);
1150*2d1272b8SAndroid Build Coastguard Worker
1151*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[0], ==, 0);
1152*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[1], ==, 2);
1153*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[2], ==, 4);
1154*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[3], ==, 5);
1155*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[4], ==, 6);
1156*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array[5], ==, 999);
1157*2d1272b8SAndroid Build Coastguard Worker
1158*2d1272b8SAndroid Build Coastguard Worker // Multiple pages.
1159*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (set);
1160*2d1272b8SAndroid Build Coastguard Worker hb_set_add (set, 1000);
1161*2d1272b8SAndroid Build Coastguard Worker hb_set_invert (set);
1162*2d1272b8SAndroid Build Coastguard Worker
1163*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t array2[1000];
1164*2d1272b8SAndroid Build Coastguard Worker hb_set_next_many (set, HB_SET_VALUE_INVALID, array2, 1000);
1165*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[0], ==, 0);
1166*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[1], ==, 2);
1167*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[2], ==, 4);
1168*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[3], ==, 5);
1169*2d1272b8SAndroid Build Coastguard Worker for (int i=4; i<997; i++)
1170*2d1272b8SAndroid Build Coastguard Worker {
1171*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[i], ==, i + 2);
1172*2d1272b8SAndroid Build Coastguard Worker }
1173*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[997], ==, 999);
1174*2d1272b8SAndroid Build Coastguard Worker // Value 1000 skipped.
1175*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[998], ==, 1001);
1176*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint (array2[999], ==, 1002);
1177*2d1272b8SAndroid Build Coastguard Worker
1178*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (set);
1179*2d1272b8SAndroid Build Coastguard Worker }
1180*2d1272b8SAndroid Build Coastguard Worker
1181*2d1272b8SAndroid Build Coastguard Worker static void
test_set_next_many_out_of_order_pages(void)1182*2d1272b8SAndroid Build Coastguard Worker test_set_next_many_out_of_order_pages (void) {
1183*2d1272b8SAndroid Build Coastguard Worker hb_set_t* set = hb_set_create();
1184*2d1272b8SAndroid Build Coastguard Worker hb_set_add(set, 1957);
1185*2d1272b8SAndroid Build Coastguard Worker hb_set_add(set, 69);
1186*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t results[2];
1187*2d1272b8SAndroid Build Coastguard Worker unsigned int result_size = hb_set_next_many(set, HB_SET_VALUE_INVALID, results, 2);
1188*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint(result_size, == , 2);
1189*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint(results[0], == , 69);
1190*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpint(results[1], == , 1957);
1191*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy(set);
1192*2d1272b8SAndroid Build Coastguard Worker }
1193*2d1272b8SAndroid Build Coastguard Worker
1194*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)1195*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
1196*2d1272b8SAndroid Build Coastguard Worker {
1197*2d1272b8SAndroid Build Coastguard Worker hb_test_init (&argc, &argv);
1198*2d1272b8SAndroid Build Coastguard Worker
1199*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_basic);
1200*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_subsets);
1201*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_algebra);
1202*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_iter);
1203*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_empty);
1204*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_delrange);
1205*2d1272b8SAndroid Build Coastguard Worker
1206*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_intersect_empty);
1207*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_intersect_page_reduction);
1208*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_union);
1209*2d1272b8SAndroid Build Coastguard Worker
1210*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_basics);
1211*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_ranges);
1212*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_iteration_next);
1213*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_iteration_prev);
1214*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_equality);
1215*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_inverted_operations);
1216*2d1272b8SAndroid Build Coastguard Worker
1217*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_set_add_sorted_array);
1218*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_next_many);
1219*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_next_many_restricted);
1220*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_next_many_inverted);
1221*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_set_next_many_out_of_order_pages);
1222*2d1272b8SAndroid Build Coastguard Worker
1223*2d1272b8SAndroid Build Coastguard Worker return hb_test_run();
1224*2d1272b8SAndroid Build Coastguard Worker }
1225