tests/test_hash_map.c

changeset 1448
0f0fe7311b76
parent 1444
dd9dcbb39c2f
child 1450
09a73312d5ec
equal deleted inserted replaced
1447:aaf85b3e9601 1448:0f0fe7311b76
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include "cx/test.h" 29 #include "cx/test.h"
30 #include "util_allocator.h" 30 #include "util_allocator.h"
31 #include "cx/array_list.h"
32 #include "cx/list.h"
31 33
32 #include "cx/hash_map.h" 34 #include "cx/hash_map.h"
33 35
34 CX_TEST(test_hash_map_create) { 36 CX_TEST(test_hash_map_create) {
35 CxTestingAllocator talloc; 37 CxTestingAllocator talloc;
621 cxMapClear(dst); 623 cxMapClear(dst);
622 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); 624 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
623 } 625 }
624 cxMapFree(dst); 626 cxMapFree(dst);
625 cxMapFree(src); 627 cxMapFree(src);
628 cx_testing_allocator_destroy(&talloc);
629 }
630
631 CX_TEST(test_hash_map_difference) {
632 CxMap *dst = cxHashMapCreateSimple(sizeof(int));
633
634 CxMap *s1 = cxHashMapCreateSimple(CX_STORE_POINTERS);
635 CxMap *s2 = cxHashMapCreateSimple(CX_STORE_POINTERS);
636 const char *s1_keys[] = {"k1", "k2", "k3"};
637 int s1_values[] = {1, 3, 4};
638 const char *s2_keys[] = {"k4", "k2", "k5"};
639 int s2_values[] = {7, 9, 15};
640 for (unsigned int i = 0 ; i < 3 ; i++) {
641 cxMapPut(s1, s1_keys[i], &s1_values[i]);
642 cxMapPut(s2, s2_keys[i], &s2_values[i]);
643 }
644 CX_TEST_DO {
645 int c = 4;
646 test_hash_map_clone_func_max_clones = 100; // no limit
647 CX_TEST_ASSERT(0 == cxMapDifference(dst, s1, s2, test_hash_map_clone_func, NULL, &c));
648 CX_TEST_ASSERT(cxMapSize(dst) == 2);
649 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
650 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
651 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
652 }
653 cxMapFree(dst);
654 cxMapFree(s1);
655 cxMapFree(s2);
656 }
657
658 CX_TEST(test_hash_map_list_difference) {
659 CxMap *dst = cxHashMapCreateSimple(sizeof(int));
660 CxMap *src = cxHashMapCreateSimple(sizeof(int));
661 CxList *keys = cxArrayListCreate(NULL, cx_hash_key_cmp, sizeof(CxHashKey), 4);
662
663 const char *src_keys[] = {"k1", "k2", "k3"};
664 int src_values[] = {1, 3, 4};
665 for (unsigned int i = 0 ; i < 3 ; i++) {
666 cxMapPut(src, src_keys[i], &src_values[i]);
667 }
668 const char *k[] = {"k4", "k2", "k5"};
669 for (unsigned int i = 0 ; i < 3 ; i++) {
670 CxHashKey key = CX_HASH_KEY(k[i]);
671 cxListAdd(keys, &key);
672 }
673 CX_TEST_DO {
674 int c = 4;
675 test_hash_map_clone_func_max_clones = 100; // no limit
676 CX_TEST_ASSERT(0 == cxMapListDifference(dst, src, keys, test_hash_map_clone_func, NULL, &c));
677 CX_TEST_ASSERT(cxMapSize(dst) == 2);
678 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
679 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
680 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
681 }
682 cxMapFree(dst);
683 cxMapFree(src);
684 cxListFree(keys);
685 }
686
687 CX_TEST(test_hash_map_difference_ptr) {
688 CxTestingAllocator talloc;
689 cx_testing_allocator_init(&talloc);
690 CxAllocator *allocator = &talloc.base;
691 CxMap *dst = cxHashMapCreateSimple(CX_STORE_POINTERS);
692 cxDefineAdvancedDestructor(dst, cxFree, allocator);
693
694 CxMap *s1 = cxHashMapCreateSimple(CX_STORE_POINTERS);
695 CxMap *s2 = cxHashMapCreateSimple(CX_STORE_POINTERS);
696 const char *s1_keys[] = {"k1", "k2", "k3"};
697 int s1_values[] = {1, 3, 4};
698 const char *s2_keys[] = {"k4", "k2", "k5"};
699 int s2_values[] = {7, 9, 15};
700 for (unsigned int i = 0 ; i < 3 ; i++) {
701 cxMapPut(s1, s1_keys[i], &s1_values[i]);
702 cxMapPut(s2, s2_keys[i], &s2_values[i]);
703 }
704 CX_TEST_DO {
705 int c = 4;
706 test_hash_map_clone_func_max_clones = 100; // no limit
707 CX_TEST_ASSERT(0 == cxMapDifference(dst, s1, s2, test_hash_map_clone_func, allocator, &c));
708 CX_TEST_ASSERT(cxMapSize(dst) == 2);
709 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
710 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
711 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
712
713 cxMapClear(dst);
714 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
715 }
716 cxMapFree(dst);
717 cxMapFree(s1);
718 cxMapFree(s2);
626 cx_testing_allocator_destroy(&talloc); 719 cx_testing_allocator_destroy(&talloc);
627 } 720 }
628 721
629 CX_TEST(test_empty_map_size) { 722 CX_TEST(test_empty_map_size) {
630 CX_TEST_DO { 723 CX_TEST_DO {
972 cx_test_register(suite, test_hash_map_simple_destructor_pointers); 1065 cx_test_register(suite, test_hash_map_simple_destructor_pointers);
973 cx_test_register(suite, test_hash_map_advanced_destructor_pointers); 1066 cx_test_register(suite, test_hash_map_advanced_destructor_pointers);
974 cx_test_register(suite, test_hash_map_clone); 1067 cx_test_register(suite, test_hash_map_clone);
975 cx_test_register(suite, test_hash_map_clone_alloc_fail); 1068 cx_test_register(suite, test_hash_map_clone_alloc_fail);
976 cx_test_register(suite, test_hash_map_clone_ptr); 1069 cx_test_register(suite, test_hash_map_clone_ptr);
1070 cx_test_register(suite, test_hash_map_difference);
1071 cx_test_register(suite, test_hash_map_difference_ptr);
1072 cx_test_register(suite, test_hash_map_list_difference);
977 cx_test_register(suite, test_empty_map_no_ops); 1073 cx_test_register(suite, test_empty_map_no_ops);
978 cx_test_register(suite, test_empty_map_size); 1074 cx_test_register(suite, test_empty_map_size);
979 cx_test_register(suite, test_empty_map_get); 1075 cx_test_register(suite, test_empty_map_get);
980 cx_test_register(suite, test_empty_map_iterator); 1076 cx_test_register(suite, test_empty_map_iterator);
981 cx_test_register(suite, test_null_map_iterator); 1077 cx_test_register(suite, test_null_map_iterator);

mercurial