1.1 --- a/test/test_list.cpp Wed Jan 25 19:19:29 2023 +0100 1.2 +++ b/test/test_list.cpp Thu Jan 26 20:59:36 2023 +0100 1.3 @@ -573,6 +573,14 @@ 1.4 return list; 1.5 } 1.6 1.7 + auto pointerLinkedListFromTestData() const -> CxList * { 1.8 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.9 + cxListStorePointers(list); 1.10 + // note: cannot use cxListAddArray() because we don't have a list of pointers 1.11 + cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]); 1.12 + return list; 1.13 + } 1.14 + 1.15 auto arrayListFromTestData() const -> CxList * { 1.16 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), testdata_len)); 1.17 cxListAddArray(list, testdata.data.data(), testdata_len); 1.18 @@ -625,21 +633,37 @@ 1.19 EXPECT_EQ(*(int *) cxListAt(list, 3), 42); 1.20 } 1.21 1.22 - static void verifyInsertArray(CxList *list) { 1.23 + static void verifyInsertArray( 1.24 + CxList *list, 1.25 + bool pointers = false 1.26 + ) { 1.27 int a[5] = {5, 47, 11, 13, 42}; 1.28 int b[5] = {9, 18, 72, 50, 7}; 1.29 + int *aptr[5]; 1.30 + int *bptr[5]; 1.31 + cx_for_n(i, 5) { 1.32 + aptr[i] = &a[i]; 1.33 + bptr[i] = &b[i]; 1.34 + } 1.35 1.36 size_t inserted; 1.37 1.38 - inserted = cxListInsertArray(list, 0, a, 5); 1.39 + if (pointers) { 1.40 + inserted = cxListInsertArray(list, 0, aptr, 5); 1.41 + } else { 1.42 + inserted = cxListInsertArray(list, 0, a, 5); 1.43 + } 1.44 EXPECT_EQ(inserted, 5); 1.45 EXPECT_EQ(*(int *) cxListAt(list, 0), 5); 1.46 EXPECT_EQ(*(int *) cxListAt(list, 1), 47); 1.47 EXPECT_EQ(*(int *) cxListAt(list, 2), 11); 1.48 EXPECT_EQ(*(int *) cxListAt(list, 3), 13); 1.49 EXPECT_EQ(*(int *) cxListAt(list, 4), 42); 1.50 - 1.51 - inserted = cxListInsertArray(list, 3, b, 5); 1.52 + if (pointers) { 1.53 + inserted = cxListInsertArray(list, 3, bptr, 5); 1.54 + } else { 1.55 + inserted = cxListInsertArray(list, 3, b, 5); 1.56 + } 1.57 EXPECT_EQ(inserted, 5); 1.58 EXPECT_EQ(*(int *) cxListAt(list, 0), 5); 1.59 EXPECT_EQ(*(int *) cxListAt(list, 1), 47); 1.60 @@ -787,9 +811,26 @@ 1.61 class LinkedList : public HighLevelTest { 1.62 }; 1.63 1.64 +class PointerLinkedList : public HighLevelTest { 1.65 +}; 1.66 + 1.67 class ArrayList : public HighLevelTest { 1.68 }; 1.69 1.70 +TEST_F(PointerLinkedList, cxListStorePointers) { 1.71 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, 47)); 1.72 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.73 + cxListStorePointers(list); 1.74 + EXPECT_EQ(list->itemsize, sizeof(void *)); 1.75 + EXPECT_NE(list->cl, nullptr); 1.76 + EXPECT_NE(list->climpl, nullptr); 1.77 + EXPECT_TRUE(cxListIsStoringPointers(list)); 1.78 + cxListStoreObjects(list); 1.79 + EXPECT_NE(list->cl, nullptr); 1.80 + EXPECT_EQ(list->climpl, nullptr); 1.81 + EXPECT_FALSE(cxListIsStoringPointers(list)); 1.82 +} 1.83 + 1.84 TEST_F(LinkedList, cxLinkedListCreate) { 1.85 CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))); 1.86 ASSERT_NE(list, nullptr); 1.87 @@ -807,12 +848,18 @@ 1.88 } 1.89 1.90 TEST_F(LinkedList, cxListAdd) { 1.91 - CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))); 1.92 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))); 1.93 verifyAdd(list, false); 1.94 } 1.95 1.96 +TEST_F(PointerLinkedList, cxListAdd) { 1.97 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.98 + cxListStorePointers(list); 1.99 + verifyAdd(list, true); 1.100 +} 1.101 + 1.102 TEST_F(ArrayList, cxListAdd) { 1.103 - CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8)); 1.104 + auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8)); 1.105 verifyAdd(list, false); 1.106 } 1.107 1.108 @@ -820,6 +867,12 @@ 1.109 verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)))); 1.110 } 1.111 1.112 +TEST_F(PointerLinkedList, cxListInsert) { 1.113 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.114 + cxListStorePointers(list); 1.115 + verifyInsert(list); 1.116 +} 1.117 + 1.118 TEST_F(ArrayList, cxListInsert) { 1.119 verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 2))); 1.120 } 1.121 @@ -828,6 +881,12 @@ 1.122 verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)))); 1.123 } 1.124 1.125 +TEST_F(PointerLinkedList, cxListInsertArray) { 1.126 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.127 + cxListStorePointers(list); 1.128 + verifyInsertArray(list, true); 1.129 +} 1.130 + 1.131 TEST_F(ArrayList, cxListInsertArray) { 1.132 verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4))); 1.133 } 1.134 @@ -836,6 +895,10 @@ 1.135 verifyRemove(linkedListFromTestData()); 1.136 } 1.137 1.138 +TEST_F(PointerLinkedList, cxListRemove) { 1.139 + verifyRemove(pointerLinkedListFromTestData()); 1.140 +} 1.141 + 1.142 TEST_F(ArrayList, cxListRemove) { 1.143 verifyRemove(arrayListFromTestData()); 1.144 } 1.145 @@ -844,6 +907,10 @@ 1.146 verifyAt(linkedListFromTestData()); 1.147 } 1.148 1.149 +TEST_F(PointerLinkedList, cxListAt) { 1.150 + verifyAt(pointerLinkedListFromTestData()); 1.151 +} 1.152 + 1.153 TEST_F(ArrayList, cxListAt) { 1.154 verifyAt(arrayListFromTestData()); 1.155 } 1.156 @@ -852,6 +919,10 @@ 1.157 verifyFind(linkedListFromTestData()); 1.158 } 1.159 1.160 +TEST_F(PointerLinkedList, cxListFind) { 1.161 + verifyFind(pointerLinkedListFromTestData()); 1.162 +} 1.163 + 1.164 TEST_F(ArrayList, cxListFind) { 1.165 verifyFind(arrayListFromTestData()); 1.166 } 1.167 @@ -860,6 +931,10 @@ 1.168 verifySort(linkedListFromTestData()); 1.169 } 1.170 1.171 +TEST_F(PointerLinkedList, cxListSort) { 1.172 + verifySort(pointerLinkedListFromTestData()); 1.173 +} 1.174 + 1.175 TEST_F(ArrayList, cxListSort) { 1.176 verifySort(arrayListFromTestData()); 1.177 } 1.178 @@ -868,6 +943,10 @@ 1.179 verifyIterator(linkedListFromTestData()); 1.180 } 1.181 1.182 +TEST_F(PointerLinkedList, Iterator) { 1.183 + verifyIterator(pointerLinkedListFromTestData()); 1.184 +} 1.185 + 1.186 TEST_F(ArrayList, Iterator) { 1.187 verifyIterator(arrayListFromTestData()); 1.188 } 1.189 @@ -879,6 +958,15 @@ 1.190 verifyInsertViaIterator(list); 1.191 } 1.192 1.193 +TEST_F(PointerLinkedList, InsertViaIterator) { 1.194 + int fivenums[] = {0, 1, 2, 3, 4, 5}; 1.195 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.196 + cxListStorePointers(list); 1.197 + // note: cannot use cxListAddArray() because we don't have a list of pointers 1.198 + cx_for_n(i, 5) cxListAdd(list, &fivenums[i]); 1.199 + verifyInsertViaIterator(list); 1.200 +} 1.201 + 1.202 TEST_F(ArrayList, InsertViaIterator) { 1.203 int fivenums[] = {0, 1, 2, 3, 4, 5}; 1.204 CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4)); 1.205 @@ -890,6 +978,10 @@ 1.206 verifyReverse(linkedListFromTestData()); 1.207 } 1.208 1.209 +TEST_F(PointerLinkedList, cxListReverse) { 1.210 + verifyReverse(pointerLinkedListFromTestData()); 1.211 +} 1.212 + 1.213 TEST_F(ArrayList, cxListReverse) { 1.214 verifyReverse(arrayListFromTestData()); 1.215 } 1.216 @@ -900,20 +992,86 @@ 1.217 verifyCompare(left, right); 1.218 } 1.219 1.220 +TEST_F(LinkedList, cxListCompareWithPtrList) { 1.221 + auto left = linkedListFromTestData(); 1.222 + auto right = pointerLinkedListFromTestData(); 1.223 + verifyCompare(left, right); 1.224 +} 1.225 + 1.226 TEST_F(LinkedList, cxListCompareWithArrayList) { 1.227 auto left = linkedListFromTestData(); 1.228 auto right = arrayListFromTestData(); 1.229 verifyCompare(left, right); 1.230 } 1.231 1.232 +TEST_F(PointerLinkedList, cxListCompare) { 1.233 + auto left = pointerLinkedListFromTestData(); 1.234 + auto right = pointerLinkedListFromTestData(); 1.235 + verifyCompare(left, right); 1.236 +} 1.237 + 1.238 +TEST_F(PointerLinkedList, cxListCompareWithNormalList) { 1.239 + auto left = pointerLinkedListFromTestData(); 1.240 + auto right = linkedListFromTestData(); 1.241 + verifyCompare(left, right); 1.242 +} 1.243 + 1.244 +TEST_F(PointerLinkedList, cxListCompareWithArrayList) { 1.245 + auto left = pointerLinkedListFromTestData(); 1.246 + auto right = arrayListFromTestData(); 1.247 + verifyCompare(left, right); 1.248 +} 1.249 + 1.250 TEST_F(ArrayList, cxListCompare) { 1.251 auto left = arrayListFromTestData(); 1.252 auto right = arrayListFromTestData(); 1.253 verifyCompare(left, right); 1.254 } 1.255 1.256 -TEST_F(ArrayList, cxListCompareWithLinkedList) { 1.257 +TEST_F(ArrayList, cxListCompareWithPtrList) { 1.258 + auto left = arrayListFromTestData(); 1.259 + auto right = pointerLinkedListFromTestData(); 1.260 + verifyCompare(left, right); 1.261 +} 1.262 + 1.263 +TEST_F(ArrayList, cxListCompareWithNormalList) { 1.264 auto left = arrayListFromTestData(); 1.265 auto right = linkedListFromTestData(); 1.266 verifyCompare(left, right); 1.267 } 1.268 + 1.269 +TEST_F(PointerLinkedList, NoDestructor) { 1.270 + void *item = cxMalloc(&testingAllocator, sizeof(int)); 1.271 + auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *)); 1.272 + cxListStorePointers(list); 1.273 + cxListAdd(list, item); 1.274 + ASSERT_FALSE(testingAllocator.verify()); 1.275 + cxListDestroy(list); 1.276 + EXPECT_FALSE(testingAllocator.verify()); 1.277 + cxFree(&testingAllocator, item); 1.278 + EXPECT_TRUE(testingAllocator.verify()); 1.279 +} 1.280 + 1.281 +TEST_F(PointerLinkedList, SimpleDestructor) { 1.282 + int item = 0; 1.283 + auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *)); 1.284 + cxListStorePointers(list); 1.285 + list->content_destructor_type = CX_DESTRUCTOR_SIMPLE; 1.286 + list->simple_destructor = [](void *elem) { *(int *) elem = 42; }; 1.287 + cxListAdd(list, &item); 1.288 + cxListDestroy(list); 1.289 + EXPECT_EQ(item, 42); 1.290 +} 1.291 + 1.292 +TEST_F(PointerLinkedList, AdvancedDestructor) { 1.293 + void *item = cxMalloc(&testingAllocator, sizeof(int)); 1.294 + auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *)); 1.295 + cxListStorePointers(list); 1.296 + list->content_destructor_type = CX_DESTRUCTOR_ADVANCED; 1.297 + list->advanced_destructor.data = &testingAllocator; 1.298 + list->advanced_destructor.func = (cx_destructor_func2) cxFree; 1.299 + cxListAdd(list, item); 1.300 + ASSERT_FALSE(testingAllocator.verify()); 1.301 + cxListDestroy(list); 1.302 + EXPECT_TRUE(testingAllocator.verify()); 1.303 +}