test/test_list.c

changeset 509
0d3c6075f82c
parent 507
2e8878770de0
     1.1 --- a/test/test_list.c	Sat Apr 09 16:37:43 2022 +0200
     1.2 +++ b/test/test_list.c	Sat Apr 09 18:02:53 2022 +0200
     1.3 @@ -27,6 +27,7 @@
     1.4   */
     1.5  
     1.6  #include "cx/linked_list.h"
     1.7 +#include "cx/utils.h"
     1.8  #include "test_config.h"
     1.9  #include "util_allocator.h"
    1.10  
    1.11 @@ -52,11 +53,11 @@
    1.12  const ptrdiff_t loc_next = offsetof(struct node, next);
    1.13  const ptrdiff_t loc_data = offsetof(struct node, data);
    1.14  
    1.15 -struct node *create_test_data(
    1.16 +static struct node *create_nodes_test_data(
    1.17          size_t n,
    1.18          int const data[]
    1.19  ) {
    1.20 -    if (n == 0) return NULL;
    1.21 +    CU_ASSERT_NOT_EQUAL_FATAL(n, 0)
    1.22      struct node *begin = calloc(1, sizeof(struct node));
    1.23      struct node *prev = begin;
    1.24      if (data) begin->data = data[0];
    1.25 @@ -69,7 +70,7 @@
    1.26      return begin;
    1.27  }
    1.28  
    1.29 -void destroy_test_data(struct node *begin) {
    1.30 +static void destroy_nodes_test_data(struct node *begin) {
    1.31      struct node *node = begin;
    1.32      while (node) {
    1.33          struct node *next = node->next;
    1.34 @@ -78,6 +79,12 @@
    1.35      }
    1.36  }
    1.37  
    1.38 +static int *create_ints_test_data(size_t len) {
    1.39 +    int *data = malloc(sizeof(int) * len);
    1.40 +    cx_for_n (i, len) data[i] = rand(); // NOLINT(cert-msc50-cpp)
    1.41 +    return data;
    1.42 +}
    1.43 +
    1.44  void test_linked_list_link_unlink(void) {
    1.45  
    1.46      struct node nd(a), nd(b), nd(c);
    1.47 @@ -129,7 +136,7 @@
    1.48  
    1.49  void test_linked_list_find(void) {
    1.50      int data[] = {2, 4, 6, 8};
    1.51 -    void *list = create_test_data(4, data);
    1.52 +    void *list = create_nodes_test_data(4, data);
    1.53      int s;
    1.54  
    1.55      s = 2;
    1.56 @@ -157,9 +164,9 @@
    1.57      int b[] = {2, 4, 6};
    1.58      int c[] = {2, 4, 6, 9};
    1.59  
    1.60 -    void *la = create_test_data(4, a);
    1.61 -    void *lb = create_test_data(3, b);
    1.62 -    void *lc = create_test_data(4, c);
    1.63 +    void *la = create_nodes_test_data(4, a);
    1.64 +    void *lb = create_nodes_test_data(3, b);
    1.65 +    void *lc = create_nodes_test_data(4, c);
    1.66  
    1.67      CU_ASSERT_TRUE(0 < cx_linked_list_compare(la, lb, loc_next, loc_data,
    1.68                                                false, cmp_int)
    1.69 @@ -177,9 +184,9 @@
    1.70                                                 false, cmp_int)
    1.71      )
    1.72  
    1.73 -    destroy_test_data(la);
    1.74 -    destroy_test_data(lb);
    1.75 -    destroy_test_data(lc);
    1.76 +    destroy_nodes_test_data(la);
    1.77 +    destroy_nodes_test_data(lb);
    1.78 +    destroy_nodes_test_data(lc);
    1.79  }
    1.80  
    1.81  void test_linked_list_add(void) {
    1.82 @@ -421,35 +428,35 @@
    1.83  }
    1.84  
    1.85  void test_linked_list_first(void) {
    1.86 -    struct node *begin = create_test_data(3, NULL);
    1.87 +    struct node *begin = create_nodes_test_data(3, NULL);
    1.88      CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin, loc_prev), begin)
    1.89      CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin->next, loc_prev), begin)
    1.90      CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin->next->next, loc_prev), begin)
    1.91 -    destroy_test_data(begin);
    1.92 +    destroy_nodes_test_data(begin);
    1.93  }
    1.94  
    1.95  void test_linked_list_last(void) {
    1.96 -    struct node *begin = create_test_data(3, NULL);
    1.97 +    struct node *begin = create_nodes_test_data(3, NULL);
    1.98      struct node *end = begin->next->next;
    1.99      CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin, loc_next), end)
   1.100      CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin->next, loc_next), end)
   1.101      CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin->next->next, loc_next), end)
   1.102 -    destroy_test_data(begin);
   1.103 +    destroy_nodes_test_data(begin);
   1.104  }
   1.105  
   1.106  void test_linked_list_prev(void) {
   1.107 -    struct node *begin = create_test_data(3, NULL);
   1.108 +    struct node *begin = create_nodes_test_data(3, NULL);
   1.109      CU_ASSERT_PTR_NULL(cx_linked_list_prev(begin, loc_next, begin))
   1.110      CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(begin, loc_next, begin->next), begin)
   1.111      CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(begin, loc_next, begin->next->next), begin->next)
   1.112 -    destroy_test_data(begin);
   1.113 +    destroy_nodes_test_data(begin);
   1.114  }
   1.115  
   1.116  void test_linked_list_remove(void) {
   1.117      void *begin, *end;
   1.118  
   1.119      int data[] = {2, 4, 6};
   1.120 -    begin = create_test_data(3, data);
   1.121 +    begin = create_nodes_test_data(3, data);
   1.122      struct node *first = begin;
   1.123      struct node *second = first->next;
   1.124      struct node *third = second->next;
   1.125 @@ -483,13 +490,13 @@
   1.126  
   1.127      CU_ASSERT_PTR_EQUAL(cx_linked_list_size(NULL, loc_next), 0)
   1.128  
   1.129 -    list = create_test_data(5, NULL);
   1.130 +    list = create_nodes_test_data(5, NULL);
   1.131      CU_ASSERT_EQUAL(cx_linked_list_size(list, loc_next), 5)
   1.132 -    destroy_test_data(list);
   1.133 +    destroy_nodes_test_data(list);
   1.134  
   1.135 -    list = create_test_data(13, NULL);
   1.136 +    list = create_nodes_test_data(13, NULL);
   1.137      CU_ASSERT_EQUAL(cx_linked_list_size(list, loc_next), 13)
   1.138 -    destroy_test_data(list);
   1.139 +    destroy_nodes_test_data(list);
   1.140  }
   1.141  
   1.142  void test_linked_list_sort(void) {
   1.143 @@ -510,7 +517,7 @@
   1.144              4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
   1.145      };
   1.146  
   1.147 -    void *begin = create_test_data(100, scrambled);
   1.148 +    void *begin = create_nodes_test_data(100, scrambled);
   1.149      void *end = cx_linked_list_last(begin, loc_next);
   1.150  
   1.151      cx_linked_list_sort(&begin, &end, loc_prev, loc_next, loc_data,
   1.152 @@ -520,7 +527,7 @@
   1.153      struct node *check_last = NULL;
   1.154      CU_ASSERT_PTR_NULL(check->prev)
   1.155      CU_ASSERT_EQUAL(check->data, expected[0])
   1.156 -    for (int i = 0; i < 100; i++) {
   1.157 +    cx_for_n (i, 100) {
   1.158          CU_ASSERT_EQUAL(check->data, expected[i])
   1.159          CU_ASSERT_PTR_EQUAL(check->prev, check_last)
   1.160          if (i < 99) {
   1.161 @@ -532,7 +539,7 @@
   1.162      CU_ASSERT_PTR_NULL(check)
   1.163      CU_ASSERT_PTR_EQUAL(end, check_last)
   1.164  
   1.165 -    destroy_test_data(begin);
   1.166 +    destroy_nodes_test_data(begin);
   1.167  }
   1.168  
   1.169  void test_linked_list_reverse(void) {
   1.170 @@ -541,8 +548,8 @@
   1.171      int data[] = {2, 4, 6, 8};
   1.172      int reversed[] = {8, 6, 4, 2};
   1.173  
   1.174 -    void *list = create_test_data(4, data);
   1.175 -    void *expected = create_test_data(4, reversed);
   1.176 +    void *list = create_nodes_test_data(4, data);
   1.177 +    void *expected = create_nodes_test_data(4, reversed);
   1.178  
   1.179      begin = list;
   1.180      end = cx_linked_list_last(list, loc_next);
   1.181 @@ -553,8 +560,8 @@
   1.182      CU_ASSERT_TRUE(0 == cx_linked_list_compare(begin, expected, loc_next, loc_data,
   1.183                                                 0, cmp_int))
   1.184  
   1.185 -    destroy_test_data(begin);
   1.186 -    destroy_test_data(expected);
   1.187 +    destroy_nodes_test_data(begin);
   1.188 +    destroy_nodes_test_data(expected);
   1.189  }
   1.190  
   1.191  static void verify_linked_list_create(CxList *list) {
   1.192 @@ -582,7 +589,7 @@
   1.193      int data[] = {2, 4, 5, 7, 10, 15};
   1.194  
   1.195      CxList *expected = cxLinkedListCreate(cxTestingAllocator, cmp_int, sizeof(int));
   1.196 -    for (int i = 0; i < 5; i++) cxListAdd(expected, &data[i]);
   1.197 +    cx_for_n (i, 5) cxListAdd(expected, &data[i]);
   1.198  
   1.199      CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), 5, data);
   1.200  
   1.201 @@ -598,25 +605,15 @@
   1.202          size_t len,
   1.203          bool write_through
   1.204  ) {
   1.205 -    for (size_t i = 0; i < len; i++) {
   1.206 -        CU_ASSERT_EQUAL(cxListAdd(list, &data[i]), 0)
   1.207 -    }
   1.208 +    cx_for_n (i, len) CU_ASSERT_EQUAL(cxListAdd(list, &data[i]), 0)
   1.209      CU_ASSERT_EQUAL(list->size, len)
   1.210      CU_ASSERT_TRUE(list->capacity >= list->size)
   1.211 -    for (size_t i = 0; i < len; i++) {
   1.212 -        CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i])
   1.213 -    }
   1.214 -    for (size_t i = 0; i < len; i++) {
   1.215 -        ++data[i];
   1.216 -    }
   1.217 +    cx_for_n (i, len) CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i])
   1.218 +    cx_for_n (i, len) ++data[i];
   1.219      if (write_through) {
   1.220 -        for (size_t i = 0; i < len; i++) {
   1.221 -            CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i])
   1.222 -        }
   1.223 +        cx_for_n (i, len) CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i])
   1.224      } else {
   1.225 -        for (size_t i = 0; i < len; i++) {
   1.226 -            CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i] - 1)
   1.227 -        }
   1.228 +        cx_for_n (i, len) CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i] - 1)
   1.229      }
   1.230      cxListDestroy(list);
   1.231  }
   1.232 @@ -629,42 +626,11 @@
   1.233  
   1.234  void test_hl_ptr_linked_list_add(void) {
   1.235      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.236 -    int data[] = {5, 47, 13, 9, 18, 1, 42};
   1.237 +    int data[] = {5, 47, 84, 13, 9, 18, 90, 1, 42};
   1.238      verify_hl_linked_list_add(list, data, sizeof(data) / sizeof(int), true);
   1.239  }
   1.240  
   1.241 -void test_hl_linked_list_insert(void) {
   1.242 -    int data;
   1.243 -    CxList *list = cxLinkedListCreate(cxTestingAllocator, cmp_int, sizeof(int));
   1.244 -
   1.245 -    data = 5;
   1.246 -    CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &data), 0)
   1.247 -    CU_ASSERT_EQUAL(list->size, 0)
   1.248 -    CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
   1.249 -    CU_ASSERT_EQUAL(list->size, 1)
   1.250 -    data = 47;
   1.251 -    CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
   1.252 -    CU_ASSERT_EQUAL(list->size, 2)
   1.253 -    data = 13;
   1.254 -    CU_ASSERT_EQUAL(cxListInsert(list, 1, &data), 0)
   1.255 -    CU_ASSERT_EQUAL(list->size, 3)
   1.256 -    data = 42;
   1.257 -    CU_ASSERT_EQUAL(cxListInsert(list, 3, &data), 0)
   1.258 -
   1.259 -    CU_ASSERT_EQUAL(list->size, 4)
   1.260 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.261 -
   1.262 -    int exp[] = {47, 13, 5, 42};
   1.263 -    CxList *expected = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), 4, exp);
   1.264 -    CU_ASSERT_TRUE(0 == cxListCompare(list, expected))
   1.265 -
   1.266 -    cxListDestroy(list);
   1.267 -    cxListDestroy(expected);
   1.268 -}
   1.269 -
   1.270 -void test_hl_ptr_linked_list_insert(void) {
   1.271 -    CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.272 -
   1.273 +static void verify_hl_linked_list_insert(CxList *list) {
   1.274      int a = 5, b = 47, c = 13, d = 42;
   1.275  
   1.276      CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &a), 0)
   1.277 @@ -688,11 +654,15 @@
   1.278      cxListDestroy(list);
   1.279  }
   1.280  
   1.281 -void test_hl_linked_list_remove(void) {
   1.282 -    int data[] = {5, 47, 42, 13};
   1.283 -    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int,
   1.284 -                                         sizeof(int), 4, data);
   1.285 +void test_hl_linked_list_insert(void) {
   1.286 +    verify_hl_linked_list_insert(cxLinkedListCreate(cxTestingAllocator, cmp_int, sizeof(int)));
   1.287 +}
   1.288  
   1.289 +void test_hl_ptr_linked_list_insert(void) {
   1.290 +    verify_hl_linked_list_insert(cxPointerLinkedListCreate(cxTestingAllocator, cmp_int));
   1.291 +}
   1.292 +
   1.293 +static void verify_hl_linked_list_remove(CxList *list) {
   1.294      CU_ASSERT_EQUAL(list->size, 4)
   1.295      CU_ASSERT_TRUE(list->capacity >= list->size)
   1.296  
   1.297 @@ -725,187 +695,131 @@
   1.298      cxListDestroy(list);
   1.299  }
   1.300  
   1.301 +void test_hl_linked_list_remove(void) {
   1.302 +    int data[] = {5, 47, 42, 13};
   1.303 +    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int,
   1.304 +                                         sizeof(int), 4, data);
   1.305 +    verify_hl_linked_list_remove(list);
   1.306 +}
   1.307 +
   1.308  void test_hl_ptr_linked_list_remove(void) {
   1.309      int a = 5, b = 47, c = 42, d = 13;
   1.310      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.311 -
   1.312      cxListAdd(list, &a);
   1.313      cxListAdd(list, &b);
   1.314      cxListAdd(list, &c);
   1.315      cxListAdd(list, &d);
   1.316 +    verify_hl_linked_list_remove(list);
   1.317 +}
   1.318  
   1.319 -    CU_ASSERT_EQUAL(list->size, 4)
   1.320 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.321 -
   1.322 -    CU_ASSERT_NOT_EQUAL(cxListRemove(list, 4), 0)
   1.323 -
   1.324 -    CU_ASSERT_EQUAL(cxListRemove(list, 2), 0)
   1.325 -    CU_ASSERT_EQUAL(list->size, 3)
   1.326 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.327 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
   1.328 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
   1.329 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
   1.330 -
   1.331 -    CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
   1.332 -    CU_ASSERT_EQUAL(list->size, 2)
   1.333 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.334 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
   1.335 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
   1.336 -
   1.337 -    CU_ASSERT_EQUAL(cxListRemove(list, 1), 0)
   1.338 -    CU_ASSERT_EQUAL(list->size, 1)
   1.339 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.340 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
   1.341 -
   1.342 -    CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
   1.343 -    CU_ASSERT_EQUAL(list->size, 0)
   1.344 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.345 -
   1.346 -    CU_ASSERT_NOT_EQUAL(cxListRemove(list, 0), 0)
   1.347 -
   1.348 +static void verify_hl_linked_list_at(
   1.349 +        CxList *list,
   1.350 +        size_t len,
   1.351 +        int *data
   1.352 +) {
   1.353 +    CU_ASSERT_EQUAL(list->size, len)
   1.354 +    cx_for_n (i, len) CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), data[i])
   1.355 +    CU_ASSERT_PTR_NULL(cxListAt(list, len))
   1.356 +    free(data);
   1.357      cxListDestroy(list);
   1.358  }
   1.359  
   1.360  void test_hl_linked_list_at(void) {
   1.361 -    int data[] = {5, 47, 13};
   1.362 +    size_t len = 100;
   1.363 +    int *data = create_ints_test_data(len);
   1.364      CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int,
   1.365 -                                         sizeof(int), 3, data);
   1.366 -
   1.367 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
   1.368 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
   1.369 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
   1.370 -    CU_ASSERT_PTR_NULL(cxListAt(list, 3))
   1.371 -
   1.372 -    cxListDestroy(list);
   1.373 +                                         sizeof(int), len, data);
   1.374 +    verify_hl_linked_list_at(list, len, data);
   1.375  }
   1.376  
   1.377  void test_hl_ptr_linked_list_at(void) {
   1.378 +    size_t len = 250;
   1.379 +    int *data = create_ints_test_data(len);
   1.380      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.381 +    cx_for_n (i, len) cxListAdd(list, &data[i]);
   1.382 +    verify_hl_linked_list_at(list, len, data);
   1.383 +}
   1.384  
   1.385 -    int a = 5, b = 47, c = 13;
   1.386 -    cxListAdd(list, &a);
   1.387 -    cxListAdd(list, &b);
   1.388 -    cxListAdd(list, &c);
   1.389 -
   1.390 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
   1.391 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
   1.392 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
   1.393 -    CU_ASSERT_PTR_NULL(cxListAt(list, 3))
   1.394 -
   1.395 +static void verify_hl_linked_list_find(
   1.396 +        CxList *list,
   1.397 +        size_t len,
   1.398 +        int *data
   1.399 +) {
   1.400 +    cx_for_n (attempt, 100) {
   1.401 +        size_t exp = rand() % len; // NOLINT(cert-msc50-cpp)
   1.402 +        int val = data[exp];
   1.403 +        cx_for_n (i, exp) {
   1.404 +            if (data[i] == val) {
   1.405 +                exp = i;
   1.406 +                break;
   1.407 +            }
   1.408 +        }
   1.409 +        CU_ASSERT_EQUAL(cxListFind(list, &val), exp)
   1.410 +    }
   1.411 +    free(data);
   1.412      cxListDestroy(list);
   1.413  }
   1.414  
   1.415  void test_hl_linked_list_find(void) {
   1.416 -    int data[] = {5, 47, 13};
   1.417 -    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int,
   1.418 -                                         sizeof(int), 3, data);
   1.419 -    CU_ASSERT_EQUAL(list->size, 3)
   1.420 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.421 -
   1.422 -    int criteria;
   1.423 -
   1.424 -    criteria = 5;
   1.425 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
   1.426 -    criteria = 47;
   1.427 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
   1.428 -    criteria = 13;
   1.429 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
   1.430 -    criteria = 9000;
   1.431 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
   1.432 -    criteria = -5;
   1.433 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
   1.434 -
   1.435 -    cxListDestroy(list);
   1.436 +    size_t len = 100;
   1.437 +    int *data = create_ints_test_data(len);
   1.438 +    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), len, data);
   1.439 +    verify_hl_linked_list_find(list, len, data);
   1.440  }
   1.441  
   1.442  void test_hl_ptr_linked_list_find(void) {
   1.443 -    int a = 5, b = 47, c = 13, criteria;
   1.444 +    size_t len = 250;
   1.445 +    int *data = create_ints_test_data(len);
   1.446      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.447 +    cx_for_n (i, len) cxListAdd(list, &data[i]);
   1.448 +    verify_hl_linked_list_find(list, len, data);
   1.449 +}
   1.450  
   1.451 -    cxListAdd(list, &a);
   1.452 -    cxListAdd(list, &b);
   1.453 -    cxListAdd(list, &c);
   1.454 +struct sort_test_data {
   1.455 +    size_t len;
   1.456 +    int *data;
   1.457 +    int *sorted;
   1.458 +};
   1.459  
   1.460 -    CU_ASSERT_EQUAL(list->size, 3)
   1.461 -    CU_ASSERT_TRUE(list->capacity >= list->size)
   1.462 +static struct sort_test_data create_sort_test_data(void) {
   1.463 +    size_t len = 1000;
   1.464 +    int *data = create_ints_test_data(len);
   1.465 +    int *sorted = malloc(sizeof(int) * len);
   1.466 +    memcpy(sorted, data, sizeof(int) * len);
   1.467 +    qsort(sorted, len, sizeof(int), cmp_int);
   1.468 +    struct sort_test_data s = {len, data, sorted};
   1.469 +    return s;
   1.470 +}
   1.471  
   1.472 -    criteria = 5;
   1.473 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
   1.474 -    criteria = 47;
   1.475 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
   1.476 -    criteria = 13;
   1.477 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
   1.478 -    criteria = 9000;
   1.479 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
   1.480 -    criteria = -5;
   1.481 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
   1.482 -    b = -5;
   1.483 -    CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
   1.484 +static void free_sort_test_data(struct sort_test_data s) {
   1.485 +    free(s.data);
   1.486 +    free(s.sorted);
   1.487 +}
   1.488  
   1.489 +static void verify_hl_linked_list_sort(
   1.490 +        CxList *list,
   1.491 +        struct sort_test_data td
   1.492 +) {
   1.493 +    cxListSort(list);
   1.494 +    cx_for_n (i, td.len) CU_ASSERT_EQUAL_FATAL(*(int *) cxListAt(list, i), td.sorted[i])
   1.495 +    free_sort_test_data(td);
   1.496      cxListDestroy(list);
   1.497  }
   1.498  
   1.499  void test_hl_linked_list_sort(void) {
   1.500 -    int expected[] = {
   1.501 -            14, 30, 151, 163, 227, 300, 315, 317, 363, 398, 417, 424, 438, 446, 508, 555, 605, 713, 716, 759, 761, 880,
   1.502 -            894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 1707, 1734, 1771, 1874, 1894,
   1.503 -            1976, 2079, 2124, 2130, 2135, 2266, 2338, 2358, 2430, 2500, 2540, 2542, 2546, 2711, 2733, 2754, 2764, 2797,
   1.504 -            2888, 2900, 3020, 3053, 3109, 3244, 3275, 3302, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 3675, 3677,
   1.505 -            3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681,
   1.506 -            4785, 4791, 4801, 4859, 4903, 4973
   1.507 -    };
   1.508 -    int scrambled[] = {
   1.509 -            759, 716, 880, 761, 2358, 2542, 2500, 2540, 2546, 2711, 2430, 1707, 1874, 1771, 1894, 1734, 1976, 2079,
   1.510 -            2124, 2130, 2135, 2266, 2338, 2733, 2754, 2764, 2797, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 2888,
   1.511 -            2900, 3020, 3053, 3109, 3244, 3275, 3302, 438, 446, 508, 555, 605, 713, 14, 30, 151, 163, 227, 300,
   1.512 -            894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 315, 317, 363, 398, 417, 424,
   1.513 -            3675, 3677, 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4785, 4791, 4801, 4859, 4903, 4973,
   1.514 -            4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
   1.515 -    };
   1.516 -    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), 100, scrambled);
   1.517 -    CxList *exp = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), 100, expected);
   1.518 -
   1.519 -    cxListSort(list);
   1.520 -    CU_ASSERT_TRUE(0 == cxListCompare(list, exp))
   1.521 -
   1.522 -    cxListDestroy(list);
   1.523 -    cxListDestroy(exp);
   1.524 +    struct sort_test_data td = create_sort_test_data();
   1.525 +    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), td.len, td.data);
   1.526 +    verify_hl_linked_list_sort(list, td);
   1.527  }
   1.528  
   1.529  void test_hl_ptr_linked_list_sort(void) {
   1.530 -    int expected[] = {
   1.531 -            14, 30, 151, 163, 227, 300, 315, 317, 363, 398, 417, 424, 438, 446, 508, 555, 605, 713, 716, 759, 761, 880,
   1.532 -            894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 1707, 1734, 1771, 1874, 1894,
   1.533 -            1976, 2079, 2124, 2130, 2135, 2266, 2338, 2358, 2430, 2500, 2540, 2542, 2546, 2711, 2733, 2754, 2764, 2797,
   1.534 -            2888, 2900, 3020, 3053, 3109, 3244, 3275, 3302, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 3675, 3677,
   1.535 -            3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681,
   1.536 -            4785, 4791, 4801, 4859, 4903, 4973
   1.537 -    };
   1.538 -    int scrambled[] = {
   1.539 -            759, 716, 880, 761, 2358, 2542, 2500, 2540, 2546, 2711, 2430, 1707, 1874, 1771, 1894, 1734, 1976, 2079,
   1.540 -            2124, 2130, 2135, 2266, 2338, 2733, 2754, 2764, 2797, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 2888,
   1.541 -            2900, 3020, 3053, 3109, 3244, 3275, 3302, 438, 446, 508, 555, 605, 713, 14, 30, 151, 163, 227, 300,
   1.542 -            894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 315, 317, 363, 398, 417, 424,
   1.543 -            3675, 3677, 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4785, 4791, 4801, 4859, 4903, 4973,
   1.544 -            4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
   1.545 -    };
   1.546 -
   1.547 +    struct sort_test_data td = create_sort_test_data();
   1.548      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.549 -
   1.550 -    for (int i = 0; i < 100; i++) {
   1.551 -        cxListAdd(list, &scrambled[i]);
   1.552 -    }
   1.553 -
   1.554 -    cxListSort(list);
   1.555 -
   1.556 -    for (int i = 0; i < 100; i++) {
   1.557 -        CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expected[i])
   1.558 -    }
   1.559 -
   1.560 -    cxListDestroy(list);
   1.561 +    cx_for_n (i, td.len) cxListAdd(list, &td.data[i]);
   1.562 +    verify_hl_linked_list_sort(list, td);
   1.563  }
   1.564  
   1.565 -void test_hl_linked_list_iterator_impl(CxList *list) {
   1.566 +void verify_hl_linked_list_iterator(CxList *list) {
   1.567      int i = 0;
   1.568      CxIterator iter = cxListBegin(list);
   1.569      cx_foreach(int*, x, iter) {
   1.570 @@ -916,111 +830,75 @@
   1.571      }
   1.572      CU_ASSERT_EQUAL(i, 10)
   1.573      CU_ASSERT_EQUAL_FATAL(list->size, 5)
   1.574 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 0)
   1.575 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 2)
   1.576 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 4)
   1.577 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 3), 6)
   1.578 -    CU_ASSERT_EQUAL(*(int *) cxListAt(list, 4), 8)
   1.579 +    cx_for_n(j, 5) CU_ASSERT_EQUAL(*(int *) cxListAt(list, j), (int) j * 2)
   1.580      cxListDestroy(list);
   1.581  }
   1.582  
   1.583  void test_hl_linked_list_iterator(void) {
   1.584      CxList *list = cxLinkedListCreate(cxTestingAllocator, cmp_int, sizeof(int));
   1.585 -    for (int i = 0; i < 10; i++) {
   1.586 -        cxListAdd(list, &i);
   1.587 -    }
   1.588 -    test_hl_linked_list_iterator_impl(list);
   1.589 +    cx_for_n (i, 10) cxListAdd(list, &i);
   1.590 +    verify_hl_linked_list_iterator(list);
   1.591  }
   1.592  
   1.593  void test_hl_ptr_linked_list_iterator(void) {
   1.594      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.595      int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   1.596 -    for (int i = 0; i < 10; i++) {
   1.597 -        cxListAdd(list, &data[i]);
   1.598 -    }
   1.599 -    test_hl_linked_list_iterator_impl(list);
   1.600 +    cx_for_n (i, 10) cxListAdd(list, &data[i]);
   1.601 +    verify_hl_linked_list_iterator(list);
   1.602  }
   1.603  
   1.604 -void test_hl_linked_list_insert_via_iterator(void) {
   1.605 -    CxList *list = cxLinkedListCreate(cxTestingAllocator, cmp_int, sizeof(int));
   1.606 -    for (int i = 0; i < 5; i++) {
   1.607 -        cxListAdd(list, &i);
   1.608 -    }
   1.609 +static void verify_hl_linked_list_insert_via_iterator(
   1.610 +        CxList *list,
   1.611 +        int *testdata
   1.612 +) {
   1.613      CxIterator iter = cxListIterator(list, 2);
   1.614      CU_ASSERT_EQUAL(iter.index, 2)
   1.615      CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.616 +    size_t i = 4;
   1.617  
   1.618 -    int data = 10;
   1.619 -    cxListInsertAfter(&iter, &data);
   1.620 +    ++i;
   1.621 +    cxListInsertAfter(&iter, &testdata[i]);
   1.622      CU_ASSERT_EQUAL(iter.index, 2)
   1.623      CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.624 -    data = 20;
   1.625 -    cxListInsertBefore(&iter, &data);
   1.626 +    ++i;
   1.627 +    cxListInsertBefore(&iter, &testdata[i]);
   1.628      CU_ASSERT_EQUAL(iter.index, 3)
   1.629      CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.630  
   1.631 -    data = 30;
   1.632      iter = cxListBegin(list);
   1.633 -    cxListInsertBefore(&iter, &data);
   1.634 +    ++i;
   1.635 +    cxListInsertBefore(&iter, &testdata[i]);
   1.636      CU_ASSERT_EQUAL(iter.index, 1)
   1.637      CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 0)
   1.638 -    data = 40;
   1.639      iter = cxListIterator(list, list->size);
   1.640 -    cxListInsertBefore(&iter, &data);
   1.641 +    ++i;
   1.642 +    cxListInsertBefore(&iter, &testdata[i]);
   1.643      CU_ASSERT_EQUAL(iter.index, 9)
   1.644      CU_ASSERT_FALSE(cxIteratorValid(&iter))
   1.645 -    data = 50;
   1.646      iter = cxListIterator(list, list->size);
   1.647 -    cxListInsertAfter(&iter, &data);
   1.648 +    ++i;
   1.649 +    cxListInsertAfter(&iter, &testdata[i]);
   1.650      CU_ASSERT_EQUAL(iter.index, 10)
   1.651      CU_ASSERT_FALSE(cxIteratorValid(&iter))
   1.652  
   1.653      int expdata[] = {30, 0, 1, 20, 2, 10, 3, 4, 40, 50};
   1.654 -    CxList *expected = cxLinkedListFromArray(cxTestingAllocator,
   1.655 -                                             cmp_int, sizeof(int), 10, expdata);
   1.656 +    cx_for_n (j, 10) CU_ASSERT_EQUAL(*(int *) cxListAt(list, j), expdata[j])
   1.657 +    cxListDestroy(list);
   1.658 +}
   1.659  
   1.660 -    CU_ASSERT_EQUAL(0, cxListCompare(list, expected))
   1.661 -    cxListDestroy(list);
   1.662 -    cxListDestroy(expected);
   1.663 +void test_hl_linked_list_insert_via_iterator(void) {
   1.664 +    int testdata[] = {0, 1, 2, 3, 4, 10, 20, 30, 40, 50};
   1.665 +    // only add the first five elements, the remaining five will be inserted
   1.666 +    CxList *list = cxLinkedListFromArray(cxTestingAllocator, cmp_int, sizeof(int), 5, testdata);
   1.667 +    verify_hl_linked_list_insert_via_iterator(list, testdata);
   1.668  }
   1.669  
   1.670  void test_hl_ptr_linked_list_insert_via_iterator(void) {
   1.671      int testdata[] = {0, 1, 2, 3, 4, 10, 20, 30, 40, 50};
   1.672      CxList *list = cxPointerLinkedListCreate(cxTestingAllocator, cmp_int);
   1.673 -    int i;
   1.674 -    for (i = 0; i < 5; i++) {
   1.675 -        cxListAdd(list, &testdata[i]);
   1.676 -    }
   1.677 -    CxIterator iter = cxListIterator(list, 2);
   1.678 -    CU_ASSERT_EQUAL(iter.index, 2)
   1.679 -    CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.680 -
   1.681 -    cxListInsertAfter(&iter, &testdata[i++]);
   1.682 -    CU_ASSERT_EQUAL(iter.index, 2)
   1.683 -    CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.684 -    cxListInsertBefore(&iter, &testdata[i++]);
   1.685 -    CU_ASSERT_EQUAL(iter.index, 3)
   1.686 -    CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 2)
   1.687 -
   1.688 -    iter = cxListBegin(list);
   1.689 -    cxListInsertBefore(&iter, &testdata[i++]);
   1.690 -    CU_ASSERT_EQUAL(iter.index, 1)
   1.691 -    CU_ASSERT_EQUAL(*(int *) cxIteratorCurrent(&iter), 0)
   1.692 -    iter = cxListIterator(list, list->size);
   1.693 -    cxListInsertBefore(&iter, &testdata[i++]);
   1.694 -    CU_ASSERT_EQUAL(iter.index, 9)
   1.695 -    CU_ASSERT_FALSE(cxIteratorValid(&iter))
   1.696 -    iter = cxListIterator(list, list->size);
   1.697 -    cxListInsertAfter(&iter, &testdata[i++]);
   1.698 -    CU_ASSERT_EQUAL(iter.index, 10)
   1.699 -    CU_ASSERT_FALSE(cxIteratorValid(&iter))
   1.700 -
   1.701 -    int expdata[] = {30, 0, 1, 20, 2, 10, 3, 4, 40, 50};
   1.702 -    for (i = 0; i < 10; i++) {
   1.703 -        CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expdata[i])
   1.704 -    }
   1.705 -
   1.706 -    cxListDestroy(list);
   1.707 +    // only add the first five elements, the remaining five will be inserted
   1.708 +    cx_for_n (i, 5) cxListAdd(list, &testdata[i]);
   1.709 +    verify_hl_linked_list_insert_via_iterator(list, testdata);
   1.710  }
   1.711  
   1.712  static void test_setup_allocator(void) {

mercurial