increase test coverage for kv-list default tip

Fri, 19 Sep 2025 16:05:41 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 19 Sep 2025 16:05:41 +0200
changeset 1380
bf5866e47b15
parent 1379
9ad4a7011528

increase test coverage for kv-list

relates to #461

tests/test_kv_list.c file | annotate | diff | comparison | revisions
--- a/tests/test_kv_list.c	Thu Sep 18 00:40:27 2025 +0200
+++ b/tests/test_kv_list.c	Fri Sep 19 16:05:41 2025 +0200
@@ -31,6 +31,18 @@
 
 #include "cx/kv_list.h"
 
+static int kv_list_test_destr_val;
+static void kv_list_test_destr(void *data) {
+    kv_list_test_destr_val = *(int*)data;
+}
+
+static void *kv_list_test_destr2_extra;
+static int kv_list_test_destr2_val;
+static void kv_list_test_destr2(void* extra, void *data) {
+    kv_list_test_destr2_extra = extra;
+    kv_list_test_destr2_val = *(int*)data;
+}
+
 CX_TEST(test_kv_list_map_as_list) {
     CxList *list = cxKvListCreateSimple(sizeof(int));
     CX_TEST_DO {
@@ -150,6 +162,13 @@
 
         y = 666;
         CX_TEST_ASSERT(cxListSize(list) == cxListFindRemove(list, &y));
+
+        y = 37;
+        CX_TEST_ASSERT(0 == cxListFindRemove(list, &y));
+        CX_TEST_ASSERT(cxListSize(list) == 0);
+        CX_TEST_ASSERT(cxMapSize(map) == 0);
+
+        CX_TEST_ASSERT(0 == cxListFindRemove(list, &y));
     }
     cxListFree(list);
 }
@@ -299,6 +318,27 @@
     cxListFree(list);
 }
 
+CX_TEST(test_kv_list_map_put_not_hashed) {
+    CxList *list = cxKvListCreateSimple(sizeof(int));
+    int x;
+    CX_TEST_DO {
+        CxMap *map = cxKvListAsMap(list);
+        x = 13;
+        // test with a custom key that was not hashed, yet
+        CxHashKey key = {};
+        key.data = "xyz";
+        key.len = 3;
+        CX_TEST_ASSERT(0 == cxMapPut(map, key, &x));
+        CX_TEST_ASSERT(*(int*)cxListAt(list, 0) == 13);
+        CX_TEST_ASSERT(*(int*)cxMapGet(map, "xyz") == 13);
+
+        // remove and check if the copied key is correctly removed
+        CX_TEST_ASSERT(0 == cxListRemove(list, 0));
+        CX_TEST_ASSERT(cxMapGet(map, "xyz") == NULL);
+    }
+    cxListFree(list);
+}
+
 CX_TEST(test_kv_list_map_remove) {
     CxList *list = cxKvListCreateSimple(sizeof(int));
     int x;
@@ -326,6 +366,38 @@
     cxListFree(list);
 }
 
+CX_TEST(test_kv_list_map_remove_and_get) {
+    CxList *list = cxKvListCreateSimple(sizeof(int));
+    int x, y;
+    CX_TEST_DO {
+        CxMap *map = cxKvListAsMap(list);
+
+        x = 13;
+        CX_TEST_ASSERT(0 == cxMapPut(map, "xyz", &x));
+
+        x = 37;
+        CX_TEST_ASSERT(0 == cxMapPut(map, "abc", &x));
+
+        CX_TEST_ASSERT(cxMapSize(map) == 2);
+        cxDefineDestructor(map, kv_list_test_destr);
+        kv_list_test_destr_val = 0;
+        y = 0;
+        CX_TEST_ASSERT(0 == cxMapRemoveAndGet(map, "xyz", &y));
+        CX_TEST_ASSERT(y == 13);
+        // destr not called!
+        CX_TEST_ASSERT(kv_list_test_destr_val == 0);
+        CX_TEST_ASSERT(cxMapSize(map) == 1);
+        CX_TEST_ASSERT(cxMapGet(map, "abc") != NULL);
+        CX_TEST_ASSERT(cxMapGet(map, "xyz") == NULL);
+
+        CX_TEST_ASSERT(cxListSize(list) == 1);
+        CX_TEST_ASSERT(*(int*)cxListAt(list, 0) == 37);
+
+        CX_TEST_ASSERT(0 != cxMapRemove(map, "xyz"));
+    }
+    cxListFree(list);
+}
+
 CX_TEST(test_kv_list_set_key) {
     CxList *list = cxKvListCreateSimple(sizeof(int));
     int x;
@@ -333,6 +405,8 @@
         x = 47;
         cxListAdd(list, &x);
         CX_TEST_ASSERT(0 == cxKvListSetKey(list, 0, "xyz"));
+        // index out of bounds:
+        CX_TEST_ASSERT(0 != cxKvListSetKey(list, 1, "abc"));
 
         CxMap *map = cxKvListAsMap(list);
 
@@ -368,7 +442,7 @@
         CX_TEST_ASSERT(y != NULL);
         CX_TEST_ASSERT(*y == 11);
 
-        cxKvListRemoveKey(list, 1);
+        CX_TEST_ASSERT(0 == cxKvListRemoveKey(list, 1));
         CX_TEST_ASSERT(cxMapGet(map, "abc") == NULL);
         CX_TEST_ASSERT(cxMapSize(map) == 2);
         CX_TEST_ASSERT(cxListSize(list) == 3);
@@ -382,6 +456,9 @@
         y = cxMapGet(map, "efg");
         CX_TEST_ASSERT(y != NULL);
         CX_TEST_ASSERT(*y == 1337);
+
+        // index out of bounds:
+        CX_TEST_ASSERT(0 != cxKvListRemoveKey(list, 3));
     }
     cxListFree(list);
 }
