838 CX_TEST(test_empty_list_noops) { |
838 CX_TEST(test_empty_list_noops) { |
839 CX_TEST_DO { |
839 CX_TEST_DO { |
840 CxList copy = *cxEmptyList; |
840 CxList copy = *cxEmptyList; |
841 cxListSort(cxEmptyList); |
841 cxListSort(cxEmptyList); |
842 cxListClear(cxEmptyList); |
842 cxListClear(cxEmptyList); |
843 cxListDestroy(cxEmptyList); |
843 cxListFree(cxEmptyList); |
844 CX_TEST_ASSERT(0 == memcmp(©, cxEmptyList, sizeof(CxList))); // NOLINT(*-suspicious-memory-comparison) |
844 CX_TEST_ASSERT(0 == memcmp(©, cxEmptyList, sizeof(CxList))); // NOLINT(*-suspicious-memory-comparison) |
845 } |
845 } |
846 } |
846 } |
847 |
847 |
848 CX_TEST(test_empty_list_at) { |
848 CX_TEST(test_empty_list_at) { |
878 CX_TEST_ASSERT(0 < cxListCompare(ll, cxEmptyList)); |
878 CX_TEST_ASSERT(0 < cxListCompare(ll, cxEmptyList)); |
879 CX_TEST_ASSERT(0 < cxListCompare(al, cxEmptyList)); |
879 CX_TEST_ASSERT(0 < cxListCompare(al, cxEmptyList)); |
880 CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, ll)); |
880 CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, ll)); |
881 CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, al)); |
881 CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, al)); |
882 } |
882 } |
883 cxListDestroy(ll); |
883 cxListFree(ll); |
884 cxListDestroy(al); |
884 cxListFree(al); |
885 } |
885 } |
886 |
886 |
887 CX_TEST(test_list_ll_create) { |
887 CX_TEST(test_list_ll_create) { |
888 CxTestingAllocator talloc; |
888 CxTestingAllocator talloc; |
889 cx_testing_allocator_init(&talloc); |
889 cx_testing_allocator_init(&talloc); |
897 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
897 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
898 CX_TEST_ASSERT(cxListSize(list) == 0); |
898 CX_TEST_ASSERT(cxListSize(list) == 0); |
899 CX_TEST_ASSERT(list->collection.allocator == alloc); |
899 CX_TEST_ASSERT(list->collection.allocator == alloc); |
900 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
900 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
901 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
901 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
902 cxListDestroy(list); |
902 cxListFree(list); |
903 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
903 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
904 } |
904 } |
905 cx_testing_allocator_destroy(&talloc); |
905 cx_testing_allocator_destroy(&talloc); |
906 } |
906 } |
907 |
907 |
916 CX_TEST_ASSERT(cxListSize(list) == 0); |
916 CX_TEST_ASSERT(cxListSize(list) == 0); |
917 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
917 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
918 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
918 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
919 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
919 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
920 } |
920 } |
921 cxListDestroy(list); |
921 cxListFree(list); |
922 } |
922 } |
923 |
923 |
924 CX_TEST(test_list_ll_store_pointers) { |
924 CX_TEST(test_list_ll_store_pointers) { |
925 CxList *list = cxLinkedListCreateSimple(47); |
925 CxList *list = cxLinkedListCreateSimple(47); |
926 CX_TEST_DO { |
926 CX_TEST_DO { |
933 cxListStoreObjects(list); |
933 cxListStoreObjects(list); |
934 CX_TEST_ASSERT(list->cl != NULL); |
934 CX_TEST_ASSERT(list->cl != NULL); |
935 CX_TEST_ASSERT(list->climpl == NULL); |
935 CX_TEST_ASSERT(list->climpl == NULL); |
936 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
936 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
937 } |
937 } |
938 cxListDestroy(list); |
938 cxListFree(list); |
939 } |
939 } |
940 |
940 |
941 CX_TEST(test_list_ll_create_simple_for_pointers) { |
941 CX_TEST(test_list_ll_create_simple_for_pointers) { |
942 CxList *list = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
942 CxList *list = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
943 CX_TEST_DO { |
943 CX_TEST_DO { |
949 CX_TEST_ASSERT(cxListSize(list) == 0); |
949 CX_TEST_ASSERT(cxListSize(list) == 0); |
950 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
950 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
951 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
951 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
952 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
952 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
953 } |
953 } |
954 cxListDestroy(list); |
954 cxListFree(list); |
955 } |
955 } |
956 |
956 |
957 CX_TEST(test_list_arl_create) { |
957 CX_TEST(test_list_arl_create) { |
958 CxTestingAllocator talloc; |
958 CxTestingAllocator talloc; |
959 cx_testing_allocator_init(&talloc); |
959 cx_testing_allocator_init(&talloc); |
967 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
967 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
968 CX_TEST_ASSERT(cxListSize(list) == 0); |
968 CX_TEST_ASSERT(cxListSize(list) == 0); |
969 CX_TEST_ASSERT(list->collection.allocator == alloc); |
969 CX_TEST_ASSERT(list->collection.allocator == alloc); |
970 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
970 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
971 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
971 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
972 cxListDestroy(list); |
972 cxListFree(list); |
973 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
973 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
974 } |
974 } |
975 cx_testing_allocator_destroy(&talloc); |
975 cx_testing_allocator_destroy(&talloc); |
976 } |
976 } |
977 |
977 |
986 CX_TEST_ASSERT(cxListSize(list) == 0); |
986 CX_TEST_ASSERT(cxListSize(list) == 0); |
987 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
987 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
988 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
988 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
989 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
989 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
990 } |
990 } |
991 cxListDestroy(list); |
991 cxListFree(list); |
992 } |
992 } |
993 |
993 |
994 CX_TEST(test_list_arl_create_simple_for_pointers) { |
994 CX_TEST(test_list_arl_create_simple_for_pointers) { |
995 CxList *list = cxArrayListCreateSimple(CX_STORE_POINTERS, 8); |
995 CxList *list = cxArrayListCreateSimple(CX_STORE_POINTERS, 8); |
996 CX_TEST_DO { |
996 CX_TEST_DO { |
1002 CX_TEST_ASSERT(cxListSize(list) == 0); |
1002 CX_TEST_ASSERT(cxListSize(list) == 0); |
1003 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
1003 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
1004 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
1004 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
1005 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
1005 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
1006 } |
1006 } |
1007 cxListDestroy(list); |
1007 cxListFree(list); |
1008 } |
1008 } |
1009 |
1009 |
1010 static void test_fake_simple_int_destr(void *elem) { |
1010 static void test_fake_simple_int_destr(void *elem) { |
1011 *(int *) elem = 42; |
1011 *(int *) elem = 42; |
1012 } |
1012 } |
1018 CX_TEST_DO { |
1018 CX_TEST_DO { |
1019 void *item = cxMalloc(alloc, sizeof(int)); |
1019 void *item = cxMalloc(alloc, sizeof(int)); |
1020 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1020 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1021 cxListAdd(list, item); |
1021 cxListAdd(list, item); |
1022 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1022 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1023 cxListDestroy(list); |
1023 cxListFree(list); |
1024 // item is not yet freed |
1024 // item is not yet freed |
1025 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1025 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1026 cxFree(alloc, item); |
1026 cxFree(alloc, item); |
1027 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1027 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1028 } |
1028 } |
1033 CX_TEST_DO { |
1033 CX_TEST_DO { |
1034 int item = 0; |
1034 int item = 0; |
1035 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1035 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1036 list->collection.simple_destructor = test_fake_simple_int_destr; |
1036 list->collection.simple_destructor = test_fake_simple_int_destr; |
1037 cxListAdd(list, &item); |
1037 cxListAdd(list, &item); |
1038 cxListDestroy(list); |
1038 cxListFree(list); |
1039 CX_TEST_ASSERT(item == 42); |
1039 CX_TEST_ASSERT(item == 42); |
1040 } |
1040 } |
1041 } |
1041 } |
1042 |
1042 |
1043 CX_TEST(test_list_pll_destroy_adv_destr) { |
1043 CX_TEST(test_list_pll_destroy_adv_destr) { |
1049 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1049 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
1050 list->collection.destructor_data = alloc; |
1050 list->collection.destructor_data = alloc; |
1051 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
1051 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
1052 cxListAdd(list, item); |
1052 cxListAdd(list, item); |
1053 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1053 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1054 cxListDestroy(list); |
1054 cxListFree(list); |
1055 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1055 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1056 } |
1056 } |
1057 cx_testing_allocator_destroy(&talloc); |
1057 cx_testing_allocator_destroy(&talloc); |
1058 } |
1058 } |
1059 |
1059 |
1064 CX_TEST_DO { |
1064 CX_TEST_DO { |
1065 void *item = cxMalloc(alloc, sizeof(int)); |
1065 void *item = cxMalloc(alloc, sizeof(int)); |
1066 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1066 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1067 cxListAdd(list, item); |
1067 cxListAdd(list, item); |
1068 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1068 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1069 cxListDestroy(list); |
1069 cxListFree(list); |
1070 // item is not yet freed |
1070 // item is not yet freed |
1071 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1071 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1072 cxFree(alloc, item); |
1072 cxFree(alloc, item); |
1073 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1073 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1074 } |
1074 } |
1079 CX_TEST_DO { |
1079 CX_TEST_DO { |
1080 int item = 0; |
1080 int item = 0; |
1081 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1081 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1082 list->collection.simple_destructor = test_fake_simple_int_destr; |
1082 list->collection.simple_destructor = test_fake_simple_int_destr; |
1083 cxListAdd(list, &item); |
1083 cxListAdd(list, &item); |
1084 cxListDestroy(list); |
1084 cxListFree(list); |
1085 CX_TEST_ASSERT(item == 42); |
1085 CX_TEST_ASSERT(item == 42); |
1086 } |
1086 } |
1087 } |
1087 } |
1088 |
1088 |
1089 CX_TEST(test_list_parl_destroy_adv_destr) { |
1089 CX_TEST(test_list_parl_destroy_adv_destr) { |
1095 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1095 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
1096 list->collection.destructor_data = alloc; |
1096 list->collection.destructor_data = alloc; |
1097 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
1097 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
1098 cxListAdd(list, item); |
1098 cxListAdd(list, item); |
1099 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1099 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
1100 cxListDestroy(list); |
1100 cxListFree(list); |
1101 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1101 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
1102 } |
1102 } |
1103 cx_testing_allocator_destroy(&talloc); |
1103 cx_testing_allocator_destroy(&talloc); |
1104 } |
1104 } |
1105 |
1105 |
1107 CxTestingAllocator talloc; \ |
1107 CxTestingAllocator talloc; \ |
1108 cx_testing_allocator_init(&talloc); \ |
1108 cx_testing_allocator_init(&talloc); \ |
1109 CxAllocator *alloc = &talloc.base; \ |
1109 CxAllocator *alloc = &talloc.base; \ |
1110 CX_TEST_DO { |
1110 CX_TEST_DO { |
1111 #define tear_down_combo \ |
1111 #define tear_down_combo \ |
1112 cxListDestroy(list); \ |
1112 cxListFree(list); \ |
1113 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));\ |
1113 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));\ |
1114 } \ |
1114 } \ |
1115 cx_testing_allocator_destroy(&talloc); |
1115 cx_testing_allocator_destroy(&talloc); |
1116 #define roll_out_test_invokers(name) \ |
1116 #define roll_out_test_invokers(name) \ |
1117 CX_TEST(test_list_ll_##name) { \ |
1117 CX_TEST(test_list_ll_##name) { \ |
1699 const size_t len = 47; \ |
1699 const size_t len = 47; \ |
1700 int *testdata = int_test_data_added_to_list(list, isptrlist, len); \ |
1700 int *testdata = int_test_data_added_to_list(list, isptrlist, len); \ |
1701 CxList *other = otherctr; \ |
1701 CxList *other = otherctr; \ |
1702 for (size_t i = 0; i < len; i++) cxListAdd(other, &testdata[i]); \ |
1702 for (size_t i = 0; i < len; i++) cxListAdd(other, &testdata[i]); \ |
1703 CX_TEST_CALL_SUBROUTINE(test_list_verify_compare, list, other); \ |
1703 CX_TEST_CALL_SUBROUTINE(test_list_verify_compare, list, other); \ |
1704 cxListDestroy(other); \ |
1704 cxListFree(other); \ |
1705 free(testdata); \ |
1705 free(testdata); \ |
1706 }) |
1706 }) |
1707 |
1707 |
1708 roll_out_compare_tests( |
1708 roll_out_compare_tests( |
1709 ll, cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int)) |
1709 ll, cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int)) |
1726 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1726 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1727 CxList *other = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int), 50); |
1727 CxList *other = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int), 50); |
1728 do_set_default_class_funcs(other); |
1728 do_set_default_class_funcs(other); |
1729 for (size_t i = 0; i < len; i++) cxListAdd(other, &testdata[i]); |
1729 for (size_t i = 0; i < len; i++) cxListAdd(other, &testdata[i]); |
1730 CX_TEST_CALL_SUBROUTINE(test_list_verify_compare, list, other); |
1730 CX_TEST_CALL_SUBROUTINE(test_list_verify_compare, list, other); |
1731 cxListDestroy(other); |
1731 cxListFree(other); |
1732 free(testdata); |
1732 free(testdata); |
1733 }) |
1733 }) |
1734 |
1734 |
1735 static unsigned destr_test_ctr; |
1735 static unsigned destr_test_ctr; |
1736 static int destr_last_value; |
1736 static int destr_last_value; |