1.1 --- a/tests/test_map.cpp Tue Apr 18 18:01:41 2023 +0200 1.2 +++ b/tests/test_map.cpp Tue Apr 18 19:10:45 2023 +0200 1.3 @@ -282,7 +282,7 @@ 1.4 TEST(CxHashMap, Clear) { 1.5 CxTestingAllocator allocator; 1.6 auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); 1.7 - 1.8 + 1.9 cxMapPut(map, cx_hash_key_str("key 1"), (void *) "val 1"); 1.10 cxMapPut(map, cx_hash_key_str("key 2"), (void *) "val 2"); 1.11 cxMapPut(map, cx_hash_key_str("key 3"), (void *) "val 3"); 1.12 @@ -344,3 +344,100 @@ 1.13 EXPECT_TRUE(allocator.verify()); 1.14 } 1.15 1.16 +static void test_simple_destructor(void *data) { 1.17 + strcpy((char *) data, "OK"); 1.18 +} 1.19 + 1.20 +static void test_advanced_destructor( 1.21 + [[maybe_unused]] void *unused, 1.22 + void *data 1.23 +) { 1.24 + strcpy((char *) data, "OK"); 1.25 +} 1.26 + 1.27 +static void verify_any_destructor(CxMap *map) { 1.28 + auto k1 = cx_hash_key_str("key 1"); 1.29 + auto k2 = cx_hash_key_str("key 2"); 1.30 + auto k3 = cx_hash_key_str("key 3"); 1.31 + auto k4 = cx_hash_key_str("key 4"); 1.32 + auto k5 = cx_hash_key_str("key 5"); 1.33 + 1.34 + char v1[] = "val 1"; 1.35 + char v2[] = "val 2"; 1.36 + char v3[] = "val 3"; 1.37 + char v4[] = "val 4"; 1.38 + char v5[] = "val 5"; 1.39 + 1.40 + cxMapPut(map, k1, (void *) v1); 1.41 + cxMapPut(map, k2, (void *) v2); 1.42 + cxMapPut(map, k3, (void *) v3); 1.43 + cxMapPut(map, k4, (void *) v4); 1.44 + 1.45 + cxMapRemove(map, k2); 1.46 + auto r = cxMapRemoveAndGet(map, k3); 1.47 + cxMapDetach(map, k1); 1.48 + 1.49 + EXPECT_STREQ(v1, "val 1"); 1.50 + EXPECT_STREQ(v2, "OK"); 1.51 + EXPECT_STREQ(v3, "val 3"); 1.52 + EXPECT_STREQ(v4, "val 4"); 1.53 + EXPECT_STREQ(v5, "val 5"); 1.54 + EXPECT_EQ(r, v3); 1.55 + 1.56 + cxMapClear(map); 1.57 + 1.58 + EXPECT_STREQ(v1, "val 1"); 1.59 + EXPECT_STREQ(v2, "OK"); 1.60 + EXPECT_STREQ(v3, "val 3"); 1.61 + EXPECT_STREQ(v4, "OK"); 1.62 + EXPECT_STREQ(v5, "val 5"); 1.63 + 1.64 + cxMapPut(map, k1, (void *) v1); 1.65 + cxMapPut(map, k3, (void *) v3); 1.66 + cxMapPut(map, k5, (void *) v5); 1.67 + 1.68 + { 1.69 + auto iter = cxMapMutIteratorKeys(map); 1.70 + cx_foreach(CxHashKey*, key, iter) { 1.71 + if (key->data.cstr[4] == '1') cxIteratorFlagRemoval(iter); 1.72 + } 1.73 + } 1.74 + { 1.75 + auto iter = cxMapMutIteratorValues(map); 1.76 + cx_foreach(char*, v, iter) { 1.77 + if (v[4] == '5') cxIteratorFlagRemoval(iter); 1.78 + } 1.79 + } 1.80 + 1.81 + EXPECT_STREQ(v1, "OK"); 1.82 + EXPECT_STREQ(v2, "OK"); 1.83 + EXPECT_STREQ(v3, "val 3"); 1.84 + EXPECT_STREQ(v4, "OK"); 1.85 + EXPECT_STREQ(v5, "OK"); 1.86 + 1.87 + v1[0] = v2[0] = v4[0] = v5[0] = 'c'; 1.88 + 1.89 + cxMapDestroy(map); 1.90 + 1.91 + EXPECT_STREQ(v1, "cK"); 1.92 + EXPECT_STREQ(v2, "cK"); 1.93 + EXPECT_STREQ(v3, "OK"); 1.94 + EXPECT_STREQ(v4, "cK"); 1.95 + EXPECT_STREQ(v5, "cK"); 1.96 +} 1.97 + 1.98 +TEST(CxHashMap, SimpleDestructor) { 1.99 + CxTestingAllocator allocator; 1.100 + auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); 1.101 + map->simple_destructor = test_simple_destructor; 1.102 + verify_any_destructor(map); 1.103 + EXPECT_TRUE(allocator.verify()); 1.104 +} 1.105 + 1.106 +TEST(CxHashMap, AdvancedDestructor) { 1.107 + CxTestingAllocator allocator; 1.108 + auto map = cxHashMapCreate(&allocator, CX_STORE_POINTERS, 0); 1.109 + map->advanced_destructor = test_advanced_destructor; 1.110 + verify_any_destructor(map); 1.111 + EXPECT_TRUE(allocator.verify()); 1.112 +}