increase test coverage - fixes #250

Sat, 01 Apr 2023 11:51:48 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 01 Apr 2023 11:51:48 +0200
changeset 672
55d8fdd38ca4
parent 671
d7a67375a7ac
child 673
60fb6aec157d

increase test coverage - fixes #250

tests/test_list.cpp file | annotate | diff | comparison | revisions
     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, &notinlist));
   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;

mercurial