1.1 --- a/tests/test_list.cpp Sat Apr 01 11:00:59 2023 +0200 1.2 +++ b/tests/test_list.cpp Sat Apr 01 11:51:48 2023 +0200 1.3 @@ -38,19 +38,6 @@ 1.4 #include <unordered_set> 1.5 #include <algorithm> 1.6 1.7 -struct testdatastruct { 1.8 - int x; 1.9 - void *ptr; 1.10 -}; 1.11 - 1.12 -static void free_testdatastruct( 1.13 - void *a, 1.14 - void *s 1.15 -) { 1.16 - auto al = reinterpret_cast<CxTestingAllocator *>(a); 1.17 - cxFree(al, reinterpret_cast<testdatastruct *>(s)->ptr); 1.18 -} 1.19 - 1.20 struct node { 1.21 node *next = nullptr; 1.22 node *prev = nullptr; 1.23 @@ -599,13 +586,6 @@ 1.24 return list; 1.25 } 1.26 1.27 - void verifyCreate(CxList *list) const { 1.28 - EXPECT_EQ(list->content_destructor_type, CX_DESTRUCTOR_NONE); 1.29 - EXPECT_EQ(list->size, 0); 1.30 - EXPECT_EQ(list->allocator, &testingAllocator); 1.31 - EXPECT_EQ(list->cmpfunc, cx_cmp_int); 1.32 - } 1.33 - 1.34 void verifyAdd( 1.35 CxList *list, 1.36 bool as_pointer 1.37 @@ -709,19 +689,81 @@ 1.38 EXPECT_NE(cxListRemove(list, testdata_len), 0); 1.39 } 1.40 1.41 - void verifyClear(CxList *list) { 1.42 - // use the testing allocator for testing the destructor function 1.43 - list->content_destructor_type = CX_DESTRUCTOR_ADVANCED; 1.44 - list->advanced_destructor.func = free_testdatastruct; 1.45 - list->advanced_destructor.data = &testingAllocator; 1.46 + static void verifyClear(CxList *list) { 1.47 + cxListClear(list); 1.48 + EXPECT_EQ(0, list->size); 1.49 + } 1.50 1.51 - testdatastruct s[10]; 1.52 - for (auto &t: s) { 1.53 - t.ptr = cxMalloc(&testingAllocator, 16); 1.54 - cxListAdd(list, &t); 1.55 - } 1.56 + static unsigned destr_test_ctr; 1.57 + static int destr_last_value; 1.58 + 1.59 + static void simple_destr_test_fun(void *data) { 1.60 + auto ptr = (int *) data; 1.61 + destr_last_value = *ptr; 1.62 + *ptr = destr_last_value + 1; 1.63 + destr_test_ctr++; 1.64 + } 1.65 + 1.66 + static void advanced_destr_test_fun( 1.67 + [[maybe_unused]] void *u, 1.68 + void *data 1.69 + ) { 1.70 + simple_destr_test_fun(data); 1.71 + } 1.72 + 1.73 + void verifyAnyDestructor(CxList *list) { 1.74 + int off = cxListIsStoringPointers(list) ? 1 : 0; 1.75 + 1.76 + cxListRemove(list, 15); 1.77 + EXPECT_EQ(1, destr_test_ctr); 1.78 + EXPECT_EQ(testdata.data[15], destr_last_value + off); 1.79 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.80 + cxListRemove(list, 47); 1.81 + EXPECT_EQ(2, destr_test_ctr); 1.82 + EXPECT_EQ(testdata.data[48], destr_last_value + off); 1.83 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.84 + 1.85 + auto iter = cxListMutIteratorAt(list, 7); 1.86 + cxIteratorNext(iter); 1.87 + EXPECT_EQ(2, destr_test_ctr); 1.88 + EXPECT_EQ(testdata.data[48], destr_last_value + off); 1.89 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.90 + cxIteratorFlagRemoval(iter); 1.91 + cxIteratorNext(iter); 1.92 + EXPECT_EQ(3, destr_test_ctr); 1.93 + EXPECT_EQ(testdata.data[8], destr_last_value + off); 1.94 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.95 + 1.96 + iter = cxListMutBackwardsIteratorAt(list, 5); 1.97 + cxIteratorNext(iter); 1.98 + EXPECT_EQ(3, destr_test_ctr); 1.99 + EXPECT_EQ(testdata.data[8], destr_last_value + off); 1.100 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.101 + cxIteratorFlagRemoval(iter); 1.102 + cxIteratorNext(iter); 1.103 + EXPECT_EQ(4, destr_test_ctr); 1.104 + EXPECT_EQ(testdata.data[4], destr_last_value + off); 1.105 + EXPECT_EQ(testdata_len - destr_test_ctr, list->size); 1.106 1.107 cxListClear(list); 1.108 + EXPECT_EQ(testdata_len, destr_test_ctr); 1.109 + EXPECT_EQ(testdata.data[testdata_len - 1], destr_last_value + off); 1.110 + 1.111 + 1.112 + } 1.113 + 1.114 + void verifySimpleDestructor(CxList *list) { 1.115 + destr_test_ctr = 0; 1.116 + list->content_destructor_type = CX_DESTRUCTOR_SIMPLE; 1.117 + list->simple_destructor = simple_destr_test_fun; 1.118 + verifyAnyDestructor(list); 1.119 + } 1.120 + 1.121 + void verifyAdvancedDestructor(CxList *list) { 1.122 + destr_test_ctr = 0; 1.123 + list->content_destructor_type = CX_DESTRUCTOR_ADVANCED; 1.124 + list->advanced_destructor.func = advanced_destr_test_fun; 1.125 + verifyAnyDestructor(list); 1.126 } 1.127 1.128 static void verifySwap(CxList *list) { 1.129 @@ -794,6 +836,9 @@ 1.130 } 1.131 EXPECT_EQ(cxListFind(list, &val), exp); 1.132 } 1.133 + 1.134 + int notinlist = -1; 1.135 + EXPECT_EQ(list->size, cxListFind(list, ¬inlist)); 1.136 } 1.137 1.138 void verifySort(CxList *list) const { 1.139 @@ -911,6 +956,9 @@ 1.140 } 1.141 }; 1.142 1.143 +unsigned HighLevelTest::destr_test_ctr = 0; 1.144 +int HighLevelTest::destr_last_value = 0; 1.145 + 1.146 class LinkedList : public HighLevelTest { 1.147 }; 1.148 1.149 @@ -932,12 +980,6 @@ 1.150 EXPECT_NE(list->cl, nullptr); 1.151 EXPECT_EQ(list->climpl, nullptr); 1.152 EXPECT_FALSE(cxListIsStoringPointers(list)); 1.153 - 1.154 - list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)); 1.155 - EXPECT_EQ(list->itemsize, sizeof(void *)); 1.156 - EXPECT_NE(list->cl, nullptr); 1.157 - EXPECT_NE(list->climpl, nullptr); 1.158 - EXPECT_TRUE(cxListIsStoringPointers(list)); 1.159 } 1.160 1.161 TEST_F(LinkedList, cxLinkedListCreate) { 1.162 @@ -945,7 +987,11 @@ 1.163 ASSERT_NE(list, nullptr); 1.164 EXPECT_EQ(list->itemsize, sizeof(int)); 1.165 EXPECT_EQ(list->capacity, (size_t) -1); 1.166 - verifyCreate(list); 1.167 + EXPECT_EQ(list->content_destructor_type, CX_DESTRUCTOR_NONE); 1.168 + EXPECT_EQ(list->size, 0); 1.169 + EXPECT_EQ(list->allocator, &testingAllocator); 1.170 + EXPECT_EQ(list->cmpfunc, cx_cmp_int); 1.171 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.172 } 1.173 1.174 TEST_F(LinkedList, cxLinkedListCreateSimple) { 1.175 @@ -955,6 +1001,17 @@ 1.176 EXPECT_EQ(list->capacity, (size_t) -1); 1.177 EXPECT_EQ(list->cmpfunc, nullptr); 1.178 EXPECT_EQ(list->allocator, cxDefaultAllocator); 1.179 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.180 +} 1.181 + 1.182 +TEST_F(LinkedList, cxLinkedListCreateSimpleForPointers) { 1.183 + CxList *list = autofree(cxLinkedListCreateSimple(CX_STORE_POINTERS)); 1.184 + ASSERT_NE(list, nullptr); 1.185 + EXPECT_EQ(list->itemsize, sizeof(void *)); 1.186 + EXPECT_EQ(list->capacity, (size_t) -1); 1.187 + EXPECT_EQ(list->cmpfunc, nullptr); 1.188 + EXPECT_EQ(list->allocator, cxDefaultAllocator); 1.189 + EXPECT_TRUE(cxListIsStoringPointers(list)); 1.190 } 1.191 1.192 TEST_F(ArrayList, cxArrayListCreate) { 1.193 @@ -962,7 +1019,11 @@ 1.194 ASSERT_NE(list, nullptr); 1.195 EXPECT_EQ(list->itemsize, sizeof(int)); 1.196 EXPECT_EQ(list->capacity, 8); 1.197 - verifyCreate(list); 1.198 + EXPECT_EQ(list->content_destructor_type, CX_DESTRUCTOR_NONE); 1.199 + EXPECT_EQ(list->size, 0); 1.200 + EXPECT_EQ(list->allocator, &testingAllocator); 1.201 + EXPECT_EQ(list->cmpfunc, cx_cmp_int); 1.202 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.203 } 1.204 1.205 TEST_F(ArrayList, cxArrayListCreateSimple) { 1.206 @@ -972,6 +1033,17 @@ 1.207 EXPECT_EQ(list->allocator, cxDefaultAllocator); 1.208 EXPECT_EQ(list->itemsize, sizeof(int)); 1.209 EXPECT_EQ(list->capacity, 8); 1.210 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.211 +} 1.212 + 1.213 +TEST_F(ArrayList, cxArrayListCreateSimpleForPointers) { 1.214 + CxList *list = autofree(cxArrayListCreateSimple(CX_STORE_POINTERS, 8)); 1.215 + ASSERT_NE(list, nullptr); 1.216 + EXPECT_EQ(list->cmpfunc, nullptr); 1.217 + EXPECT_EQ(list->allocator, cxDefaultAllocator); 1.218 + EXPECT_EQ(list->itemsize, sizeof(void *)); 1.219 + EXPECT_EQ(list->capacity, 8); 1.220 + EXPECT_TRUE(cxListIsStoringPointers(list)); 1.221 } 1.222 1.223 TEST_F(LinkedList, cxListAdd) { 1.224 @@ -1026,15 +1098,15 @@ 1.225 } 1.226 1.227 TEST_F(LinkedList, cxListClear) { 1.228 - verifyClear(autofree(cxLinkedListCreateSimple(sizeof(testdatastruct)))); 1.229 + verifyClear(linkedListFromTestData()); 1.230 } 1.231 1.232 TEST_F(PointerLinkedList, cxListClear) { 1.233 - verifyClear(cxLinkedListCreateSimple(CX_STORE_POINTERS)); 1.234 + verifyClear(pointerLinkedListFromTestData()); 1.235 } 1.236 1.237 TEST_F(ArrayList, cxListClear) { 1.238 - verifyClear(autofree(cxArrayListCreateSimple(sizeof(testdatastruct), 8))); 1.239 + verifyClear(arrayListFromTestData()); 1.240 } 1.241 1.242 TEST_F(LinkedList, cxListSwap) { 1.243 @@ -1203,7 +1275,31 @@ 1.244 verifyCompare(left, right); 1.245 } 1.246 1.247 -TEST_F(PointerLinkedList, NoDestructor) { 1.248 +TEST_F(LinkedList, SimpleDestructor) { 1.249 + verifySimpleDestructor(linkedListFromTestData()); 1.250 +} 1.251 + 1.252 +TEST_F(PointerLinkedList, SimpleDestructor) { 1.253 + verifySimpleDestructor(pointerLinkedListFromTestData()); 1.254 +} 1.255 + 1.256 +TEST_F(ArrayList, SimpleDestructor) { 1.257 + verifySimpleDestructor(arrayListFromTestData()); 1.258 +} 1.259 + 1.260 +TEST_F(LinkedList, AdvancedDestructor) { 1.261 + verifyAdvancedDestructor(linkedListFromTestData()); 1.262 +} 1.263 + 1.264 +TEST_F(PointerLinkedList, AdvancedDestructor) { 1.265 + verifyAdvancedDestructor(pointerLinkedListFromTestData()); 1.266 +} 1.267 + 1.268 +TEST_F(ArrayList, AdvancedDestructor) { 1.269 + verifyAdvancedDestructor(arrayListFromTestData()); 1.270 +} 1.271 + 1.272 +TEST_F(PointerLinkedList, DestroyNoDestructor) { 1.273 void *item = cxMalloc(&testingAllocator, sizeof(int)); 1.274 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); 1.275 cxListAdd(list, item); 1.276 @@ -1214,7 +1310,7 @@ 1.277 EXPECT_TRUE(testingAllocator.verify()); 1.278 } 1.279 1.280 -TEST_F(PointerLinkedList, SimpleDestructor) { 1.281 +TEST_F(PointerLinkedList, DestroySimpleDestructor) { 1.282 int item = 0; 1.283 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); 1.284 list->content_destructor_type = CX_DESTRUCTOR_SIMPLE; 1.285 @@ -1224,7 +1320,7 @@ 1.286 EXPECT_EQ(item, 42); 1.287 } 1.288 1.289 -TEST_F(PointerLinkedList, AdvancedDestructor) { 1.290 +TEST_F(PointerLinkedList, DestroyAdvancedDestructor) { 1.291 void *item = cxMalloc(&testingAllocator, sizeof(int)); 1.292 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); 1.293 list->content_destructor_type = CX_DESTRUCTOR_ADVANCED;