Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / t / utils / llist_test.c
index 638d2fbdbeef1affe64e15753a7e6ca08cd7633e..cc9954d98662c76f89ef32f4e9416ea178073017 100644 (file)
@@ -80,7 +80,7 @@ populate(void)
        }
 } /* populate */
 
-START_TEST(test_sdb_llist_clone)
+START_TEST(test_clone)
 {
        sdb_llist_t *clone;
        size_t i;
@@ -100,7 +100,7 @@ START_TEST(test_sdb_llist_clone)
 }
 END_TEST
 
-START_TEST(test_sdb_llist_destroy)
+START_TEST(test_destroy)
 {
        size_t i;
        populate();
@@ -115,9 +115,33 @@ START_TEST(test_sdb_llist_destroy)
 }
 END_TEST
 
-START_TEST(test_sdb_llist_append)
+START_TEST(test_clear)
 {
        size_t i;
+       populate();
+       sdb_llist_clear(list);
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               fail_unless(golden_data[i].ref_cnt == 1,
+                               "sdb_llist_clear() did not deref element %s",
+                               golden_data[i].name);
+       }
+
+       i = sdb_llist_len(list);
+       fail_unless(i == 0,
+                       "sdb_llist_clear() left %zu elements in the list; "
+                       "expected: 0", i);
+}
+END_TEST
+
+START_TEST(test_append)
+{
+       size_t i;
+
+       fail_unless(sdb_llist_len(list) == 0,
+                       "sdb_llist_len(<empty list>) = %zu; expected: 0",
+                       sdb_llist_len(list));
+
        for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
                int check = sdb_llist_append(list, &golden_data[i]);
                fail_unless(check == 0,
@@ -126,11 +150,14 @@ START_TEST(test_sdb_llist_append)
                fail_unless(golden_data[i].ref_cnt == 2,
                                "sdb_llist_append(%s) did not take ownership",
                                golden_data[i].name);
+               fail_unless(sdb_llist_len(list) == i + 1,
+                               "sdb_llist_len(<empty list>) = %zu; expected: zu",
+                               sdb_llist_len(list), i + 1);
        }
 }
 END_TEST
 
-START_TEST(test_sdb_llist_insert)
+START_TEST(test_insert)
 {
        size_t i;
        for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
@@ -162,7 +189,60 @@ START_TEST(test_validate_insert)
 }
 END_TEST
 
-START_TEST(test_sdb_llist_search)
+START_TEST(test_get)
+{
+       size_t i;
+       populate();
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               sdb_object_t *check = sdb_llist_get(list, i);
+               fail_unless(check == &golden_data[i],
+                               "sdb_llist_get() = %p; expected: %p",
+                               check, &golden_data[i]);
+               fail_unless(check->ref_cnt == 3,
+                               "sdb_llist_get() didn't increment reference count; got: %i; "
+                               "expected: 3", check->ref_cnt);
+               sdb_object_deref(check);
+       }
+}
+END_TEST
+
+START_TEST(test_remove_by_name)
+{
+       /* "random" indexes */
+       int indexes[] = { 4, 5, 3, 6, 2, 0, 1 };
+       size_t i;
+
+       populate();
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(indexes); ++i) {
+               sdb_object_t *check;
+
+               fail_unless((size_t)indexes[i] < SDB_STATIC_ARRAY_LEN(golden_data),
+                               "INTERNAL ERROR: invalid index %i", indexes[i]);
+
+               check = sdb_llist_remove_by_name(list, golden_data[indexes[i]].name);
+               fail_unless(check == &golden_data[indexes[i]],
+                               "sdb_llist_remove_by_name() = %p; expected: %p",
+                               check, &golden_data[indexes[i]]);
+               fail_unless(check->ref_cnt == 2,
+                               "sdb_llist_remove_by_name() returned unexpected reference "
+                               "count; got: %i; expected: 2", check->ref_cnt);
+
+               check = sdb_llist_remove_by_name(list, golden_data[indexes[i]].name);
+               fail_unless(check == NULL,
+                               "sdb_llist_remove_by_name() did not remove the element");
+       }
+}
+END_TEST
+
+static int
+dummy_lookup(const sdb_object_t __attribute__((unused)) *obj,
+               const void __attribute__((unused)) *user_data)
+{
+       return 0;
+} /* dummy_lookup */
+
+START_TEST(test_search)
 {
        size_t i;
        populate();
@@ -181,10 +261,32 @@ START_TEST(test_sdb_llist_search)
                                "sdb_llist_search_by_name(%s) = %p; expected: NULL",
                                unused_names[i], check);
        }
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               /* dummy_lookup always return 0, thus, this will always return the
+                * first element */
+               sdb_object_t *check = sdb_llist_search(list, dummy_lookup, NULL);
+               fail_unless(check == &golden_data[i],
+                               "sdb_llist_search() = %p (%s); expected: %p (%s)",
+                               check, check->name, &golden_data[i], golden_data[i].name);
+
+               /* => remove the first element */
+               check = sdb_llist_remove(list, dummy_lookup, NULL);
+               fail_unless(check == &golden_data[i],
+                               "sdb_llist_remove() = %p (%s); expected: %p (%s)",
+                               check, check->name, &golden_data[i], golden_data[i].name);
+               fail_unless(check->ref_cnt == 2,
+                               "sdb_llist_remove() changed reference count; got: %i; "
+                               "expected: 2", check->ref_cnt);
+       }
+       /* should now be empty */
+       fail_unless(sdb_llist_len(list) == 0,
+                       "Still have %i elements in the list; expected: 0",
+                       sdb_llist_len(list));
 }
 END_TEST
 
