add tests for cxMapClone() - relates to #743

Thu, 23 Oct 2025 17:38:44 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 23 Oct 2025 17:38:44 +0200
changeset 1439
8e7fe85febc0
parent 1438
2ca9e03ceeec
child 1440
0d1430668271

add tests for cxMapClone() - relates to #743

tests/test_hash_map.c file | annotate | diff | comparison | revisions
--- a/tests/test_hash_map.c	Wed Oct 22 23:32:20 2025 +0200
+++ b/tests/test_hash_map.c	Thu Oct 23 17:38:44 2025 +0200
@@ -498,6 +498,85 @@
     cx_testing_allocator_destroy(&talloc);
 }
 
+static void *test_hash_map_clone_func(void *dst, const void *src,
+        const CxAllocator *al, void *data) {
+    if (dst == NULL) {
+        dst = cxMalloc(al, sizeof(int));
+    }
+    *((int*)dst) = *((int*)src) + *((int*)data);
+    return dst;
+}
+
+CX_TEST(test_hash_map_clone) {
+    CxMap *dst = cxHashMapCreateSimple(sizeof(int));
+    CxMap *src = cxHashMapCreateSimple(sizeof(int));
+    const char *exist_keys[] = {"k1", "k2", "k3"};
+    int exists[] = {1, 3, 4};
+    const char *source_keys[] = {"k4", "k2", "k5"};
+    int source[] = {7, 9, 15};
+    for (unsigned int i = 0 ; i < 3 ; i++) {
+        cxMapPut(dst, exist_keys[i], &exists[i]);
+        cxMapPut(src, source_keys[i], &source[i]);
+    }
+    CX_TEST_DO {
+        int c = 4;
+        size_t cloned = cxMapClone(dst, src, test_hash_map_clone_func, NULL, &c);
+        CX_TEST_ASSERT(cloned == 3);
+        CX_TEST_ASSERT(cxMapSize(dst) == 5);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 1);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k2")) == 13);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 4);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k4")) == 11);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k5")) == 19);
+        CX_TEST_ASSERT(cxMapSize(src) == 3);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k4")) == 7);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k2")) == 9);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k5")) == 15);
+    }
+    cxMapFree(dst);
+    cxMapFree(src);
+}
+
+CX_TEST(test_hash_map_clone_ptr) {
+    CxTestingAllocator talloc;
+    cx_testing_allocator_init(&talloc);
+    CxAllocator *allocator = &talloc.base;
+    CxMap *dst = cxHashMapCreateSimple(CX_STORE_POINTERS);
+    cxDefineAdvancedDestructor(dst, cxFree, allocator);
+    CxMap *src = cxHashMapCreateSimple(CX_STORE_POINTERS);
+    const char *exist_keys[] = {"k1", "k2", "k3"};
+    int exists[] = {1, 3, 4};
+    const char *source_keys[] = {"k4", "k2", "k5"};
+    int source[] = {7, 9, 15};
+    for (unsigned int i = 0 ; i < 3 ; i++) {
+        int *y = cxMalloc(allocator, sizeof(int));
+        *y = exists[i];
+        cxMapPut(dst, exist_keys[i], y);
+        cxMapPut(src, source_keys[i], &source[i]);
+    }
+    CX_TEST_DO {
+        int c = 4;
+        size_t cloned = cxMapClone(dst, src, test_hash_map_clone_func, allocator, &c);
+        CX_TEST_ASSERT(cloned == 3);
+        CX_TEST_ASSERT(cxMapSize(dst) == 5);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 1);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k2")) == 13);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 4);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k4")) == 11);
+        CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k5")) == 19);
+        CX_TEST_ASSERT(cxMapSize(src) == 3);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k4")) == 7);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k2")) == 9);
+        CX_TEST_ASSERT(*((int*)cxMapGet(src, "k5")) == 15);
+
+        cxMapClear(dst);
+        CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
+    }
+    cxMapFree(dst);
+    cxMapFree(src);
+    cx_testing_allocator_destroy(&talloc);
+}
+
 CX_TEST(test_empty_map_size) {
     CX_TEST_DO {
         CX_TEST_ASSERT(cxEmptyMap->collection.size == 0);
@@ -842,6 +921,8 @@
     cx_test_register(suite, test_hash_map_advanced_destructor_objects);
     cx_test_register(suite, test_hash_map_simple_destructor_pointers);
     cx_test_register(suite, test_hash_map_advanced_destructor_pointers);
+    cx_test_register(suite, test_hash_map_clone);
+    cx_test_register(suite, test_hash_map_clone_ptr);
     cx_test_register(suite, test_empty_map_no_ops);
     cx_test_register(suite, test_empty_map_size);
     cx_test_register(suite, test_empty_map_get);

mercurial