test/test_list.cpp

changeset 641
d402fead3386
parent 639
309e8b08c60e
child 647
2e6e9d9f2159
     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 +}

mercurial