tests/test_hash_map.c

changeset 1450
09a73312d5ec
parent 1448
0f0fe7311b76
equal deleted inserted replaced
1449:bbca398783ed 1450:09a73312d5ec
653 cxMapFree(dst); 653 cxMapFree(dst);
654 cxMapFree(s1); 654 cxMapFree(s1);
655 cxMapFree(s2); 655 cxMapFree(s2);
656 } 656 }
657 657
658 CX_TEST(test_hash_map_difference_alloc_fail) {
659 CxMap *dst = cxHashMapCreateSimple(sizeof(int));
660
661 CxMap *s1 = cxHashMapCreateSimple(CX_STORE_POINTERS);
662 CxMap *s2 = cxHashMapCreateSimple(CX_STORE_POINTERS);
663 const char *s1_keys[] = {"k1", "k2", "k3"};
664 int s1_values[] = {1, 3, 4};
665 const char *s2_keys[] = {"k4", "k2", "k5"};
666 int s2_values[] = {7, 9, 15};
667 for (unsigned int i = 0 ; i < 3 ; i++) {
668 cxMapPut(s1, s1_keys[i], &s1_values[i]);
669 cxMapPut(s2, s2_keys[i], &s2_values[i]);
670 }
671 CX_TEST_DO {
672 int c = 4;
673 test_hash_map_clone_func_max_clones = 1;
674 CX_TEST_ASSERT(1 == cxMapDifference(dst, s1, s2, test_hash_map_clone_func, NULL, &c));
675 CX_TEST_ASSERT(cxMapSize(dst) == 1);
676 // the concrete element which is affected might change when the hash function changes
677 CX_TEST_ASSERT(cxMapGet(dst, "k1") == NULL);
678 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
679 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
680 }
681 cxMapFree(dst);
682 cxMapFree(s1);
683 cxMapFree(s2);
684 }
685
658 CX_TEST(test_hash_map_list_difference) { 686 CX_TEST(test_hash_map_list_difference) {
659 CxMap *dst = cxHashMapCreateSimple(sizeof(int)); 687 CxMap *dst = cxHashMapCreateSimple(sizeof(int));
660 CxMap *src = cxHashMapCreateSimple(sizeof(int)); 688 CxMap *src = cxHashMapCreateSimple(sizeof(int));
661 CxList *keys = cxArrayListCreate(NULL, cx_hash_key_cmp, sizeof(CxHashKey), 4); 689 CxList *keys = cxArrayListCreate(NULL, cx_hash_key_cmp, sizeof(CxHashKey), 4);
662 690
676 CX_TEST_ASSERT(0 == cxMapListDifference(dst, src, keys, test_hash_map_clone_func, NULL, &c)); 704 CX_TEST_ASSERT(0 == cxMapListDifference(dst, src, keys, test_hash_map_clone_func, NULL, &c));
677 CX_TEST_ASSERT(cxMapSize(dst) == 2); 705 CX_TEST_ASSERT(cxMapSize(dst) == 2);
678 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5); 706 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
679 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL); 707 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
680 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8); 708 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
709 }
710 cxMapFree(dst);
711 cxMapFree(src);
712 cxListFree(keys);
713 }
714
715 CX_TEST(test_hash_map_list_difference_alloc_fail) {
716 CxMap *dst = cxHashMapCreateSimple(sizeof(int));
717 CxMap *src = cxHashMapCreateSimple(sizeof(int));
718 CxList *keys = cxArrayListCreate(NULL, cx_hash_key_cmp, sizeof(CxHashKey), 4);
719
720 const char *src_keys[] = {"k1", "k2", "k3"};
721 int src_values[] = {1, 3, 4};
722 for (unsigned int i = 0 ; i < 3 ; i++) {
723 cxMapPut(src, src_keys[i], &src_values[i]);
724 }
725 const char *k[] = {"k4", "k2", "k5"};
726 for (unsigned int i = 0 ; i < 3 ; i++) {
727 CxHashKey key = CX_HASH_KEY(k[i]);
728 cxListAdd(keys, &key);
729 }
730 CX_TEST_DO {
731 int c = 4;
732 test_hash_map_clone_func_max_clones = 1;
733 CX_TEST_ASSERT(1 == cxMapListDifference(dst, src, keys, test_hash_map_clone_func, NULL, &c));
734 CX_TEST_ASSERT(cxMapSize(dst) == 1);
735 // the concrete element which is affected might change when the hash function changes
736 CX_TEST_ASSERT(cxMapGet(dst, "k1") == NULL);
737 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
738 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
739 }
740 cxMapFree(dst);
741 cxMapFree(src);
742 cxListFree(keys);
743 }
744
745 CX_TEST(test_hash_map_difference_non_empty_target) {
746 CxMap *dst = cxHashMapCreateSimple(CX_STORE_POINTERS);
747 cxDefineAdvancedDestructor(dst, cxFree, (void*) cxDefaultAllocator);
748
749 CxMap *s1 = cxHashMapCreateSimple(sizeof(int));
750 CxMap *s2 = cxHashMapCreateSimple(sizeof(int));
751 const char *s1_keys[] = {"k1", "k2", "k3"};
752 int s1_values[] = {1, 3, 4};
753 const char *s2_keys[] = {"k4", "k2", "k5"};
754 int s2_values[] = {7, 9, 15};
755 for (unsigned int i = 0 ; i < 3 ; i++) {
756 cxMapPut(s1, s1_keys[i], &s1_values[i]);
757 cxMapPut(s2, s2_keys[i], &s2_values[i]);
758 }
759
760 // add k5 to dst which is not in src, but shall also be not in the difference
761 int *k5 = cxMallocDefault(sizeof(int));
762 *k5 = 1337;
763 cxMapPut(dst, "k5",k5);
764
765 CX_TEST_DO {
766 int c = 4;
767 test_hash_map_clone_func_max_clones = 100; // no limit
768 CX_TEST_ASSERT(0 == cxMapDifference(dst, s1, s2, test_hash_map_clone_func, NULL, &c));
769 CX_TEST_ASSERT(cxMapSize(dst) == 2);
770 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
771 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
772 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
773 CX_TEST_ASSERT(cxMapGet(dst, "k5") == NULL);
774 }
775 cxMapFree(dst);
776 cxMapFree(s1);
777 cxMapFree(s2);
778 }
779
780 CX_TEST(test_hash_map_list_difference_non_empty_target) {
781 CxMap *dst = cxHashMapCreateSimple(CX_STORE_POINTERS);
782 cxDefineAdvancedDestructor(dst, cxFree, (void*) cxDefaultAllocator);
783 CxMap *src = cxHashMapCreateSimple(sizeof(int));
784 CxList *keys = cxArrayListCreate(NULL, cx_hash_key_cmp, sizeof(CxHashKey), 4);
785
786 const char *src_keys[] = {"k1", "k2", "k3"};
787 int src_values[] = {1, 3, 4};
788 for (unsigned int i = 0 ; i < 3 ; i++) {
789 cxMapPut(src, src_keys[i], &src_values[i]);
790 }
791 const char *k[] = {"k4", "k2", "k5"};
792 for (unsigned int i = 0 ; i < 3 ; i++) {
793 CxHashKey key = CX_HASH_KEY(k[i]);
794 cxListAdd(keys, &key);
795 }
796
797 // add k5 to dst which is not in src, but shall also be not in the difference
798 int *k5 = cxMallocDefault(sizeof(int));
799 *k5 = 1337;
800 cxMapPut(dst, "k5",k5);
801
802 CX_TEST_DO {
803 int c = 4;
804 test_hash_map_clone_func_max_clones = 100; // no limit
805 CX_TEST_ASSERT(0 == cxMapListDifference(dst, src, keys, test_hash_map_clone_func, NULL, &c));
806 CX_TEST_ASSERT(cxMapSize(dst) == 2);
807 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k1")) == 5);
808 CX_TEST_ASSERT(cxMapGet(dst, "k2") == NULL);
809 CX_TEST_ASSERT(*((int*)cxMapGet(dst, "k3")) == 8);
810 CX_TEST_ASSERT(cxMapGet(dst, "k5") == NULL);
681 } 811 }
682 cxMapFree(dst); 812 cxMapFree(dst);
683 cxMapFree(src); 813 cxMapFree(src);
684 cxListFree(keys); 814 cxListFree(keys);
685 } 815 }
1068 cx_test_register(suite, test_hash_map_clone_alloc_fail); 1198 cx_test_register(suite, test_hash_map_clone_alloc_fail);
1069 cx_test_register(suite, test_hash_map_clone_ptr); 1199 cx_test_register(suite, test_hash_map_clone_ptr);
1070 cx_test_register(suite, test_hash_map_difference); 1200 cx_test_register(suite, test_hash_map_difference);
1071 cx_test_register(suite, test_hash_map_difference_ptr); 1201 cx_test_register(suite, test_hash_map_difference_ptr);
1072 cx_test_register(suite, test_hash_map_list_difference); 1202 cx_test_register(suite, test_hash_map_list_difference);
1203 cx_test_register(suite, test_hash_map_difference_alloc_fail);
1204 cx_test_register(suite, test_hash_map_list_difference_alloc_fail);
1205 cx_test_register(suite, test_hash_map_difference_non_empty_target);
1206 cx_test_register(suite, test_hash_map_list_difference_non_empty_target);
1073 cx_test_register(suite, test_empty_map_no_ops); 1207 cx_test_register(suite, test_empty_map_no_ops);
1074 cx_test_register(suite, test_empty_map_size); 1208 cx_test_register(suite, test_empty_map_size);
1075 cx_test_register(suite, test_empty_map_get); 1209 cx_test_register(suite, test_empty_map_get);
1076 cx_test_register(suite, test_empty_map_iterator); 1210 cx_test_register(suite, test_empty_map_iterator);
1077 cx_test_register(suite, test_null_map_iterator); 1211 cx_test_register(suite, test_null_map_iterator);

mercurial