1 /* 2 * Copyright 2013 Google, Inc. 3 * 4 * This is part of HarfBuzz, a text shaping library. 5 * 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. 11 * 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 16 * DAMAGE. 17 * 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. 23 * 24 * Google Author(s): Behdad Esfahbod 25 */ 26 27 #include "hb-test.h" 28 29 /* Unit tests for hb-set.h */ 30 31 32 static void 33 test_empty (hb_set_t *s) 34 { 35 hb_codepoint_t next = HB_SET_VALUE_INVALID; 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)); 40 g_assert (!hb_set_next (s, &next)); 41 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID); 42 g_assert (hb_set_is_empty (s)); 43 } 44 45 static void 46 test_not_empty (hb_set_t *s) 47 { 48 hb_codepoint_t next = HB_SET_VALUE_INVALID; 49 g_assert_cmpint (hb_set_get_population (s), !=, 0); 50 g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID); 51 g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID); 52 g_assert (hb_set_next (s, &next)); 53 g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID); 54 } 55 56 static void 57 test_set_basic (void) 58 { 59 hb_set_t *s = hb_set_create (); 60 61 test_empty (s); 62 hb_set_add (s, 13); 63 test_not_empty (s); 64 65 hb_set_clear (s); 66 test_empty (s); 67 68 hb_set_add (s, 33000); 69 test_not_empty (s); 70 hb_set_clear (s); 71 72 hb_set_add_range (s, 10, 29); 73 test_not_empty (s); 74 g_assert (hb_set_has (s, 13)); 75 g_assert_cmpint (hb_set_get_population (s), ==, 20); 76 g_assert_cmpint (hb_set_get_min (s), ==, 10); 77 g_assert_cmpint (hb_set_get_max (s), ==, 29); 78 79 test_not_empty (s); 80 g_assert (hb_set_has (s, 13)); 81 g_assert_cmpint (hb_set_get_population (s), ==, 20); 82 g_assert_cmpint (hb_set_get_min (s), ==, 10); 83 g_assert_cmpint (hb_set_get_max (s), ==, 29); 84 85 hb_set_del_range (s, 10, 18); 86 test_not_empty (s); 87 g_assert (!hb_set_has (s, 13)); 88 89 hb_set_add_range (s, 200, 800); 90 test_not_empty (s); 91 g_assert (!hb_set_has (s, 100)); 92 g_assert (!hb_set_has (s, 199)); 93 g_assert (hb_set_has (s, 200)); 94 g_assert (hb_set_has (s, 201)); 95 g_assert (hb_set_has (s, 243)); 96 g_assert (hb_set_has (s, 254)); 97 g_assert (hb_set_has (s, 255)); 98 g_assert (hb_set_has (s, 256)); 99 g_assert (hb_set_has (s, 257)); 100 g_assert (hb_set_has (s, 511)); 101 g_assert (hb_set_has (s, 512)); 102 g_assert (hb_set_has (s, 600)); 103 g_assert (hb_set_has (s, 767)); 104 g_assert (hb_set_has (s, 768)); 105 g_assert (hb_set_has (s, 769)); 106 g_assert (hb_set_has (s, 782)); 107 g_assert (hb_set_has (s, 798)); 108 g_assert (hb_set_has (s, 799)); 109 g_assert (hb_set_has (s, 800)); 110 g_assert (!hb_set_has (s, 801)); 111 g_assert (!hb_set_has (s, 802)); 112 113 hb_set_destroy (s); 114 } 115 116 static inline void 117 print_set (hb_set_t *s) 118 { 119 hb_codepoint_t next; 120 printf ("{"); 121 for (next = HB_SET_VALUE_INVALID; hb_set_next (s, &next); ) 122 printf ("%d, ", next); 123 printf ("}\n"); 124 } 125 126 static void 127 test_set_algebra (void) 128 { 129 hb_set_t *s = hb_set_create (); 130 hb_set_t *o = hb_set_create (); 131 132 hb_set_add (o, 13); 133 hb_set_add (o, 19); 134 135 test_empty (s); 136 g_assert (!hb_set_is_equal (s, o)); 137 hb_set_set (s, o); 138 g_assert (hb_set_is_equal (s, o)); 139 test_not_empty (s); 140 g_assert_cmpint (hb_set_get_population (s), ==, 2); 141 142 hb_set_clear (s); 143 test_empty (s); 144 hb_set_add (s, 10); 145 g_assert_cmpint (hb_set_get_population (s), ==, 1); 146 hb_set_union (s, o); 147 g_assert_cmpint (hb_set_get_population (s), ==, 3); 148 g_assert (hb_set_has (s, 10)); 149 g_assert (hb_set_has (s, 13)); 150 151 hb_set_clear (s); 152 test_empty (s); 153 hb_set_add_range (s, 10, 17); 154 g_assert (!hb_set_is_equal (s, o)); 155 hb_set_intersect (s, o); 156 g_assert (!hb_set_is_equal (s, o)); 157 test_not_empty (s); 158 g_assert_cmpint (hb_set_get_population (s), ==, 1); 159 g_assert (!hb_set_has (s, 10)); 160 g_assert (hb_set_has (s, 13)); 161 162 hb_set_clear (s); 163 test_empty (s); 164 hb_set_add_range (s, 10, 17); 165 g_assert (!hb_set_is_equal (s, o)); 166 hb_set_subtract (s, o); 167 g_assert (!hb_set_is_equal (s, o)); 168 test_not_empty (s); 169 g_assert_cmpint (hb_set_get_population (s), ==, 7); 170 g_assert (hb_set_has (s, 12)); 171 g_assert (!hb_set_has (s, 13)); 172 g_assert (!hb_set_has (s, 19)); 173 174 hb_set_clear (s); 175 test_empty (s); 176 hb_set_add_range (s, 10, 17); 177 g_assert (!hb_set_is_equal (s, o)); 178 hb_set_symmetric_difference (s, o); 179 g_assert (!hb_set_is_equal (s, o)); 180 test_not_empty (s); 181 g_assert_cmpint (hb_set_get_population (s), ==, 8); 182 g_assert (hb_set_has (s, 12)); 183 g_assert (!hb_set_has (s, 13)); 184 g_assert (hb_set_has (s, 19)); 185 186 /* https://github.com/harfbuzz/harfbuzz/issues/579 */ 187 hb_set_clear (s); 188 test_empty (s); 189 hb_set_add_range (s, 886, 895); 190 hb_set_add (s, 1024); 191 hb_set_add (s, 1152); 192 hb_set_clear (o); 193 test_empty (o); 194 hb_set_add (o, 889); 195 hb_set_add (o, 1024); 196 g_assert (!hb_set_is_equal (s, o)); 197 hb_set_intersect (o, s); 198 test_not_empty (o); 199 g_assert (!hb_set_is_equal (s, o)); 200 g_assert_cmpint (hb_set_get_population (o), ==, 2); 201 g_assert (hb_set_has (o, 889)); 202 g_assert (hb_set_has (o, 1024)); 203 hb_set_clear (o); 204 test_empty (o); 205 hb_set_add_range (o, 887, 889); 206 hb_set_add (o, 1121); 207 g_assert (!hb_set_is_equal (s, o)); 208 hb_set_intersect (o, s); 209 test_not_empty (o); 210 g_assert (!hb_set_is_equal (s, o)); 211 g_assert_cmpint (hb_set_get_population (o), ==, 3); 212 g_assert (hb_set_has (o, 887)); 213 g_assert (hb_set_has (o, 888)); 214 g_assert (hb_set_has (o, 889)); 215 216 hb_set_clear (s); 217 test_empty (s); 218 hb_set_add_range (s, 886, 895); 219 hb_set_add (s, 1014); 220 hb_set_add (s, 1017); 221 hb_set_add (s, 1024); 222 hb_set_add (s, 1113); 223 hb_set_add (s, 1121); 224 g_assert_cmpint (hb_set_get_population (s), ==, 15); 225 226 hb_set_clear (o); 227 test_empty (o); 228 hb_set_add (o, 889); 229 g_assert_cmpint (hb_set_get_population (o), ==, 1); 230 hb_set_intersect (o, s); 231 g_assert_cmpint (hb_set_get_population (o), ==, 1); 232 g_assert (hb_set_has (o, 889)); 233 234 hb_set_destroy (s); 235 hb_set_destroy (o); 236 } 237 238 static void 239 test_set_iter (void) 240 { 241 hb_codepoint_t next, first, last; 242 hb_set_t *s = hb_set_create (); 243 244 hb_set_add (s, 13); 245 hb_set_add_range (s, 6, 6); 246 hb_set_add_range (s, 10, 15); 247 hb_set_add (s, 1100); 248 hb_set_add (s, 1200); 249 hb_set_add (s, 20005); 250 251 test_not_empty (s); 252 253 next = HB_SET_VALUE_INVALID; 254 g_assert (hb_set_next (s, &next)); 255 g_assert_cmpint (next, ==, 6); 256 g_assert (hb_set_next (s, &next)); 257 g_assert_cmpint (next, ==, 10); 258 g_assert (hb_set_next (s, &next)); 259 g_assert (hb_set_next (s, &next)); 260 g_assert (hb_set_next (s, &next)); 261 g_assert_cmpint (next, ==, 13); 262 g_assert (hb_set_next (s, &next)); 263 g_assert (hb_set_next (s, &next)); 264 g_assert_cmpint (next, ==, 15); 265 g_assert (hb_set_next (s, &next)); 266 g_assert_cmpint (next, ==, 1100); 267 g_assert (hb_set_next (s, &next)); 268 g_assert_cmpint (next, ==, 1200); 269 g_assert (hb_set_next (s, &next)); 270 g_assert_cmpint (next, ==, 20005); 271 g_assert (!hb_set_next (s, &next)); 272 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID); 273 274 first = last = HB_SET_VALUE_INVALID; 275 g_assert (hb_set_next_range (s, &first, &last)); 276 g_assert_cmpint (first, ==, 6); 277 g_assert_cmpint (last, ==, 6); 278 g_assert (hb_set_next_range (s, &first, &last)); 279 g_assert_cmpint (first, ==, 10); 280 g_assert_cmpint (last, ==, 15); 281 g_assert (hb_set_next_range (s, &first, &last)); 282 g_assert_cmpint (first, ==, 1100); 283 g_assert_cmpint (last, ==, 1100); 284 g_assert (hb_set_next_range (s, &first, &last)); 285 g_assert_cmpint (first, ==, 1200); 286 g_assert_cmpint (last, ==, 1200); 287 g_assert (hb_set_next_range (s, &first, &last)); 288 g_assert_cmpint (first, ==, 20005); 289 g_assert_cmpint (last, ==, 20005); 290 g_assert (!hb_set_next_range (s, &first, &last)); 291 g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID); 292 g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID); 293 294 hb_set_destroy (s); 295 } 296 297 static void 298 test_set_empty (void) 299 { 300 hb_set_t *b = hb_set_get_empty (); 301 302 g_assert (hb_set_get_empty ()); 303 g_assert (hb_set_get_empty () == b); 304 305 g_assert (!hb_set_allocation_successful (b)); 306 307 test_empty (b); 308 309 hb_set_add (b, 13); 310 311 test_empty (b); 312 313 hb_set_invert (b); 314 315 test_empty (b); 316 317 g_assert (!hb_set_allocation_successful (b)); 318 319 hb_set_clear (b); 320 321 test_empty (b); 322 323 g_assert (!hb_set_allocation_successful (b)); 324 325 hb_set_destroy (b); 326 } 327 328 int 329 main (int argc, char **argv) 330 { 331 hb_test_init (&argc, &argv); 332 333 hb_test_add (test_set_basic); 334 hb_test_add (test_set_algebra); 335 hb_test_add (test_set_iter); 336 hb_test_add (test_set_empty); 337 338 return hb_test_run(); 339 } 340