@@ -462,12 +539,6 @@
     cxListFree(list);
 }
 
-
-static int kv_list_test_destr_val;
-static void kv_list_test_destr(void *data) {
-    kv_list_test_destr_val = *(int*)data;
-}
-
 CX_TEST(test_kv_list_list_remove_destr_in_list) {
     CxList *list = cxKvListCreateSimple(sizeof(int));
     int x;
@@ -530,6 +601,76 @@
     cxMapFree(map);
 }
 
+CX_TEST(test_kv_list_list_remove_destr2_in_list) {
+    CxList *list = cxKvListCreateSimple(sizeof(int));
+    int x;
+    CX_TEST_DO {
+        x = 0xabcd;
+        CX_TEST_ASSERT(0 == cxListAdd(list, &x));
+        cxKvListSetKey(list, 0, "xyz");
+
+        cxDefineAdvancedDestructor(list, kv_list_test_destr2, (void*)0xef47);
+        kv_list_test_destr2_val = 0;
+        kv_list_test_destr2_extra = NULL;
+        CX_TEST_ASSERT(0 == cxListRemove(list, 0));
+        CX_TEST_ASSERT(kv_list_test_destr2_val == 0xabcd);
+        CX_TEST_ASSERT(kv_list_test_destr2_extra == (void*)0xef47);
+    }
+    cxListFree(list);
+}
+
+CX_TEST(test_kv_list_list_remove_destr2_in_map) {
+    CxList *list = cxKvListCreateSimple(sizeof(int));
+    int x;
+    CX_TEST_DO {
+        x = 0xabcd;
+        CX_TEST_ASSERT(0 == cxListAdd(list, &x));
+        cxKvListSetKey(list, 0, "xyz");
+        CxMap *map = cxKvListAsMap(list);
+        cxDefineAdvancedDestructor(map, kv_list_test_destr2, (void*)0xef47);
+        kv_list_test_destr2_val = 0;
+        kv_list_test_destr2_extra = NULL;
+        CX_TEST_ASSERT(0 == cxListRemove(list, 0));
+        CX_TEST_ASSERT(kv_list_test_destr2_val == 0xabcd);
+        CX_TEST_ASSERT(kv_list_test_destr2_extra == (void*)0xef47);
+    }
+    cxListFree(list);
+}
+
+CX_TEST(test_kv_list_map_remove_destr2_in_list) {
+    CxMap *map = cxKvListCreateAsMapSimple(sizeof(int));
+    int x;
+    CX_TEST_DO {
+        x = 0xabcd;
+        CX_TEST_ASSERT(0 == cxMapPut(map, "xyz", &x));
+        CxList *list = cxKvListAsList(map);
+        cxDefineAdvancedDestructor(list, kv_list_test_destr2, (void*)0xef47);
+        kv_list_test_destr2_val = 0;
+        kv_list_test_destr2_extra = NULL;
+        CX_TEST_ASSERT(0 == cxMapRemove(map, "xyz"));
+        CX_TEST_ASSERT(kv_list_test_destr2_val == 0xabcd);
+        CX_TEST_ASSERT(kv_list_test_destr2_extra == (void*)0xef47);
+    }
+    cxMapFree(map);
+}
+
+CX_TEST(test_kv_list_map_remove_destr2_in_map) {
+    CxMap *map = cxKvListCreateAsMapSimple(sizeof(int));
+    int x;
+    CX_TEST_DO {
+        x = 0xabcd;
+        CX_TEST_ASSERT(0 == cxMapPut(map, "xyz", &x));
+
+        cxDefineAdvancedDestructor(map, kv_list_test_destr2, (void*)0xef47);
+        kv_list_test_destr2_val = 0;
+        kv_list_test_destr2_extra = NULL;
+        CX_TEST_ASSERT(0 == cxMapRemove(map, "xyz"));
+        CX_TEST_ASSERT(kv_list_test_destr2_val == 0xabcd);
+        CX_TEST_ASSERT(kv_list_test_destr2_extra == (void*)0xef47);
+    }
+    cxMapFree(map);
+}
+
 CX_TEST(test_kv_list_list_clear_destr_in_list) {
     CxList *list = cxKvListCreateSimple(sizeof(int));
     int x;
@@ -620,7 +761,9 @@
     cx_test_register(suite, test_kv_list_remove_array_and_get);
     cx_test_register(suite, test_kv_list_map_put);
     cx_test_register(suite, test_kv_list_map_put_ptr);
+    cx_test_register(suite, test_kv_list_map_put_not_hashed);
     cx_test_register(suite, test_kv_list_map_remove);
+    cx_test_register(suite, test_kv_list_map_remove_and_get);
     cx_test_register(suite, test_kv_list_set_key);
     cx_test_register(suite, test_kv_list_remove_key);
     cx_test_register(suite, test_kv_list_insert_with_key);
@@ -630,6 +773,10 @@
     cx_test_register(suite, test_kv_list_list_remove_destr_in_map);
     cx_test_register(suite, test_kv_list_map_remove_destr_in_list);
     cx_test_register(suite, test_kv_list_map_remove_destr_in_map);
+    cx_test_register(suite, test_kv_list_list_remove_destr2_in_list);
+    cx_test_register(suite, test_kv_list_list_remove_destr2_in_map);
+    cx_test_register(suite, test_kv_list_map_remove_destr2_in_list);
+    cx_test_register(suite, test_kv_list_map_remove_destr2_in_map);
     cx_test_register(suite, test_kv_list_list_clear_destr_in_list);
     cx_test_register(suite, test_kv_list_list_clear_destr_in_map);
     cx_test_register(suite, test_kv_list_map_clear_destr_in_list);

mercurial