| 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); |