| 493 CxMap *map = cxHashMapCreate(allocator, CX_STORE_POINTERS, 0); |
493 CxMap *map = cxHashMapCreate(allocator, CX_STORE_POINTERS, 0); |
| 494 map->collection.advanced_destructor = test_advanced_destructor; |
494 map->collection.advanced_destructor = test_advanced_destructor; |
| 495 CX_TEST_CALL_SUBROUTINE(verify_any_destructor, map); |
495 CX_TEST_CALL_SUBROUTINE(verify_any_destructor, map); |
| 496 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
496 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| 497 } |
497 } |
| |
498 cx_testing_allocator_destroy(&talloc); |
| |
499 } |
| |
500 |
| |
501 static void *test_hash_map_clone_func(void *dst, const void *src, |
| |
502 const CxAllocator *al, void *data) { |
| |
503 if (dst == NULL) { |
| |
504 dst = cxMalloc(al, sizeof(int)); |
| |
505 } |
| |
506 *((int*)dst) = *((int*)src) + *((int*)data); |
| |
507 return dst; |
| |
508 } |
| |
509 |
| |
510 CX_TEST(test_hash_map_clone) { |
| |
511 CxMap *dst = cxHashMapCreateSimple(sizeof(int)); |
| |
512 CxMap *src = cxHashMapCreateSimple(sizeof(int)); |
| |
513 const char *exist_keys[] = {"k1", "k2", "k3"}; |
| |
514 int exists[] = {1, 3, 4}; |
| |
515 const char *source_keys[] = {"k4", "k2", "k5"}; |
| |
516 int source[] = {7, 9, 15}; |
| |
517 for (unsigned int i = 0 ; i < 3 ; i++) { |
| |
518 cxMapPut(dst, exist_keys[i], &exists[i]); |
| |
519 cxMapPut(src, source_keys[i], &source[i]); |
| |
520 } |
| |
521 CX_TEST_DO { |
| |
522 int c = 4; |
| |
523 size_t cloned = cxMapClone(dst, src, test_hash_map_clone_func, NULL, &c); |
| |
524 CX_TEST_ASSERT(cloned == 3); |
| |
525 CX_TEST_ASSERT(cxMapSize(dst) == 5); |
| |
526 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 1); |
| |
527 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k2")) == 13); |
| |
528 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 4); |
| |
529 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k4")) == 11); |
| |
530 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k5")) == 19); |
| |
531 CX_TEST_ASSERT(cxMapSize(src) == 3); |
| |
532 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k4")) == 7); |
| |
533 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k2")) == 9); |
| |
534 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k5")) == 15); |
| |
535 } |
| |
536 cxMapFree(dst); |
| |
537 cxMapFree(src); |
| |
538 } |
| |
539 |
| |
540 CX_TEST(test_hash_map_clone_ptr) { |
| |
541 CxTestingAllocator talloc; |
| |
542 cx_testing_allocator_init(&talloc); |
| |
543 CxAllocator *allocator = &talloc.base; |
| |
544 CxMap *dst = cxHashMapCreateSimple(CX_STORE_POINTERS); |
| |
545 cxDefineAdvancedDestructor(dst, cxFree, allocator); |
| |
546 CxMap *src = cxHashMapCreateSimple(CX_STORE_POINTERS); |
| |
547 const char *exist_keys[] = {"k1", "k2", "k3"}; |
| |
548 int exists[] = {1, 3, 4}; |
| |
549 const char *source_keys[] = {"k4", "k2", "k5"}; |
| |
550 int source[] = {7, 9, 15}; |
| |
551 for (unsigned int i = 0 ; i < 3 ; i++) { |
| |
552 int *y = cxMalloc(allocator, sizeof(int)); |
| |
553 *y = exists[i]; |
| |
554 cxMapPut(dst, exist_keys[i], y); |
| |
555 cxMapPut(src, source_keys[i], &source[i]); |
| |
556 } |
| |
557 CX_TEST_DO { |
| |
558 int c = 4; |
| |
559 size_t cloned = cxMapClone(dst, src, test_hash_map_clone_func, allocator, &c); |
| |
560 CX_TEST_ASSERT(cloned == 3); |
| |
561 CX_TEST_ASSERT(cxMapSize(dst) == 5); |
| |
562 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 1); |
| |
563 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k2")) == 13); |
| |
564 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 4); |
| |
565 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k4")) == 11); |
| |
566 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k5")) == 19); |
| |
567 CX_TEST_ASSERT(cxMapSize(src) == 3); |
| |
568 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k4")) == 7); |
| |
569 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k2")) == 9); |
| |
570 CX_TEST_ASSERT(*((int*)cxMapGet(src, "k5")) == 15); |
| |
571 |
| |
572 cxMapClear(dst); |
| |
573 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| |
574 } |
| |
575 cxMapFree(dst); |
| |
576 cxMapFree(src); |
| 498 cx_testing_allocator_destroy(&talloc); |
577 cx_testing_allocator_destroy(&talloc); |
| 499 } |
578 } |
| 500 |
579 |
| 501 CX_TEST(test_empty_map_size) { |
580 CX_TEST(test_empty_map_size) { |
| 502 CX_TEST_DO { |
581 CX_TEST_DO { |
| 840 cx_test_register(suite, test_hash_map_remove_via_iterator); |
919 cx_test_register(suite, test_hash_map_remove_via_iterator); |
| 841 cx_test_register(suite, test_hash_map_simple_destructor_objects); |
920 cx_test_register(suite, test_hash_map_simple_destructor_objects); |
| 842 cx_test_register(suite, test_hash_map_advanced_destructor_objects); |
921 cx_test_register(suite, test_hash_map_advanced_destructor_objects); |
| 843 cx_test_register(suite, test_hash_map_simple_destructor_pointers); |
922 cx_test_register(suite, test_hash_map_simple_destructor_pointers); |
| 844 cx_test_register(suite, test_hash_map_advanced_destructor_pointers); |
923 cx_test_register(suite, test_hash_map_advanced_destructor_pointers); |
| |
924 cx_test_register(suite, test_hash_map_clone); |
| |
925 cx_test_register(suite, test_hash_map_clone_ptr); |
| 845 cx_test_register(suite, test_empty_map_no_ops); |
926 cx_test_register(suite, test_empty_map_no_ops); |
| 846 cx_test_register(suite, test_empty_map_size); |
927 cx_test_register(suite, test_empty_map_size); |
| 847 cx_test_register(suite, test_empty_map_get); |
928 cx_test_register(suite, test_empty_map_get); |
| 848 cx_test_register(suite, test_empty_map_iterator); |
929 cx_test_register(suite, test_empty_map_iterator); |
| 849 cx_test_register(suite, test_null_map_iterator); |
930 cx_test_register(suite, test_null_map_iterator); |