| File: | testsuite/ctk/bitmask.c |
| Warning: | line 44, column 8 Using a fixed address is not portable because that address will probably not be valid in all environments or platforms |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* CtkRBTree tests. | |||
| 2 | * | |||
| 3 | * Copyright (C) 2011, Red Hat, Inc. | |||
| 4 | * Authors: Benjamin Otte <otte@gnome.org> | |||
| 5 | * | |||
| 6 | * This library is free software; you can redistribute it and/or | |||
| 7 | * modify it under the terms of the GNU Lesser General Public | |||
| 8 | * License as published by the Free Software Foundation; either | |||
| 9 | * version 2 of the License, or (at your option) any later version. | |||
| 10 | * | |||
| 11 | * This library is distributed in the hope that it will be useful, | |||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| 14 | * Lesser General Public License for more details. | |||
| 15 | * | |||
| 16 | * You should have received a copy of the GNU Lesser General Public | |||
| 17 | * License along with this library. If not, see <http://www.gnu.org/licenses/>. | |||
| 18 | */ | |||
| 19 | ||||
| 20 | #include <locale.h> | |||
| 21 | ||||
| 22 | #include "../../ctk/ctkbitmaskprivate.h" | |||
| 23 | ||||
| 24 | #include <string.h> | |||
| 25 | ||||
| 26 | /* how often we run the random tests */ | |||
| 27 | #define N_RUNS20 20 | |||
| 28 | ||||
| 29 | /* how many tries we do in our random tests */ | |||
| 30 | #define N_TRIES100 100 | |||
| 31 | ||||
| 32 | /* the maximum index we use for bitmask values */ | |||
| 33 | #define MAX_INDEX1000 1000 | |||
| 34 | ||||
| 35 | /* UTILITIES */ | |||
| 36 | ||||
| 37 | static CtkBitmask * | |||
| 38 | ctk_bitmask_new_parse (const char *string) | |||
| 39 | { | |||
| 40 | guint i, length; | |||
| 41 | CtkBitmask *mask; | |||
| 42 | ||||
| 43 | length = strlen (string); | |||
| 44 | mask = _ctk_bitmask_new (); | |||
| ||||
| 45 | ||||
| 46 | for (i = 0; i < length; i++) | |||
| 47 | { | |||
| 48 | if (string[i] == '0') | |||
| 49 | mask = _ctk_bitmask_set (mask, length - i - 1, FALSE(0)); | |||
| 50 | else if (string[i] == '1') | |||
| 51 | mask = _ctk_bitmask_set (mask, length - i - 1, TRUE(!(0))); | |||
| 52 | else | |||
| 53 | g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "bitmask.c", 53, ((const char*) (__func__)), ((void*)0)); } while (0); | |||
| 54 | } | |||
| 55 | ||||
| 56 | return mask; | |||
| 57 | } | |||
| 58 | ||||
| 59 | #define assert_cmpmasks(mask,other)do { if ((!_ctk_bitmask_equals (mask, other))) { char *mask_string = _ctk_bitmask_to_string (mask); char *other_string = _ctk_bitmask_to_string (other); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "mask" , mask_string, "other", other_string); g_assertion_message (( (gchar*) 0), "bitmask.c", 59, ((const char*) (__func__)), msg ); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0) G_STMT_STARTdo { \ | |||
| 60 | if (G_UNLIKELY (!_ctk_bitmask_equals (mask, other))(!_ctk_bitmask_equals (mask, other))) \ | |||
| 61 | { \ | |||
| 62 | char *mask_string = _ctk_bitmask_to_string (mask); \ | |||
| 63 | char *other_string = _ctk_bitmask_to_string (other); \ | |||
| 64 | char *msg = g_strdup_printf ("%s (%s) != %s (%s)", \ | |||
| 65 | G_STRINGIFY (mask)"mask", mask_string, \ | |||
| 66 | G_STRINGIFY (other)"other", other_string); \ | |||
| 67 | g_assertion_message (G_LOG_DOMAIN((gchar*) 0), __FILE__"bitmask.c", __LINE__67, G_STRFUNC((const char*) (__func__)), msg); \ | |||
| 68 | g_free (msg); \ | |||
| 69 | g_free (mask_string); \ | |||
| 70 | g_free (other_string); \ | |||
| 71 | } \ | |||
| 72 | }G_STMT_ENDwhile (0) | |||
| 73 | ||||
| 74 | static const char *tests[] = { | |||
| 75 | "0", | |||
| 76 | "1", | |||
| 77 | "1000000000000000000000000000000", | |||
| 78 | "10000000000000000000000000000000", | |||
| 79 | "100000000000000000000000000000000000000000000000000000000000000", | |||
| 80 | "1000000000000000000000000000000000000000000000000000000000000000", | |||
| 81 | "10000000000000000000000000000000000000000000000000000000000000000", | |||
| 82 | "1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", | |||
| 83 | "1000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000", | |||
| 84 | "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" | |||
| 85 | }; | |||
| 86 | ||||
| 87 | static CtkBitmask *masks[G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0]))]; | |||
| 88 | ||||
| 89 | /* TEST */ | |||
| 90 | ||||
| 91 | static void | |||
| 92 | test_to_string (void) | |||
| 93 | { | |||
| 94 | guint i; | |||
| 95 | char *to_string; | |||
| 96 | ||||
| 97 | for (i = 0; i < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); i++) | |||
| 98 | { | |||
| 99 | to_string = _ctk_bitmask_to_string (masks[i]); | |||
| 100 | g_assert_cmpstr (to_string, ==, tests[i])do { const char *__s1 = (to_string), *__s2 = (tests[i]); if ( g_strcmp0 (__s1, __s2) == 0) ; else g_assertion_message_cmpstr (((gchar*) 0), "bitmask.c", 100, ((const char*) (__func__)), "to_string" " " "==" " " "tests[i]", __s1, "==", __s2); } while (0); | |||
| 101 | g_free (to_string); | |||
| 102 | } | |||
| 103 | } | |||
| 104 | ||||
| 105 | static void | |||
| 106 | test_is_empty (void) | |||
| 107 | { | |||
| 108 | guint i; | |||
| 109 | ||||
| 110 | for (i = 0; i < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); i++) | |||
| 111 | { | |||
| 112 | g_assert_cmpint (_ctk_bitmask_is_empty (masks[i]), ==, i == 0)do { gint64 __n1 = (_ctk_bitmask_is_empty (masks[i])), __n2 = (i == 0); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 112, ((const char*) (__func__)), "_ctk_bitmask_is_empty (masks[i])" " " "==" " " "i == 0", (guint64 )__n1, "==", (guint64)__n2, 'i'); } while (0); | |||
| 113 | } | |||
| 114 | } | |||
| 115 | ||||
| 116 | static void | |||
| 117 | test_equals (void) | |||
| 118 | { | |||
| 119 | guint i, j; | |||
| 120 | ||||
| 121 | for (i = 0; i < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); i++) | |||
| 122 | { | |||
| 123 | for (j = 0; j < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); j++) | |||
| 124 | { | |||
| 125 | g_assert_cmpint (_ctk_bitmask_equals (masks[i], masks[j]), ==, i == j)do { gint64 __n1 = (_ctk_bitmask_equals (masks[i], masks[j])) , __n2 = (i == j); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 125, ((const char*) (__func__)), "_ctk_bitmask_equals (masks[i], masks[j])" " " "==" " " "i == j" , (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0); | |||
| 126 | } | |||
| 127 | } | |||
| 128 | } | |||
| 129 | ||||
| 130 | static void | |||
| 131 | test_set (void) | |||
| 132 | { | |||
| 133 | guint i, j; | |||
| 134 | guint indexes[N_TRIES100]; | |||
| 135 | CtkBitmask *copy; | |||
| 136 | const CtkBitmask *mask; | |||
| 137 | ||||
| 138 | for (i = 0; i < N_RUNS20; i++) | |||
| 139 | { | |||
| 140 | mask = masks[g_test_rand_int_range (0, G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])))]; | |||
| 141 | copy = _ctk_bitmask_copy (mask); | |||
| 142 | ||||
| 143 | for (j = 0; j < N_TRIES100; j++) | |||
| 144 | { | |||
| 145 | indexes[j] = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 146 | copy = _ctk_bitmask_set (copy, indexes[j], g_test_rand_bit ()(0 != (g_test_rand_int() & (1 << 15)))); | |||
| 147 | } | |||
| 148 | ||||
| 149 | for (j = 0; j < N_TRIES100; j++) | |||
| 150 | { | |||
| 151 | copy = _ctk_bitmask_set (copy, indexes[j], _ctk_bitmask_get (mask, indexes[j])); | |||
| 152 | } | |||
| 153 | ||||
| 154 | assert_cmpmasks (copy, mask)do { if ((!_ctk_bitmask_equals (copy, mask))) { char *mask_string = _ctk_bitmask_to_string (copy); char *other_string = _ctk_bitmask_to_string (mask); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "copy" , mask_string, "mask", other_string); g_assertion_message ((( gchar*) 0), "bitmask.c", 154, ((const char*) (__func__)), msg ); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0); | |||
| 155 | _ctk_bitmask_free (copy); | |||
| 156 | } | |||
| 157 | } | |||
| 158 | ||||
| 159 | static void | |||
| 160 | test_union (void) | |||
| 161 | { | |||
| 162 | CtkBitmask *left, *right, *expected; | |||
| 163 | guint run, try, n_tries; | |||
| 164 | ||||
| 165 | for (run = 0; run < N_RUNS20; run++) | |||
| 166 | { | |||
| 167 | left = _ctk_bitmask_new (); | |||
| 168 | right = _ctk_bitmask_new (); | |||
| 169 | expected = _ctk_bitmask_new (); | |||
| 170 | ||||
| 171 | n_tries = g_test_perf ()(g_test_config_vars->test_perf) ? N_TRIES100 : g_test_rand_int_range (0, N_TRIES100); | |||
| 172 | for (try = 0; try < n_tries; try++) | |||
| 173 | { | |||
| 174 | guint id = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 175 | ||||
| 176 | if (g_test_rand_bit ()(0 != (g_test_rand_int() & (1 << 15)))) | |||
| 177 | left = _ctk_bitmask_set (left, id, TRUE(!(0))); | |||
| 178 | else | |||
| 179 | right = _ctk_bitmask_set (right, id, TRUE(!(0))); | |||
| 180 | ||||
| 181 | expected = _ctk_bitmask_set (expected, id, TRUE(!(0))); | |||
| 182 | } | |||
| 183 | ||||
| 184 | left = _ctk_bitmask_union (left, right); | |||
| 185 | right = _ctk_bitmask_union (right, left); | |||
| 186 | ||||
| 187 | assert_cmpmasks (left, expected)do { if ((!_ctk_bitmask_equals (left, expected))) { char *mask_string = _ctk_bitmask_to_string (left); char *other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)" , "left", mask_string, "expected", other_string); g_assertion_message (((gchar*) 0), "bitmask.c", 187, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string ); } }while (0); | |||
| 188 | assert_cmpmasks (right, expected)do { if ((!_ctk_bitmask_equals (right, expected))) { char *mask_string = _ctk_bitmask_to_string (right); char *other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)" , "right", mask_string, "expected", other_string); g_assertion_message (((gchar*) 0), "bitmask.c", 188, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string ); } }while (0); | |||
| 189 | _ctk_bitmask_free (left); | |||
| 190 | _ctk_bitmask_free (right); | |||
| 191 | _ctk_bitmask_free (expected); | |||
| 192 | } | |||
| 193 | } | |||
| 194 | ||||
| 195 | static void | |||
| 196 | test_intersect (void) | |||
| 197 | { | |||
| 198 | CtkBitmask *left, *right, *expected; | |||
| 199 | guint run, try; | |||
| 200 | gboolean intersects; | |||
| 201 | ||||
| 202 | for (run = 0; run < N_RUNS20; run++) | |||
| 203 | { | |||
| 204 | left = _ctk_bitmask_new (); | |||
| 205 | right = _ctk_bitmask_new (); | |||
| 206 | expected = _ctk_bitmask_new (); | |||
| 207 | ||||
| 208 | for (try = 0; try < N_TRIES100; try++) | |||
| 209 | { | |||
| 210 | guint id = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 211 | gboolean set = g_test_rand_bit ()(0 != (g_test_rand_int() & (1 << 15))); | |||
| 212 | ||||
| 213 | if (g_test_rand_bit ()(0 != (g_test_rand_int() & (1 << 15)))) | |||
| 214 | { | |||
| 215 | left = _ctk_bitmask_set (left, id, set); | |||
| 216 | expected = _ctk_bitmask_set (expected, id, set ? _ctk_bitmask_get (right, id) : 0); | |||
| 217 | } | |||
| 218 | else | |||
| 219 | { | |||
| 220 | right = _ctk_bitmask_set (right, id, set); | |||
| 221 | expected = _ctk_bitmask_set (expected, id, set ? _ctk_bitmask_get (left, id) : 0); | |||
| 222 | } | |||
| 223 | } | |||
| 224 | ||||
| 225 | intersects = _ctk_bitmask_intersects (left, right); | |||
| 226 | g_assert_cmpint (intersects, ==, _ctk_bitmask_intersects (right, left))do { gint64 __n1 = (intersects), __n2 = (_ctk_bitmask_intersects (right, left)); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 226, ((const char*) (__func__)), "intersects" " " "==" " " "_ctk_bitmask_intersects (right, left)" , (guint64)__n1, "==", (guint64)__n2, 'i'); } while (0); | |||
| 227 | g_assert_cmpint (intersects, !=, _ctk_bitmask_is_empty (expected))do { gint64 __n1 = (intersects), __n2 = (_ctk_bitmask_is_empty (expected)); if (__n1 != __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 227, ((const char*) (__func__)), "intersects" " " "!=" " " "_ctk_bitmask_is_empty (expected)" , (guint64)__n1, "!=", (guint64)__n2, 'i'); } while (0); | |||
| 228 | ||||
| 229 | left = _ctk_bitmask_intersect (left, right); | |||
| 230 | right = _ctk_bitmask_intersect (right, left); | |||
| 231 | ||||
| 232 | assert_cmpmasks (left, expected)do { if ((!_ctk_bitmask_equals (left, expected))) { char *mask_string = _ctk_bitmask_to_string (left); char *other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)" , "left", mask_string, "expected", other_string); g_assertion_message (((gchar*) 0), "bitmask.c", 232, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string ); } }while (0); | |||
| 233 | assert_cmpmasks (right, expected)do { if ((!_ctk_bitmask_equals (right, expected))) { char *mask_string = _ctk_bitmask_to_string (right); char *other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)" , "right", mask_string, "expected", other_string); g_assertion_message (((gchar*) 0), "bitmask.c", 233, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string ); } }while (0); | |||
| 234 | _ctk_bitmask_free (left); | |||
| 235 | _ctk_bitmask_free (right); | |||
| 236 | _ctk_bitmask_free (expected); | |||
| 237 | } | |||
| 238 | } | |||
| 239 | ||||
| 240 | static void | |||
| 241 | test_intersect_hardcoded (void) | |||
| 242 | { | |||
| 243 | CtkBitmask *left, *right, *intersection, *expected; | |||
| 244 | const char *left_str, *right_str; | |||
| 245 | guint left_len, right_len; | |||
| 246 | guint i, l, r; | |||
| 247 | ||||
| 248 | for (l = 0; l < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); l++) | |||
| 249 | { | |||
| 250 | for (r = 0; r < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); r++) | |||
| 251 | { | |||
| 252 | left = masks[l]; | |||
| 253 | right = masks[r]; | |||
| 254 | left_str = tests[l]; | |||
| 255 | right_str = tests[r]; | |||
| 256 | left_len = strlen (tests[l]); | |||
| 257 | right_len = strlen (tests[r]); | |||
| 258 | ||||
| 259 | expected = _ctk_bitmask_new (); | |||
| 260 | if (left_len > right_len) | |||
| 261 | left_str += left_len - right_len; | |||
| 262 | if (right_len > left_len) | |||
| 263 | right_str += right_len - left_len; | |||
| 264 | i = MIN (right_len, left_len)(((right_len) < (left_len)) ? (right_len) : (left_len)); | |||
| 265 | while (i--) | |||
| 266 | { | |||
| 267 | expected = _ctk_bitmask_set (expected, i, left_str[0] == '1' && right_str[0] == '1'); | |||
| 268 | right_str++; | |||
| 269 | left_str++; | |||
| 270 | } | |||
| 271 | ||||
| 272 | intersection = _ctk_bitmask_intersect (_ctk_bitmask_copy (left), right); | |||
| 273 | ||||
| 274 | assert_cmpmasks (intersection, expected)do { if ((!_ctk_bitmask_equals (intersection, expected))) { char *mask_string = _ctk_bitmask_to_string (intersection); char * other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "intersection", mask_string , "expected", other_string); g_assertion_message (((gchar*) 0 ), "bitmask.c", 274, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0); | |||
| 275 | g_assert_cmpint (_ctk_bitmask_is_empty (expected), ==, !_ctk_bitmask_intersects (left, right))do { gint64 __n1 = (_ctk_bitmask_is_empty (expected)), __n2 = (!_ctk_bitmask_intersects (left, right)); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 275 , ((const char*) (__func__)), "_ctk_bitmask_is_empty (expected)" " " "==" " " "!_ctk_bitmask_intersects (left, right)", (guint64 )__n1, "==", (guint64)__n2, 'i'); } while (0); | |||
| 276 | ||||
| 277 | _ctk_bitmask_free (intersection); | |||
| 278 | _ctk_bitmask_free (expected); | |||
| 279 | } | |||
| 280 | } | |||
| 281 | } | |||
| 282 | ||||
| 283 | static void | |||
| 284 | test_subtract_hardcoded (void) | |||
| 285 | { | |||
| 286 | CtkBitmask *left, *right, *subtracted, *expected; | |||
| 287 | const char *left_str, *right_str; | |||
| 288 | guint left_len, right_len; | |||
| 289 | guint i, l, r; | |||
| 290 | ||||
| 291 | for (l = 0; l < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); l++) | |||
| 292 | { | |||
| 293 | for (r = 0; r < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); r++) | |||
| 294 | { | |||
| 295 | left = masks[l]; | |||
| 296 | right = masks[r]; | |||
| 297 | left_str = tests[l]; | |||
| 298 | right_str = tests[r]; | |||
| 299 | left_len = strlen (tests[l]); | |||
| 300 | right_len = strlen (tests[r]); | |||
| 301 | ||||
| 302 | expected = _ctk_bitmask_new (); | |||
| 303 | for (i = MIN (right_len, left_len)(((right_len) < (left_len)) ? (right_len) : (left_len)); i < left_len; i++) | |||
| 304 | { | |||
| 305 | expected = _ctk_bitmask_set (expected, i, left_str[left_len - i - 1] == '1'); | |||
| 306 | } | |||
| 307 | if (left_len > right_len) | |||
| 308 | left_str += left_len - right_len; | |||
| 309 | if (right_len > left_len) | |||
| 310 | right_str += right_len - left_len; | |||
| 311 | i = MIN (right_len, left_len)(((right_len) < (left_len)) ? (right_len) : (left_len)); | |||
| 312 | while (i--) | |||
| 313 | { | |||
| 314 | expected = _ctk_bitmask_set (expected, i, left_str[0] == '1' && right_str[0] == '0'); | |||
| 315 | right_str++; | |||
| 316 | left_str++; | |||
| 317 | } | |||
| 318 | ||||
| 319 | g_test_message ("%s - %s\n", _ctk_bitmask_to_string (left), _ctk_bitmask_to_string (right)); | |||
| 320 | subtracted = _ctk_bitmask_subtract (_ctk_bitmask_copy (left), right); | |||
| 321 | ||||
| 322 | assert_cmpmasks (subtracted, expected)do { if ((!_ctk_bitmask_equals (subtracted, expected))) { char *mask_string = _ctk_bitmask_to_string (subtracted); char *other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "subtracted", mask_string, "expected" , other_string); g_assertion_message (((gchar*) 0), "bitmask.c" , 322, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0); | |||
| 323 | ||||
| 324 | _ctk_bitmask_free (subtracted); | |||
| 325 | _ctk_bitmask_free (expected); | |||
| 326 | } | |||
| 327 | } | |||
| 328 | } | |||
| 329 | ||||
| 330 | #define SWAP(_a, _b)do{ guint _tmp = _a; _a = _b; _b = _tmp; }while (0) G_STMT_STARTdo{ \ | |||
| 331 | guint _tmp = _a; \ | |||
| 332 | _a = _b; \ | |||
| 333 | _b = _tmp; \ | |||
| 334 | }G_STMT_ENDwhile (0) | |||
| 335 | ||||
| 336 | static void | |||
| 337 | test_invert_range_hardcoded (void) | |||
| 338 | { | |||
| 339 | guint t, l, r, i; | |||
| 340 | gsize r_len, l_len, ref_len; | |||
| 341 | char *ref_str; | |||
| 342 | CtkBitmask *bitmask, *ref; | |||
| 343 | ||||
| 344 | for (t = 0; t < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); t++) | |||
| 345 | { | |||
| 346 | for (l = 0; l < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); l++) | |||
| 347 | { | |||
| 348 | l_len = strlen (tests[l]); | |||
| 349 | ||||
| 350 | for (r = 0; r < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); r++) | |||
| 351 | { | |||
| 352 | r_len = strlen (tests[r]); | |||
| 353 | if (r_len < l_len) | |||
| 354 | continue; | |||
| 355 | ||||
| 356 | ref_len = MAX (r_len, strlen (tests[t]))(((r_len) > (strlen (tests[t]))) ? (r_len) : (strlen (tests [t]))); | |||
| 357 | ref_str = g_strdup_printf ("%*s", (int) ref_len, tests[t]); | |||
| 358 | for (i = 0; i < ref_len && ref_str[i] == ' '; i++) | |||
| 359 | ref_str[i] = '0'; | |||
| 360 | for (i = l_len - 1; i < r_len; i++) | |||
| 361 | { | |||
| 362 | ref_str[ref_len-i-1] = ref_str[ref_len-i-1] == '0' ? '1' : '0'; | |||
| 363 | } | |||
| 364 | ref = ctk_bitmask_new_parse (ref_str); | |||
| 365 | g_free (ref_str); | |||
| 366 | ||||
| 367 | bitmask = ctk_bitmask_new_parse (tests[t]); | |||
| 368 | bitmask = _ctk_bitmask_invert_range (bitmask, l_len - 1, r_len); | |||
| 369 | ||||
| 370 | assert_cmpmasks (bitmask, ref)do { if ((!_ctk_bitmask_equals (bitmask, ref))) { char *mask_string = _ctk_bitmask_to_string (bitmask); char *other_string = _ctk_bitmask_to_string (ref); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "bitmask" , mask_string, "ref", other_string); g_assertion_message (((gchar *) 0), "bitmask.c", 370, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0); | |||
| 371 | ||||
| 372 | _ctk_bitmask_free (bitmask); | |||
| 373 | _ctk_bitmask_free (ref); | |||
| 374 | } | |||
| 375 | } | |||
| 376 | } | |||
| 377 | } | |||
| 378 | ||||
| 379 | static void | |||
| 380 | test_invert_range (void) | |||
| 381 | { | |||
| 382 | CtkBitmask *left, *right, *intersection, *expected; | |||
| 383 | guint run; | |||
| 384 | guint left_start, left_end, right_start, right_end, start, end; | |||
| 385 | ||||
| 386 | for (run = 0; run < N_RUNS20; run++) | |||
| 387 | { | |||
| 388 | left = _ctk_bitmask_new (); | |||
| 389 | right = _ctk_bitmask_new (); | |||
| 390 | expected = _ctk_bitmask_new (); | |||
| 391 | ||||
| 392 | left_start = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 393 | left_end = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 394 | if (left_start > left_end) | |||
| 395 | SWAP (left_start, left_end)do{ guint _tmp = left_start; left_start = left_end; left_end = _tmp; }while (0); | |||
| 396 | right_start = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 397 | right_end = g_test_rand_int_range (0, MAX_INDEX1000); | |||
| 398 | if (right_start > right_end) | |||
| 399 | SWAP (right_start, right_end)do{ guint _tmp = right_start; right_start = right_end; right_end = _tmp; }while (0); | |||
| 400 | start = MAX (left_start, right_start)(((left_start) > (right_start)) ? (left_start) : (right_start )); | |||
| 401 | end = MIN (left_end, right_end)(((left_end) < (right_end)) ? (left_end) : (right_end)); | |||
| 402 | ||||
| 403 | if (left_start != left_end) | |||
| 404 | left = _ctk_bitmask_invert_range (left, left_start, left_end); | |||
| 405 | if (right_start != right_end) | |||
| 406 | right = _ctk_bitmask_invert_range (right, right_start, right_end); | |||
| 407 | if (start < end) | |||
| 408 | expected = _ctk_bitmask_invert_range (expected, start, end); | |||
| 409 | ||||
| 410 | intersection = _ctk_bitmask_copy (left); | |||
| 411 | intersection = _ctk_bitmask_intersect (intersection, right); | |||
| 412 | ||||
| 413 | assert_cmpmasks (intersection, expected)do { if ((!_ctk_bitmask_equals (intersection, expected))) { char *mask_string = _ctk_bitmask_to_string (intersection); char * other_string = _ctk_bitmask_to_string (expected); char *msg = g_strdup_printf ("%s (%s) != %s (%s)", "intersection", mask_string , "expected", other_string); g_assertion_message (((gchar*) 0 ), "bitmask.c", 413, ((const char*) (__func__)), msg); g_free (msg); g_free (mask_string); g_free (other_string); } }while (0); | |||
| 414 | ||||
| 415 | if (start < end) | |||
| 416 | expected = _ctk_bitmask_invert_range (expected, start, end); | |||
| 417 | ||||
| 418 | g_assert_cmpint (_ctk_bitmask_is_empty (expected), ==, TRUE)do { gint64 __n1 = (_ctk_bitmask_is_empty (expected)), __n2 = ((!(0))); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "bitmask.c", 418, ((const char*) (__func__)), "_ctk_bitmask_is_empty (expected)" " " "==" " " "TRUE", (guint64 )__n1, "==", (guint64)__n2, 'i'); } while (0); | |||
| 419 | ||||
| 420 | _ctk_bitmask_free (left); | |||
| 421 | _ctk_bitmask_free (right); | |||
| 422 | _ctk_bitmask_free (intersection); | |||
| 423 | _ctk_bitmask_free (expected); | |||
| 424 | } | |||
| 425 | } | |||
| 426 | ||||
| 427 | /* SETUP & RUNNING */ | |||
| 428 | ||||
| 429 | static void | |||
| 430 | create_masks (void) | |||
| 431 | { | |||
| 432 | guint i; | |||
| 433 | ||||
| 434 | for (i = 0; i < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); i++) | |||
| 435 | masks[i] = ctk_bitmask_new_parse (tests[i]); | |||
| 436 | } | |||
| 437 | ||||
| 438 | static void | |||
| 439 | free_masks (void) | |||
| 440 | { | |||
| 441 | guint i; | |||
| 442 | ||||
| 443 | for (i = 0; i < G_N_ELEMENTS (tests)(sizeof (tests) / sizeof ((tests)[0])); i++) | |||
| 444 | { | |||
| 445 | _ctk_bitmask_free (masks[i]); | |||
| 446 | masks[i] = NULL((void*)0); | |||
| 447 | } | |||
| 448 | } | |||
| 449 | ||||
| 450 | int | |||
| 451 | main (int argc, char *argv[]) | |||
| 452 | { | |||
| 453 | int result; | |||
| 454 | ||||
| 455 | g_test_init (&argc, &argv, NULL((void*)0)); | |||
| 456 | setlocale (LC_ALL6, "C"); | |||
| 457 | g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id=%s"); | |||
| 458 | ||||
| 459 | create_masks (); | |||
| ||||
| 460 | ||||
| 461 | g_test_add_func ("/bitmask/to_string", test_to_string); | |||
| 462 | g_test_add_func ("/bitmask/is_empty", test_is_empty); | |||
| 463 | g_test_add_func ("/bitmask/equals", test_equals); | |||
| 464 | g_test_add_func ("/bitmask/set", test_set); | |||
| 465 | g_test_add_func ("/bitmask/union", test_union); | |||
| 466 | g_test_add_func ("/bitmask/intersect", test_intersect); | |||
| 467 | g_test_add_func ("/bitmask/intersect_hardcoded", test_intersect_hardcoded); | |||
| 468 | g_test_add_func ("/bitmask/subtract_hardcoded", test_subtract_hardcoded); | |||
| 469 | g_test_add_func ("/bitmask/invert_range", test_invert_range); | |||
| 470 | g_test_add_func ("/bitmask/invert_range_hardcoded", test_invert_range_hardcoded); | |||
| 471 | ||||
| 472 | result = g_test_run (); | |||
| 473 | ||||
| 474 | free_masks (); | |||
| 475 | ||||
| 476 | return result; | |||
| 477 | } |