tests/test_hash_map.c

changeset 1480
83146195a1db
parent 1474
84de0ba791af
--- a/tests/test_hash_map.c	Sat Nov 08 23:45:19 2025 +0100
+++ b/tests/test_hash_map.c	Sun Nov 09 16:12:07 2025 +0100
@@ -1155,6 +1155,109 @@
     cxMapFree(s2);
 }
 
+CX_TEST(test_hash_map_simple_clones) {
+    CxMap *a = cxHashMapCreateSimple(sizeof(int));
+    cxMapPut(a, "k1", "v1");
+    cxMapPut(a, "k2", "v2");
+    cxMapPut(a, "k3", "v3");
+    cxMapPut(a, "k4", "v4");
+
+    CxMap *b = cxHashMapCreateSimple(sizeof(int));
+    cxMapPut(b, "k0", "v0");
+    cxMapPut(b, "k2", "v2");
+    cxMapPut(b, "k5", "v5");
+
+    CxMap *c = cxHashMapCreateSimple(sizeof(int));
+    cxMapPut(c, "k3", "v3");
+    cxMapPut(c, "k4", "v4");
+    cxMapPut(c, "k5", "v5");
+
+
+    CxHashKey k;
+    CxList *kl1 = cxArrayListCreateSimple(sizeof(CxHashKey), 4);
+    cxCollectionCompareFunc(kl1, cx_hash_key_cmp);
+    k = CX_HASH_KEY("k0");
+    cxListAdd(kl1, &k);
+    k = CX_HASH_KEY("k2");
+    cxListAdd(kl1, &k);
+    k = CX_HASH_KEY("k5");
+    cxListAdd(kl1, &k);
+
+    CxList *kl2 = cxArrayListCreateSimple(sizeof(CxHashKey), 4);
+    cxCollectionCompareFunc(kl2, cx_hash_key_cmp);
+    k = CX_HASH_KEY("k3");
+    cxListAdd(kl2, &k);
+    k = CX_HASH_KEY("k4");
+    cxListAdd(kl2, &k);
+    k = CX_HASH_KEY("k5");
+    cxListAdd(kl2, &k);
+
+    CxMap *d1 = cxHashMapCreateSimple(CX_STORE_POINTERS);
+    cxDefineAdvancedDestructor(d1, cxFree, (void*)cxDefaultAllocator);
+    CxMap *d2 = cxHashMapCreateSimple(CX_STORE_POINTERS);
+    cxDefineAdvancedDestructor(d2, cxFree, (void*)cxDefaultAllocator);
+
+    CX_TEST_DO {
+        CX_TEST_ASSERT(0 == cxMapCloneSimple(d1, a));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k0"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k1"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k2"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k3"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k4"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k5"));
+
+        CX_TEST_ASSERT(0 == cxMapListDifferenceSimple(d2, d1, kl1));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k0"));
+        CX_TEST_ASSERT(cxMapContains(d2, "k1"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k2"));
+        CX_TEST_ASSERT(cxMapContains(d2, "k3"));
+        CX_TEST_ASSERT(cxMapContains(d2, "k4"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k5"));
+
+        cxMapClear(d1);
+        CX_TEST_ASSERT(0 == cxMapListIntersectionSimple(d1, d2, kl2));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k0"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k1"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k2"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k3"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k4"));
+
+        CX_TEST_ASSERT(0 == cxMapUnionSimple(d1, b));
+        CX_TEST_ASSERT(cxMapContains(d1, "k0"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k1"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k2"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k3"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k4"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k5"));
+
+        cxMapClear(d2);
+        CX_TEST_ASSERT(0 == cxMapDifferenceSimple(d2, d1, a));
+        CX_TEST_ASSERT(cxMapContains(d2, "k0"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k1"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k2"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k3"));
+        CX_TEST_ASSERT(!cxMapContains(d2, "k4"));
+        CX_TEST_ASSERT(cxMapContains(d2, "k5"));
+
+        cxMapClear(d1);
+        CX_TEST_ASSERT(0 == cxMapIntersectionSimple(d1, d2, c));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k0"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k1"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k2"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k3"));
+        CX_TEST_ASSERT(!cxMapContains(d1, "k4"));
+        CX_TEST_ASSERT(cxMapContains(d1, "k5"));
+    }
+
+    cxMapFree(a);
+    cxMapFree(b);
+    cxMapFree(c);
+    cxListFree(kl1);
+    cxListFree(kl2);
+    cxMapFree(d1);
+    cxMapFree(d2);
+}
+
 CX_TEST(test_empty_map_size) {
     CX_TEST_DO {
         CX_TEST_ASSERT(cxEmptyMap->collection.size == 0);
@@ -1520,6 +1623,7 @@
     cx_test_register(suite, test_hash_map_union);
     cx_test_register(suite, test_hash_map_union_ptr);
     cx_test_register(suite, test_hash_map_union_alloc_fail);
+    cx_test_register(suite, test_hash_map_simple_clones);
     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