--- 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);