diff -r 2dd841e364af -r 64919f63f059 tests/test_map.cpp --- a/tests/test_map.cpp Tue Apr 18 18:01:41 2023 +0200 +++ b/tests/test_map.cpp Tue Apr 18 19:10:45 2023 +0200 @@ -282,7 +282,7 @@ TEST(CxHashMap, Clear) { CxTestingAllocator allocator; auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); - + cxMapPut(map, cx_hash_key_str("key 1"), (void *) "val 1"); cxMapPut(map, cx_hash_key_str("key 2"), (void *) "val 2"); cxMapPut(map, cx_hash_key_str("key 3"), (void *) "val 3"); @@ -344,3 +344,100 @@ EXPECT_TRUE(allocator.verify()); } +static void test_simple_destructor(void *data) { + strcpy((char *) data, "OK"); +} + +static void test_advanced_destructor( + [[maybe_unused]] void *unused, + void *data +) { + strcpy((char *) data, "OK"); +} + +static void verify_any_destructor(CxMap *map) { + auto k1 = cx_hash_key_str("key 1"); + auto k2 = cx_hash_key_str("key 2"); + auto k3 = cx_hash_key_str("key 3"); + auto k4 = cx_hash_key_str("key 4"); + auto k5 = cx_hash_key_str("key 5"); + + char v1[] = "val 1"; + char v2[] = "val 2"; + char v3[] = "val 3"; + char v4[] = "val 4"; + char v5[] = "val 5"; + + cxMapPut(map, k1, (void *) v1); + cxMapPut(map, k2, (void *) v2); + cxMapPut(map, k3, (void *) v3); + cxMapPut(map, k4, (void *) v4); + + cxMapRemove(map, k2); + auto r = cxMapRemoveAndGet(map, k3); + cxMapDetach(map, k1); + + EXPECT_STREQ(v1, "val 1"); + EXPECT_STREQ(v2, "OK"); + EXPECT_STREQ(v3, "val 3"); + EXPECT_STREQ(v4, "val 4"); + EXPECT_STREQ(v5, "val 5"); + EXPECT_EQ(r, v3); + + cxMapClear(map); + + EXPECT_STREQ(v1, "val 1"); + EXPECT_STREQ(v2, "OK"); + EXPECT_STREQ(v3, "val 3"); + EXPECT_STREQ(v4, "OK"); + EXPECT_STREQ(v5, "val 5"); + + cxMapPut(map, k1, (void *) v1); + cxMapPut(map, k3, (void *) v3); + cxMapPut(map, k5, (void *) v5); + + { + auto iter = cxMapMutIteratorKeys(map); + cx_foreach(CxHashKey*, key, iter) { + if (key->data.cstr[4] == '1') cxIteratorFlagRemoval(iter); + } + } + { + auto iter = cxMapMutIteratorValues(map); + cx_foreach(char*, v, iter) { + if (v[4] == '5') cxIteratorFlagRemoval(iter); + } + } + + EXPECT_STREQ(v1, "OK"); + EXPECT_STREQ(v2, "OK"); + EXPECT_STREQ(v3, "val 3"); + EXPECT_STREQ(v4, "OK"); + EXPECT_STREQ(v5, "OK"); + + v1[0] = v2[0] = v4[0] = v5[0] = 'c'; + + cxMapDestroy(map); + + EXPECT_STREQ(v1, "cK"); + EXPECT_STREQ(v2, "cK"); + EXPECT_STREQ(v3, "OK"); + EXPECT_STREQ(v4, "cK"); + EXPECT_STREQ(v5, "cK"); +} + +TEST(CxHashMap, SimpleDestructor) { + CxTestingAllocator allocator; + auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); + map->simple_destructor = test_simple_destructor; + verify_any_destructor(map); + EXPECT_TRUE(allocator.verify()); +} + +TEST(CxHashMap, AdvancedDestructor) { + CxTestingAllocator allocator; + auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); + map->advanced_destructor = test_advanced_destructor; + verify_any_destructor(map); + EXPECT_TRUE(allocator.verify()); +}