diff options
author | Ryan Lortie <desrt@desrt.ca> | 2013-11-24 22:53:32 -0500 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2013-11-25 00:34:44 -0500 |
commit | 2b232dbfbd771e5ca4b67ab64ac28264b67336e5 (patch) | |
tree | 9b54857dfcadfc95190d78f8484b82a15bf645f0 | |
parent | e6b01ab760fe29c80b343699237c9dfe4d237b22 (diff) | |
download | dconf-2b232dbfbd771e5ca4b67ab64ac28264b67336e5.tar.gz |
tests: improve changeset test coverage
-rw-r--r-- | tests/changeset.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/tests/changeset.c b/tests/changeset.c index 5aa401a..90b8de6 100644 --- a/tests/changeset.c +++ b/tests/changeset.c @@ -394,6 +394,11 @@ test_change (void) g_assert (dconf_changeset_is_empty (dbb)); dconf_changeset_unref (dbb); + deltaa = dconf_changeset_new (); + dconf_changeset_change (dba, deltaa); + g_assert (dconf_changeset_is_empty (dba)); + dconf_changeset_unref (deltaa); + deltaa = dconf_changeset_new_write ("/some/value", NULL); dconf_changeset_change (dba, deltaa); g_assert (dconf_changeset_is_empty (dba)); @@ -436,6 +441,115 @@ test_change (void) dconf_changeset_unref (dba); } +static void +assert_diff_change_invariant (DConfChangeset *from, + DConfChangeset *to) +{ + DConfChangeset *copy; + DConfChangeset *diff; + + /* Verify this promise from the docs: + * + * Applying the returned changeset to @from using + * dconf_changeset_change() will result in the two changesets being + * equal. + */ + + copy = dconf_changeset_new_database (from); + diff = dconf_changeset_diff (from, to); + if (diff) + { + dconf_changeset_change (copy, diff); + dconf_changeset_unref (diff); + } + + /* Make sure they are now equal */ + diff = dconf_changeset_diff (copy, to); + g_assert (diff == NULL); + + /* Why not try it the other way too? */ + diff = dconf_changeset_diff (to, copy); + g_assert (diff == NULL); + + dconf_changeset_unref (copy); +} + +static gchar * +create_random_key (void) +{ + GString *key; + gint i, n; + + key = g_string_new (NULL); + n = g_test_rand_int_range (1, 5); + for (i = 0; i < n; i++) + { + gint j; + + g_string_append_c (key, '/'); + for (j = 0; j < 5; j++) + g_string_append_c (key, g_test_rand_int_range ('a', 'z' + 1)); + } + + return g_string_free (key, FALSE); +} + +static GVariant * +create_random_value (void) +{ + return g_variant_new_take_string (create_random_key ()); +} + +static DConfChangeset * +create_random_db (void) +{ + DConfChangeset *set; + gint i, n; + + set = dconf_changeset_new_database (NULL); + n = g_test_rand_int_range (0, 20); + for (i = 0; i < n; i++) + { + GVariant *value = create_random_value (); + gchar *key = create_random_key (); + + dconf_changeset_set (set, key, value); + g_free (key); + } + + return set; +} + +static void +test_diff (void) +{ + DConfChangeset *a, *b; + gint i; + + /* Check diff between two empties */ + a = dconf_changeset_new_database (NULL); + b = dconf_changeset_new_database (NULL); + assert_diff_change_invariant (a, b); + dconf_changeset_unref (a); + dconf_changeset_unref (b); + + /* Check diff between two non-empties that are equal */ + a = create_random_db (); + b = dconf_changeset_new_database (a); + assert_diff_change_invariant (a, b); + dconf_changeset_unref (a); + dconf_changeset_unref (b); + + /* Check diff between two random databases that are probably unequal */ + for (i = 0; i < 1000; i++) + { + a = create_random_db (); + b = create_random_db (); + assert_diff_change_invariant (a, b); + dconf_changeset_unref (a); + dconf_changeset_unref (b); + } +} int main (int argc, char **argv) @@ -448,6 +562,7 @@ main (int argc, char **argv) g_test_add_func ("/changeset/reset", test_reset); g_test_add_func ("/changeset/serialiser", test_serialiser); g_test_add_func ("/changeset/change", test_change); + g_test_add_func ("/changeset/diff", test_diff); return g_test_run (); } |