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 hb_set_invert (s); 80 test_not_empty (s); 81 g_assert (!hb_set_has (s, 13)); 82 g_assert_cmpint (hb_set_get_min (s), ==, 0); 83 84 hb_set_invert (s); 85 test_not_empty (s); 86 g_assert (hb_set_has (s, 13)); 87 g_assert_cmpint (hb_set_get_population (s), ==, 20); 88 g_assert_cmpint (hb_set_get_min (s), ==, 10); 89 g_assert_cmpint (hb_set_get_max (s), ==, 29); 90 91 hb_set_del_range (s, 10, 18); 92 test_not_empty (s); 93 g_assert (!hb_set_has (s, 13)); 94 95 hb_set_destroy (s); 96 } 97 98 static void 99 test_set_algebra (void) 100 { 101 hb_set_t *s = hb_set_create (); 102 hb_set_t *o = hb_set_create (); 103 104 hb_set_add (o, 13); 105 hb_set_add (o, 19); 106 107 test_empty (s); 108 g_assert (!hb_set_is_equal (s, o)); 109 hb_set_set (s, o); 110 g_assert (hb_set_is_equal (s, o)); 111 test_not_empty (s); 112 g_assert_cmpint (hb_set_get_population (s), ==, 2); 113 114 hb_set_clear (s); 115 test_empty (s); 116 hb_set_add (s, 10); 117 g_assert_cmpint (hb_set_get_population (s), ==, 1); 118 hb_set_union (s, o); 119 g_assert_cmpint (hb_set_get_population (s), ==, 3); 120 g_assert (hb_set_has (s, 10)); 121 g_assert (hb_set_has (s, 13)); 122 123 hb_set_clear (s); 124 test_empty (s); 125 hb_set_add_range (s, 10, 17); 126 g_assert (!hb_set_is_equal (s, o)); 127 hb_set_intersect (s, o); 128 g_assert (!hb_set_is_equal (s, o)); 129 test_not_empty (s); 130 g_assert_cmpint (hb_set_get_population (s), ==, 1); 131 g_assert (!hb_set_has (s, 10)); 132 g_assert (hb_set_has (s, 13)); 133 134 hb_set_clear (s); 135 test_empty (s); 136 hb_set_add_range (s, 10, 17); 137 g_assert (!hb_set_is_equal (s, o)); 138 hb_set_subtract (s, o); 139 g_assert (!hb_set_is_equal (s, o)); 140 test_not_empty (s); 141 g_assert_cmpint (hb_set_get_population (s), ==, 7); 142 g_assert (hb_set_has (s, 12)); 143 g_assert (!hb_set_has (s, 13)); 144 g_assert (!hb_set_has (s, 19)); 145 146 hb_set_clear (s); 147 test_empty (s); 148 hb_set_add_range (s, 10, 17); 149 g_assert (!hb_set_is_equal (s, o)); 150 hb_set_symmetric_difference (s, o); 151 g_assert (!hb_set_is_equal (s, o)); 152 test_not_empty (s); 153 g_assert_cmpint (hb_set_get_population (s), ==, 8); 154 g_assert (hb_set_has (s, 12)); 155 g_assert (!hb_set_has (s, 13)); 156 g_assert (hb_set_has (s, 19)); 157 158 hb_set_destroy (s); 159 } 160 161 static void 162 test_set_iter (void) 163 { 164 hb_codepoint_t next, first, last; 165 hb_set_t *s = hb_set_create (); 166 167 hb_set_add (s, 13); 168 hb_set_add_range (s, 6, 6); 169 hb_set_add_range (s, 10, 15); 170 hb_set_add (s, 20005); 171 172 test_not_empty (s); 173 174 next = HB_SET_VALUE_INVALID; 175 g_assert (hb_set_next (s, &next)); 176 g_assert_cmpint (next, ==, 6); 177 g_assert (hb_set_next (s, &next)); 178 g_assert_cmpint (next, ==, 10); 179 g_assert (hb_set_next (s, &next)); 180 g_assert (hb_set_next (s, &next)); 181 g_assert (hb_set_next (s, &next)); 182 g_assert_cmpint (next, ==, 13); 183 g_assert (hb_set_next (s, &next)); 184 g_assert (hb_set_next (s, &next)); 185 g_assert_cmpint (next, ==, 15); 186 g_assert (hb_set_next (s, &next)); 187 g_assert_cmpint (next, ==, 20005); 188 g_assert (!hb_set_next (s, &next)); 189 g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID); 190 191 first = last = HB_SET_VALUE_INVALID; 192 g_assert (hb_set_next_range (s, &first, &last)); 193 g_assert_cmpint (first, ==, 6); 194 g_assert_cmpint (last, ==, 6); 195 g_assert (hb_set_next_range (s, &first, &last)); 196 g_assert_cmpint (first, ==, 10); 197 g_assert_cmpint (last, ==, 15); 198 g_assert (hb_set_next_range (s, &first, &last)); 199 g_assert_cmpint (first, ==, 20005); 200 g_assert_cmpint (last, ==, 20005); 201 g_assert (!hb_set_next_range (s, &first, &last)); 202 g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID); 203 g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID); 204 205 hb_set_destroy (s); 206 } 207 208 static void 209 test_set_empty (void) 210 { 211 hb_set_t *b = hb_set_get_empty (); 212 213 g_assert (hb_set_get_empty ()); 214 g_assert (hb_set_get_empty () == b); 215 216 g_assert (!hb_set_allocation_successful (b)); 217 218 test_empty (b); 219 220 hb_set_add (b, 13); 221 222 test_empty (b); 223 224 hb_set_invert (b); 225 226 test_empty (b); 227 228 g_assert (!hb_set_allocation_successful (b)); 229 230 hb_set_clear (b); 231 232 test_empty (b); 233 234 g_assert (!hb_set_allocation_successful (b)); 235 236 hb_set_destroy (b); 237 } 238 239 int 240 main (int argc, char **argv) 241 { 242 hb_test_init (&argc, &argv); 243 244 hb_test_add (test_set_basic); 245 hb_test_add (test_set_algebra); 246 hb_test_add (test_set_iter); 247 hb_test_add (test_set_empty); 248 249 return hb_test_run(); 250 } 251