-START_TEST(test_sdb_llist_shift)
+START_TEST(test_shift)
 {
        size_t i;
        populate();
@@ -204,7 +306,7 @@ START_TEST(test_sdb_llist_shift)
 }
 END_TEST
 
-START_TEST(test_sdb_llist_iter)
+START_TEST(test_iter)
 {
        sdb_llist_iter_t *iter;
        size_t i;
@@ -233,6 +335,41 @@ START_TEST(test_sdb_llist_iter)
 }
 END_TEST
 
+START_TEST(test_iter_remove)
+{
+       sdb_llist_iter_t *iter;
+       sdb_object_t *check;
+       size_t i;
+
+       populate();
+
+       iter = sdb_llist_get_iter(list);
+       fail_unless(iter != NULL,
+                       "sdb_llist_get_iter() did not return an iterator");
+
+       i = 0;
+       while (sdb_llist_iter_has_next(iter)) {
+               check = sdb_llist_iter_get_next(iter);
+               fail_unless(check == &golden_data[i],
+                               "sdb_llist_iter_get_next() = %p; expected: %p",
+                               check, &golden_data[i]);
+
+               sdb_llist_iter_remove_current(iter);
+               ++i;
+       }
+       sdb_llist_iter_destroy(iter);
+
+       fail_unless(i == (size_t)SDB_STATIC_ARRAY_LEN(golden_data),
+                       "iterated for %zu steps; expected: %i",
+                       i, SDB_STATIC_ARRAY_LEN(golden_data));
+
+       /* all elements should be removed */
+       check = sdb_llist_shift(list);
+       fail_unless(check == NULL,
+                       "sdb_llist_shift() = %p; expected: NULL", check);
+}
+END_TEST
+
 Suite *
 util_llist_suite(void)
 {
@@ -241,14 +378,18 @@ util_llist_suite(void)
 
        tc = tcase_create("core");
        tcase_add_checked_fixture(tc, setup, teardown);
-       tcase_add_test(tc, test_sdb_llist_clone);
-       tcase_add_test(tc, test_sdb_llist_destroy);
-       tcase_add_test(tc, test_sdb_llist_append);
-       tcase_add_test(tc, test_sdb_llist_insert);
+       tcase_add_test(tc, test_clone);
+       tcase_add_test(tc, test_destroy);
+       tcase_add_test(tc, test_clear);
+       tcase_add_test(tc, test_append);
+       tcase_add_test(tc, test_insert);
        tcase_add_test(tc, test_validate_insert);
-       tcase_add_test(tc, test_sdb_llist_search);
-       tcase_add_test(tc, test_sdb_llist_shift);
-       tcase_add_test(tc, test_sdb_llist_iter);
+       tcase_add_test(tc, test_get);
+       tcase_add_test(tc, test_remove_by_name);
+       tcase_add_test(tc, test_search);
+       tcase_add_test(tc, test_shift);
+       tcase_add_test(tc, test_iter);
+       tcase_add_test(tc, test_iter_remove);
        suite_add_tcase(s, tc);
 
        return s;