Thu, 23 Oct 2025 17:38:44 +0200
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);