Fri, 19 Sep 2025 16:05:41 +0200
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);