diff options
author | Benjamin Otte <otte@redhat.com> | 2015-02-25 00:35:45 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2015-02-25 01:55:28 +0100 |
commit | 0ab48fcc4227ab112835f8fc1b922cfb21a7927f (patch) | |
tree | e2b3d0b8d860af641f873c01c376cde4c6e9c059 /testsuite/gtk/bitmask.c | |
parent | 9e50fe0aeba1dba5a151efcdf39b9f0142d26e3d (diff) | |
download | gtk+-0ab48fcc4227ab112835f8fc1b922cfb21a7927f.tar.gz |
css: Fix _gtk_bitmask_subtract()
We were doing the wrong thing *and* writing uninitialized memory while
doing so. BAD.
Also added tests exposing these.
https://bugzilla.redhat.com/show_bug.cgi?id=1185585
Diffstat (limited to 'testsuite/gtk/bitmask.c')
-rw-r--r-- | testsuite/gtk/bitmask.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/testsuite/gtk/bitmask.c b/testsuite/gtk/bitmask.c index 7d186a986a..b457c08fd8 100644 --- a/testsuite/gtk/bitmask.c +++ b/testsuite/gtk/bitmask.c @@ -280,6 +280,53 @@ test_intersect_hardcoded (void) } } +static void +test_subtract_hardcoded (void) +{ + GtkBitmask *left, *right, *subtracted, *expected; + const char *left_str, *right_str; + guint left_len, right_len; + guint i, l, r; + + for (l = 0; l < G_N_ELEMENTS (tests); l++) + { + for (r = 0; r < G_N_ELEMENTS (tests); r++) + { + left = masks[l]; + right = masks[r]; + left_str = tests[l]; + right_str = tests[r]; + left_len = strlen (tests[l]); + right_len = strlen (tests[r]); + + expected = _gtk_bitmask_new (); + for (i = MIN (right_len, left_len); i < left_len; i++) + { + expected = _gtk_bitmask_set (expected, i, left_str[left_len - i - 1] == '1'); + } + if (left_len > right_len) + left_str += left_len - right_len; + if (right_len > left_len) + right_str += right_len - left_len; + i = MIN (right_len, left_len); + while (i--) + { + expected = _gtk_bitmask_set (expected, i, left_str[0] == '1' && right_str[0] == '0'); + right_str++; + left_str++; + } + + g_print ("%s - %s\n", _gtk_bitmask_to_string (left), _gtk_bitmask_to_string (right)); + subtracted = _gtk_bitmask_subtract (_gtk_bitmask_copy (left), right); + + assert_cmpmasks (subtracted, expected); + + _gtk_bitmask_free (subtracted); + _gtk_bitmask_free (expected); + } + } +} + #define SWAP(_a, _b) G_STMT_START{ \ guint _tmp = _a; \ _a = _b; \ @@ -375,6 +422,7 @@ main (int argc, char *argv[]) g_test_add_func ("/bitmask/union", test_union); g_test_add_func ("/bitmask/intersect", test_intersect); g_test_add_func ("/bitmask/intersect_hardcoded", test_intersect_hardcoded); + g_test_add_func ("/bitmask/subtract_hardcoded", test_subtract_hardcoded); g_test_add_func ("/bitmask/invert_range", test_invert_range); result = g_test_run (); |