tests/test_list.c

Fri, 12 Jan 2024 20:24:29 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 12 Jan 2024 20:24:29 +0100
changeset 803
0711d869ce4d
parent 801
04aa3913c0e3
child 804
5136f2fc32ec
permissions
-rw-r--r--

complete migration of list tests - fixes #342

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  */
    29 #include "cx/test.h"
    30 #include "util_allocator.h"
    31 #include "cx/compare.h"
    32 #include "cx/utils.h"
    34 #include "cx/array_list.h"
    35 #include "cx/linked_list.h"
    37 #include <stdarg.h>
    39 typedef struct node {
    40     struct node *next;
    41     struct node *prev;
    42     int data;
    43 } node;
    45 const ptrdiff_t loc_prev = offsetof(struct node, prev);
    46 const ptrdiff_t loc_next = offsetof(struct node, next);
    47 const ptrdiff_t loc_data = offsetof(struct node, data);
    49 static node *create_nodes_test_data(size_t len) {
    50     node *begin = calloc(1, sizeof(node));
    51     void *prev = begin;
    52     for (size_t i = 1; i < len; i++) {
    53         node *n = calloc(1, sizeof(node));
    54         cx_linked_list_link(prev, n, loc_prev, loc_next);
    55         prev = n;
    56     }
    57     return begin;
    58 }
    60 void assign_nodes_test_data(node *n, ...) {
    61     va_list ap;
    62     va_start(ap, n);
    63     while (n != NULL) {
    64         n->data = va_arg(ap, int);
    65         n = n->next;
    66     }
    67     va_end(ap);
    68 }
    70 static void destroy_nodes_test_data(node *n) {
    71     while (n != NULL) {
    72         void *next = n->next;
    73         free(n);
    74         n = next;
    75     }
    76 }
    78 static int *int_test_data(size_t len) {
    79     int *data = malloc(len*sizeof(int));
    80     for (size_t i = 0 ; i < len ; i++) {
    81         data[i] = rand(); // NOLINT(*-msc50-cpp)
    82     }
    83     return data;
    84 }
    86 CX_TEST(test_linked_list_link_unlink) {
    87     node a = {0}, b = {0}, c = {0};
    89     CX_TEST_DO {
    90         cx_linked_list_link(&a, &b, loc_prev, loc_next);
    91         CX_TEST_ASSERT(a.prev == NULL);
    92         CX_TEST_ASSERT(a.next == &b);
    93         CX_TEST_ASSERT(b.prev == &a);
    94         CX_TEST_ASSERT(b.next == NULL);
    96         cx_linked_list_unlink(&a, &b, loc_prev, loc_next);
    97         CX_TEST_ASSERT(a.prev == NULL);
    98         CX_TEST_ASSERT(a.next == NULL);
    99         CX_TEST_ASSERT(b.prev == NULL);
   100         CX_TEST_ASSERT(b.next == NULL);
   102         cx_linked_list_link(&b, &c, loc_prev, loc_next);
   103         cx_linked_list_link(&a, &b, loc_prev, loc_next);
   104         cx_linked_list_unlink(&b, &c, loc_prev, loc_next);
   105         CX_TEST_ASSERT(a.prev == NULL);
   106         CX_TEST_ASSERT(a.next == &b);
   107         CX_TEST_ASSERT(b.prev == &a);
   108         CX_TEST_ASSERT(b.next == NULL);
   109         CX_TEST_ASSERT(c.prev == NULL);
   110         CX_TEST_ASSERT(c.next == NULL);
   111     }
   112 }
   114 CX_TEST(test_linked_list_at) {
   115     node a = {0}, b = {0}, c = {0}, d = {0};
   117     cx_linked_list_link(&a, &b, loc_prev, loc_next);
   118     cx_linked_list_link(&b, &c, loc_prev, loc_next);
   119     cx_linked_list_link(&c, &d, loc_prev, loc_next);
   121     CX_TEST_DO {
   122         CX_TEST_ASSERT(cx_linked_list_at(&a, 0, loc_next, 0) == &a);
   123         CX_TEST_ASSERT(cx_linked_list_at(&a, 0, loc_next, 1) == &b);
   124         CX_TEST_ASSERT(cx_linked_list_at(&a, 0, loc_next, 2) == &c);
   125         CX_TEST_ASSERT(cx_linked_list_at(&a, 0, loc_next, 3) == &d);
   126         CX_TEST_ASSERT(cx_linked_list_at(&a, 0, loc_next, 4) == NULL);
   127         CX_TEST_ASSERT(cx_linked_list_at(&b, 1, loc_prev, 0) == &a);
   128         CX_TEST_ASSERT(cx_linked_list_at(&b, 1, loc_next, 1) == &b);
   129         CX_TEST_ASSERT(cx_linked_list_at(&b, 1, loc_next, 2) == &c);
   130         CX_TEST_ASSERT(cx_linked_list_at(&b, 1, loc_next, 3) == &d);
   131         CX_TEST_ASSERT(cx_linked_list_at(&b, 1, loc_next, 4) == NULL);
   132         CX_TEST_ASSERT(cx_linked_list_at(&d, 3, loc_prev, 0) == &a);
   133         CX_TEST_ASSERT(cx_linked_list_at(&d, 3, loc_prev, 1) == &b);
   134     }
   135 }
   137 CX_TEST(test_linked_list_find) {
   138     void *list = create_nodes_test_data(4);
   139     assign_nodes_test_data(list, 2, 4, 6, 8);
   140     CX_TEST_DO {
   141         int s;
   142         s = 2;
   143         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) == 0);
   144         s = 4;
   145         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) == 1);
   146         s = 6;
   147         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) == 2);
   148         s = 8;
   149         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) == 3);
   150         s = 10;
   151         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) < 0);
   152         s = -2;
   153         CX_TEST_ASSERT(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s) < 0);
   154     }
   155     destroy_nodes_test_data(list);
   156 }
   158 CX_TEST(test_linked_list_compare) {
   159     void *la = create_nodes_test_data(4);
   160     void *lb = create_nodes_test_data(3);
   161     void *lc = create_nodes_test_data(4);
   162     assign_nodes_test_data(la, 2, 4, 6, 8);
   163     assign_nodes_test_data(lb, 2, 4, 6);
   164     assign_nodes_test_data(lc, 2, 4, 6, 9);
   165     CX_TEST_DO {
   166         CX_TEST_ASSERT(cx_linked_list_compare(la, lb, loc_next, loc_data, cx_cmp_int) > 0);
   167         CX_TEST_ASSERT(cx_linked_list_compare(lb, la, loc_next, loc_data, cx_cmp_int) < 0);
   168         CX_TEST_ASSERT(cx_linked_list_compare(lc, la, loc_next, loc_data, cx_cmp_int) > 0);
   169         CX_TEST_ASSERT(cx_linked_list_compare(la, lc, loc_next, loc_data, cx_cmp_int) < 0);
   170         CX_TEST_ASSERT(cx_linked_list_compare(la, la, loc_next, loc_data, cx_cmp_int) == 0);
   171     }
   172     destroy_nodes_test_data(la);
   173     destroy_nodes_test_data(lb);
   174     destroy_nodes_test_data(lc);
   175 }
   177 CX_TEST(test_linked_list_add) {
   178     node nodes[4];
   179     void *begin, *end;
   180     CX_TEST_DO {
   181         // test with begin, end / prev, next
   182         memset(nodes, 0, sizeof(node)*4);
   183         end = begin = NULL;
   185         cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]);
   186         CX_TEST_ASSERT(begin == &nodes[0]);
   187         CX_TEST_ASSERT(end == &nodes[0]);
   188         CX_TEST_ASSERT(nodes[0].prev == NULL);
   189         CX_TEST_ASSERT(nodes[0].next == NULL);
   191         cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]);
   192         CX_TEST_ASSERT(begin == &nodes[0]);
   193         CX_TEST_ASSERT(end == &nodes[1]);
   194         CX_TEST_ASSERT(nodes[0].next == &nodes[1]);
   195         CX_TEST_ASSERT(nodes[1].prev == &nodes[0]);
   197         // test with begin only / prev, next
   198         memset(nodes, 0, sizeof(node)*4);
   199         end = begin = NULL;
   201         cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[0]);
   202         CX_TEST_ASSERT(begin == &nodes[0]);
   203         cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[1]);
   204         CX_TEST_ASSERT(begin == &nodes[0]);
   205         CX_TEST_ASSERT(nodes[0].next == &nodes[1]);
   206         CX_TEST_ASSERT(nodes[1].prev == &nodes[0]);
   208         cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[2]);
   209         CX_TEST_ASSERT(nodes[1].next == &nodes[2]);
   210         CX_TEST_ASSERT(nodes[2].prev == &nodes[1]);
   212         // test with end only / prev, next
   213         memset(nodes, 0, sizeof(node)*4);
   214         end = begin = NULL;
   216         cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[0]);
   217         CX_TEST_ASSERT(end == &nodes[0]);
   218         cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[1]);
   219         CX_TEST_ASSERT(end == &nodes[1]);
   220         CX_TEST_ASSERT(nodes[0].next == &nodes[1]);
   221         CX_TEST_ASSERT(nodes[1].prev == &nodes[0]);
   223         cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[2]);
   224         CX_TEST_ASSERT(end == &nodes[2]);
   225         CX_TEST_ASSERT(nodes[1].next == &nodes[2]);
   226         CX_TEST_ASSERT(nodes[2].prev == &nodes[1]);
   228         // test with begin, end / next
   229         memset(nodes, 0, sizeof(node)*4);
   230         end = begin = NULL;
   232         cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[0]);
   233         CX_TEST_ASSERT(begin == &nodes[0]);
   234         CX_TEST_ASSERT(end == &nodes[0]);
   235         cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[1]);
   236         CX_TEST_ASSERT(end == &nodes[1]);
   237         CX_TEST_ASSERT(nodes[0].next == &nodes[1]);
   238         CX_TEST_ASSERT(nodes[1].prev == NULL);
   239     }
   240 }
   242 CX_TEST(test_linked_list_prepend) {
   243     node nodes[4];
   244     void *begin, *end;
   245     CX_TEST_DO {
   246         // test with begin, end / prev, next
   247         memset(nodes, 0, sizeof(node) * 4);
   248         end = begin = NULL;
   250         cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[0]);
   251         CX_TEST_ASSERT(begin == &nodes[0]);
   252         CX_TEST_ASSERT(end == &nodes[0]);
   253         CX_TEST_ASSERT(nodes[0].prev == NULL);
   254         CX_TEST_ASSERT(nodes[0].next == NULL);
   256         cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[1]);
   257         CX_TEST_ASSERT(begin == &nodes[1]);
   258         CX_TEST_ASSERT(end == &nodes[0]);
   259         CX_TEST_ASSERT(nodes[1].next == &nodes[0]);
   260         CX_TEST_ASSERT(nodes[0].prev == &nodes[1]);
   262         // test with begin only / prev, next
   263         memset(nodes, 0, sizeof(node) * 4);
   264         end = begin = NULL;
   266         cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[0]);
   267         CX_TEST_ASSERT(begin == &nodes[0]);
   268         cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[1]);
   269         CX_TEST_ASSERT(begin == &nodes[1]);
   270         CX_TEST_ASSERT(nodes[1].next == &nodes[0]);
   271         CX_TEST_ASSERT(nodes[0].prev == &nodes[1]);
   273         cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[2]);
   274         CX_TEST_ASSERT(begin == &nodes[2]);
   275         CX_TEST_ASSERT(nodes[2].next == &nodes[1]);
   276         CX_TEST_ASSERT(nodes[1].prev == &nodes[2]);
   278         // test with end only / prev, next
   279         memset(nodes, 0, sizeof(node) * 4);
   280         end = begin = NULL;
   282         cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[0]);
   283         CX_TEST_ASSERT(end == &nodes[0]);
   284         cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[1]);
   285         CX_TEST_ASSERT(end == &nodes[0]);
   286         CX_TEST_ASSERT(nodes[1].next == &nodes[0]);
   287         CX_TEST_ASSERT(nodes[0].prev == &nodes[1]);
   289         cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[2]);
   290         CX_TEST_ASSERT(end == &nodes[0]);
   291         CX_TEST_ASSERT(nodes[2].next == &nodes[1]);
   292         CX_TEST_ASSERT(nodes[1].prev == &nodes[2]);
   294         // test with begin, end / next
   295         memset(nodes, 0, sizeof(node) * 4);
   296         end = begin = NULL;
   298         cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[0]);
   299         CX_TEST_ASSERT(begin == &nodes[0]);
   300         CX_TEST_ASSERT(end == &nodes[0]);
   301         cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[1]);
   302         cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[2]);
   303         CX_TEST_ASSERT(begin == &nodes[2]);
   304         CX_TEST_ASSERT(end == &nodes[0]);
   305         CX_TEST_ASSERT(nodes[1].next == &nodes[0]);
   306         CX_TEST_ASSERT(nodes[2].next == &nodes[1]);
   307         CX_TEST_ASSERT(nodes[1].prev == NULL);
   308         CX_TEST_ASSERT(nodes[0].prev == NULL);
   309     }
   310 }
   312 CX_TEST(test_linked_list_insert) {
   313     node nodes[4];
   314     void *begin, *end;
   315     CX_TEST_DO {
   316         // insert mid list
   317         memset(nodes, 0, sizeof(node) * 4);
   318         begin = &nodes[0];
   319         end = &nodes[2];
   321         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   322         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   324         cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3]);
   325         CX_TEST_ASSERT(begin == &nodes[0]);
   326         CX_TEST_ASSERT(end == &nodes[2]);
   327         CX_TEST_ASSERT(nodes[1].next == &nodes[3]);
   328         CX_TEST_ASSERT(nodes[2].prev == &nodes[3]);
   329         CX_TEST_ASSERT(nodes[3].prev == &nodes[1]);
   330         CX_TEST_ASSERT(nodes[3].next == &nodes[2]);
   332         // insert end
   333         memset(nodes, 0, sizeof(node) * 4);
   334         begin = &nodes[0];
   335         end = &nodes[2];
   337         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   338         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   340         cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3]);
   341         CX_TEST_ASSERT(begin == &nodes[0]);
   342         CX_TEST_ASSERT(end == &nodes[3]);
   343         CX_TEST_ASSERT(nodes[2].next == &nodes[3]);
   344         CX_TEST_ASSERT(nodes[3].prev == &nodes[2]);
   345         CX_TEST_ASSERT(nodes[3].next == NULL);
   347         // insert begin
   348         memset(nodes, 0, sizeof(node) * 4);
   349         begin = &nodes[0];
   350         end = &nodes[2];
   352         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   353         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   355         cx_linked_list_insert(&begin, &end, loc_prev, loc_next, NULL, &nodes[3]);
   356         CX_TEST_ASSERT(begin == &nodes[3]);
   357         CX_TEST_ASSERT(end == &nodes[2]);
   358         CX_TEST_ASSERT(nodes[0].prev == &nodes[3]);
   359         CX_TEST_ASSERT(nodes[3].prev == NULL);
   360         CX_TEST_ASSERT(nodes[3].next == &nodes[0]);
   361     }
   362 }
   364 CX_TEST(test_linked_list_insert_chain) {
   365     node nodes[5];
   366     void *begin, *end;
   367     CX_TEST_DO {
   368         // insert mid list
   369         memset(nodes, 0, sizeof(node) * 5);
   370         begin = &nodes[0]; end = &nodes[2];
   372         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   373         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   374         cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   376         cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3], NULL);
   377         CX_TEST_ASSERT(begin == &nodes[0]);
   378         CX_TEST_ASSERT(end == &nodes[2]);
   379         CX_TEST_ASSERT(nodes[1].next == &nodes[3]);
   380         CX_TEST_ASSERT(nodes[2].prev == &nodes[4]);
   381         CX_TEST_ASSERT(nodes[3].prev == &nodes[1]);
   382         CX_TEST_ASSERT(nodes[4].next == &nodes[2]);
   384         // insert end
   385         memset(nodes, 0, sizeof(node) * 5);
   386         begin = &nodes[0]; end = &nodes[2];
   388         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   389         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   390         cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   392         cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3], NULL);
   393         CX_TEST_ASSERT(begin == &nodes[0]);
   394         CX_TEST_ASSERT(end == &nodes[4]);
   395         CX_TEST_ASSERT(nodes[2].next == &nodes[3]);
   396         CX_TEST_ASSERT(nodes[3].prev == &nodes[2]);
   397         CX_TEST_ASSERT(nodes[4].next == NULL);
   399         // insert begin
   400         memset(nodes, 0, sizeof(node) * 5);
   401         begin = &nodes[0]; end = &nodes[2];
   403         cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   404         cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   405         cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   407         cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, NULL, &nodes[3], NULL);
   408         CX_TEST_ASSERT(begin == &nodes[3]);
   409         CX_TEST_ASSERT(end == &nodes[2]);
   410         CX_TEST_ASSERT(nodes[0].prev == &nodes[4]);
   411         CX_TEST_ASSERT(nodes[3].prev == NULL);
   412         CX_TEST_ASSERT(nodes[4].next == &nodes[0]);
   413     }
   414 }
   416 CX_TEST(test_linked_list_first) {
   417     node *testdata = create_nodes_test_data(3);
   418     void *begin = testdata;
   419     CX_TEST_DO {
   420         CX_TEST_ASSERT(begin == cx_linked_list_first(testdata, loc_prev));
   421         CX_TEST_ASSERT(begin == cx_linked_list_first(testdata->next, loc_prev));
   422         CX_TEST_ASSERT(begin == cx_linked_list_first(testdata->next->next, loc_prev));
   423     }
   424     destroy_nodes_test_data(testdata);
   425 }
   427 CX_TEST(test_linked_list_last) {
   428     node *testdata = create_nodes_test_data(3);
   429     void *end = testdata->next->next;
   430     CX_TEST_DO {
   431         CX_TEST_ASSERT(end == cx_linked_list_last(testdata, loc_next));
   432         CX_TEST_ASSERT(end == cx_linked_list_last(testdata->next, loc_next));
   433         CX_TEST_ASSERT(end == cx_linked_list_last(testdata->next->next, loc_next));
   434     }
   435     destroy_nodes_test_data(testdata);
   436 }
   438 CX_TEST(test_linked_list_prev) {
   439     node *testdata = create_nodes_test_data(3);
   440     CX_TEST_DO {
   441         CX_TEST_ASSERT(cx_linked_list_prev(testdata, loc_next, testdata) == NULL);
   442         CX_TEST_ASSERT(cx_linked_list_prev(testdata, loc_next, testdata->next) == testdata);
   443         CX_TEST_ASSERT(cx_linked_list_prev(testdata, loc_next, testdata->next->next) == testdata->next);
   444     }
   445     destroy_nodes_test_data(testdata);
   446 }
   448 CX_TEST(test_linked_list_remove) {
   449     node *testdata = create_nodes_test_data(3);
   450     assign_nodes_test_data(testdata, 2, 4, 6);
   451     node *first = testdata;
   452     node *second = first->next;
   453     node *third = second->next;
   454     void *begin = testdata;
   455     void *end = third;
   457     CX_TEST_DO {
   458         cx_linked_list_remove(&begin, &end, loc_prev, loc_next, second);
   459         CX_TEST_ASSERT(begin == first);
   460         CX_TEST_ASSERT(end == third);
   461         CX_TEST_ASSERT(first->prev == NULL);
   462         CX_TEST_ASSERT(first->next == third);
   463         CX_TEST_ASSERT(third->prev == first);
   464         CX_TEST_ASSERT(third->next == NULL);
   466         cx_linked_list_remove(&begin, &end, loc_prev, loc_next, third);
   467         CX_TEST_ASSERT(begin == first);
   468         CX_TEST_ASSERT(end == first);
   469         CX_TEST_ASSERT(first->prev == NULL);
   470         CX_TEST_ASSERT(first->next == NULL);
   472         cx_linked_list_remove(&begin, &end, loc_prev, loc_next, first);
   473         CX_TEST_ASSERT(begin == NULL);
   474         CX_TEST_ASSERT(end == NULL);
   475     }
   476     // list is not intact anymore, we have to free nodes individually
   477     free(first);
   478     free(second);
   479     free(third);
   480 }
   482 CX_TEST(test_linked_list_size) {
   483     node *td5 = create_nodes_test_data(5);
   484     node *td13 = create_nodes_test_data(13);
   485     CX_TEST_DO {
   486         CX_TEST_ASSERT(cx_linked_list_size(NULL, loc_next) == 0);
   487         CX_TEST_ASSERT(cx_linked_list_size(td5, loc_next) == 5);
   488         CX_TEST_ASSERT(cx_linked_list_size(td13, loc_next) == 13);
   489     }
   490     destroy_nodes_test_data(td5);
   491     destroy_nodes_test_data(td13);
   492 }
   494 CX_TEST(test_linked_list_sort_empty) {
   495     void *begin = NULL;
   496     CX_TEST_DO {
   497         // cannot assert something, we can just test that it does not crash
   498         cx_linked_list_sort(&begin, NULL, loc_prev, loc_next, loc_data, cx_cmp_int);
   499         CX_TEST_ASSERT(true);
   500     }
   501 }
   503 CX_TEST(test_linked_list_sort) {
   504     const size_t len = 1500;
   505     int *testdata = int_test_data(len);
   506     void *scrambled = create_nodes_test_data(len);
   507     node *n = scrambled;
   508     for (size_t i = 0; i < len; i++) {
   509         n->data = testdata[i];
   510         n = n->next;
   511     }
   512     int *sorted = malloc(len*sizeof(int));
   513     memcpy(sorted, testdata, len*sizeof(int));
   514     qsort(sorted, len, sizeof(int), cx_cmp_int);
   516     void *begin = scrambled;
   517     void *end = cx_linked_list_last(begin, loc_next);
   519     CX_TEST_DO {
   520         cx_linked_list_sort(&begin, &end, loc_prev, loc_next, loc_data, cx_cmp_int);
   521         node *check = begin;
   522         node *check_last = NULL;
   523         for (size_t i = 0; i < len; i++) {
   524             CX_TEST_ASSERT(check->data == sorted[i]);
   525             CX_TEST_ASSERT(check->prev == check_last);
   526             if (i < len - 1) {
   527                 CX_TEST_ASSERT(check->next != NULL);
   528             }
   529             check_last = check;
   530             check = check->next;
   531         }
   532         CX_TEST_ASSERT(check == NULL);
   533         CX_TEST_ASSERT(end == check_last);
   534     }
   535     destroy_nodes_test_data(begin);
   536     free(sorted);
   537     free(testdata);
   538 }
   540 CX_TEST(test_linked_list_reverse) {
   541     void *testdata = create_nodes_test_data(4);
   542     void *expected = create_nodes_test_data(4);
   543     assign_nodes_test_data(testdata, 2, 4, 6, 8);
   544     assign_nodes_test_data(expected, 8, 6, 4, 2);
   545     void *begin = testdata;
   546     CX_TEST_DO {
   547         void *end = cx_linked_list_last(begin, loc_next);
   548         void *orig_begin = begin, *orig_end = end;
   550         cx_linked_list_reverse(&begin, &end, loc_prev, loc_next);
   551         CX_TEST_ASSERT(end == orig_begin);
   552         CX_TEST_ASSERT(begin == orig_end);
   553         CX_TEST_ASSERT(0 == cx_linked_list_compare(begin, expected, loc_next, loc_data, cx_cmp_int));
   554     }
   555     destroy_nodes_test_data(begin);
   556     destroy_nodes_test_data(expected);
   557 }
   560 CX_TEST(test_empty_list_size) {
   561     CX_TEST_DO {
   562         CX_TEST_ASSERT(cxEmptyList->size == 0);
   563         CX_TEST_ASSERT(cxListSize(cxEmptyList) == 0);
   564     }
   565 }
   567 CX_TEST(test_empty_list_iterator) {
   568     CxList *list = cxEmptyList;
   570     CxIterator it1 = cxListIterator(list);
   571     CxIterator it2 = cxListBackwardsIterator(list);
   572     CxMutIterator it3 = cxListMutIterator(list);
   573     CxMutIterator it4 = cxListMutBackwardsIterator(list);
   575     CX_TEST_DO {
   576         CX_TEST_ASSERT(!cxIteratorValid(it1));
   577         CX_TEST_ASSERT(!cxIteratorValid(it2));
   578         CX_TEST_ASSERT(!cxIteratorValid(it3));
   579         CX_TEST_ASSERT(!cxIteratorValid(it4));
   581         int c = 0;
   582         cx_foreach(void*, data, it1) c++;
   583         cx_foreach(void*, data, it2) c++;
   584         cx_foreach(void*, data, it3) c++;
   585         cx_foreach(void*, data, it4) c++;
   586         CX_TEST_ASSERT(c == 0);
   587     }
   588 }
   590 CX_TEST(test_empty_list_noops) {
   591     CX_TEST_DO {
   592         CxList copy = *cxEmptyList;
   593         cxListSort(cxEmptyList);
   594         cxListClear(cxEmptyList);
   595         cxListDestroy(cxEmptyList);
   596         CX_TEST_ASSERT(0 == memcmp(&copy, cxEmptyList, sizeof(CxList))); // NOLINT(*-suspicious-memory-comparison)
   597     }
   598 }
   600 CX_TEST(test_empty_list_at) {
   601     CX_TEST_DO {
   602         CX_TEST_ASSERT(cxListAt(cxEmptyList, 0) == NULL);
   603         CX_TEST_ASSERT(cxListAt(cxEmptyList, 1) == NULL);
   604     }
   605 }
   607 CX_TEST(test_empty_list_find) {
   608     int x = 42, y = 1337;
   609     CX_TEST_DO {
   610         CX_TEST_ASSERT(cxListFind(cxEmptyList, &x) < 0);
   611         CX_TEST_ASSERT(cxListFind(cxEmptyList, &y) < 0);
   612     }
   613 }
   615 CX_TEST(test_empty_list_compare) {
   616     CxList *empty = cxEmptyList;
   617     CxList *ll = cxLinkedListCreateSimple(sizeof(int));
   618     CxList *al = cxArrayListCreateSimple(sizeof(int), 8);
   619     int x = 5;
   620     CX_TEST_DO {
   621         CX_TEST_ASSERT(0 == cxListCompare(empty, cxEmptyList));
   622         CX_TEST_ASSERT(0 == cxListCompare(ll, cxEmptyList));
   623         CX_TEST_ASSERT(0 == cxListCompare(al, cxEmptyList));
   624         CX_TEST_ASSERT(0 == cxListCompare(cxEmptyList, ll));
   625         CX_TEST_ASSERT(0 == cxListCompare(cxEmptyList, al));
   627         cxListAdd(ll, &x);
   628         cxListAdd(al, &x);
   630         CX_TEST_ASSERT(0 < cxListCompare(ll, cxEmptyList));
   631         CX_TEST_ASSERT(0 < cxListCompare(al, cxEmptyList));
   632         CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, ll));
   633         CX_TEST_ASSERT(0 > cxListCompare(cxEmptyList, al));
   634     }
   635     cxListDestroy(ll);
   636     cxListDestroy(al);
   637 }
   639 CX_TEST(test_list_ll_create) {
   640     CxTestingAllocator talloc;
   641     cx_testing_allocator_init(&talloc);
   642     CxAllocator *alloc = &talloc.base;
   643     CX_TEST_DO {
   644         CxList *list = cxLinkedListCreate(alloc, cx_cmp_int, sizeof(int));
   645         CX_TEST_ASSERT(list != NULL);
   646         CX_TEST_ASSERT(list->item_size == sizeof(int));
   647         CX_TEST_ASSERT(list->simple_destructor == NULL);
   648         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   649         CX_TEST_ASSERT(list->destructor_data == NULL);
   650         CX_TEST_ASSERT(cxListSize(list) == 0);
   651         CX_TEST_ASSERT(list->allocator == alloc);
   652         CX_TEST_ASSERT(list->cmpfunc == cx_cmp_int);
   653         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   654         cxListDestroy(list);
   655         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   656     }
   657     cx_testing_allocator_destroy(&talloc);
   658 }
   660 CX_TEST(test_list_ll_create_simple) {
   661     CxList *list = cxLinkedListCreateSimple(sizeof(int));
   662     CX_TEST_DO {
   663         CX_TEST_ASSERT(list != NULL);
   664         CX_TEST_ASSERT(list->item_size == sizeof(int));
   665         CX_TEST_ASSERT(list->simple_destructor == NULL);
   666         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   667         CX_TEST_ASSERT(list->destructor_data == NULL);
   668         CX_TEST_ASSERT(cxListSize(list) == 0);
   669         CX_TEST_ASSERT(list->allocator == cxDefaultAllocator);
   670         CX_TEST_ASSERT(list->cmpfunc == NULL);
   671         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   672     }
   673     cxListDestroy(list);
   674 }
   676 CX_TEST(test_list_ll_store_pointers) {
   677     CxList *list = cxLinkedListCreateSimple(47);
   678     CX_TEST_DO {
   679         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   680         cxListStorePointers(list);
   681         CX_TEST_ASSERT(list->item_size == sizeof(void *));
   682         CX_TEST_ASSERT(list->cl != NULL);
   683         CX_TEST_ASSERT(list->climpl != NULL);
   684         CX_TEST_ASSERT(cxListIsStoringPointers(list));
   685         cxListStoreObjects(list);
   686         CX_TEST_ASSERT(list->cl != NULL);
   687         CX_TEST_ASSERT(list->climpl == NULL);
   688         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   689     }
   690     cxListDestroy(list);
   691 }
   693 CX_TEST(test_list_ll_create_simple_for_pointers) {
   694     CxList *list = cxLinkedListCreateSimple(CX_STORE_POINTERS);
   695     CX_TEST_DO {
   696         CX_TEST_ASSERT(list != NULL);
   697         CX_TEST_ASSERT(list->item_size == sizeof(void*));
   698         CX_TEST_ASSERT(list->simple_destructor == NULL);
   699         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   700         CX_TEST_ASSERT(list->destructor_data == NULL);
   701         CX_TEST_ASSERT(cxListSize(list) == 0);
   702         CX_TEST_ASSERT(list->allocator == cxDefaultAllocator);
   703         CX_TEST_ASSERT(list->cmpfunc == cx_cmp_ptr);
   704         CX_TEST_ASSERT(cxListIsStoringPointers(list));
   705     }
   706     cxListDestroy(list);
   707 }
   709 CX_TEST(test_list_arl_create) {
   710     CxTestingAllocator talloc;
   711     cx_testing_allocator_init(&talloc);
   712     CxAllocator *alloc = &talloc.base;
   713     CX_TEST_DO {
   714         CxList *list = cxArrayListCreate(alloc, cx_cmp_int, sizeof(int), 8);
   715         CX_TEST_ASSERT(list != NULL);
   716         CX_TEST_ASSERT(list->item_size == sizeof(int));
   717         CX_TEST_ASSERT(list->simple_destructor == NULL);
   718         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   719         CX_TEST_ASSERT(list->destructor_data == NULL);
   720         CX_TEST_ASSERT(cxListSize(list) == 0);
   721         CX_TEST_ASSERT(list->allocator == alloc);
   722         CX_TEST_ASSERT(list->cmpfunc == cx_cmp_int);
   723         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   724         cxListDestroy(list);
   725         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   726     }
   727     cx_testing_allocator_destroy(&talloc);
   728 }
   730 CX_TEST(test_list_arl_create_simple) {
   731     CxList *list = cxArrayListCreateSimple(sizeof(int), 8);
   732     CX_TEST_DO {
   733         CX_TEST_ASSERT(list != NULL);
   734         CX_TEST_ASSERT(list->item_size == sizeof(int));
   735         CX_TEST_ASSERT(list->simple_destructor == NULL);
   736         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   737         CX_TEST_ASSERT(list->destructor_data == NULL);
   738         CX_TEST_ASSERT(cxListSize(list) == 0);
   739         CX_TEST_ASSERT(list->allocator == cxDefaultAllocator);
   740         CX_TEST_ASSERT(list->cmpfunc == NULL);
   741         CX_TEST_ASSERT(!cxListIsStoringPointers(list));
   742     }
   743     cxListDestroy(list);
   744 }
   746 CX_TEST(test_list_arl_create_simple_for_pointers) {
   747     CxList *list = cxArrayListCreateSimple(CX_STORE_POINTERS, 8);
   748     CX_TEST_DO {
   749         CX_TEST_ASSERT(list != NULL);
   750         CX_TEST_ASSERT(list->item_size == sizeof(void*));
   751         CX_TEST_ASSERT(list->simple_destructor == NULL);
   752         CX_TEST_ASSERT(list->advanced_destructor == NULL);
   753         CX_TEST_ASSERT(list->destructor_data == NULL);
   754         CX_TEST_ASSERT(cxListSize(list) == 0);
   755         CX_TEST_ASSERT(list->allocator == cxDefaultAllocator);
   756         CX_TEST_ASSERT(list->cmpfunc == cx_cmp_ptr);
   757         CX_TEST_ASSERT(cxListIsStoringPointers(list));
   758     }
   759     cxListDestroy(list);
   760 }
   762 static void test_fake_simple_int_destr(void *elem) {
   763     *(int *) elem = 42;
   764 }
   766 CX_TEST(test_list_pll_destroy_no_destr) {
   767     CxTestingAllocator talloc;
   768     cx_testing_allocator_init(&talloc);
   769     CxAllocator *alloc = &talloc.base;
   770     CX_TEST_DO {
   771         void *item = cxMalloc(alloc, sizeof(int));
   772         CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
   773         cxListAdd(list, item);
   774         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   775         cxListDestroy(list);
   776         // item is not yet freed
   777         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   778         cxFree(alloc, item);
   779         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   780     }
   781     cx_testing_allocator_destroy(&talloc);
   782 }
   784 CX_TEST(test_list_pll_destroy_simple_destr) {
   785     CX_TEST_DO {
   786         int item = 0;
   787         CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
   788         list->simple_destructor = test_fake_simple_int_destr;
   789         cxListAdd(list, &item);
   790         cxListDestroy(list);
   791         CX_TEST_ASSERT(item == 42);
   792     }
   793 }
   795 CX_TEST(test_list_pll_destroy_adv_destr) {
   796     CxTestingAllocator talloc;
   797     cx_testing_allocator_init(&talloc);
   798     CxAllocator *alloc = &talloc.base;
   799     CX_TEST_DO {
   800         void *item = cxMalloc(alloc, sizeof(int));
   801         CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
   802         list->destructor_data = alloc;
   803         list->advanced_destructor = (cx_destructor_func2) cxFree;
   804         cxListAdd(list, item);
   805         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   806         cxListDestroy(list);
   807         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   808     }
   809     cx_testing_allocator_destroy(&talloc);
   810 }
   812 CX_TEST(test_list_parl_destroy_no_destr) {
   813     CxTestingAllocator talloc;
   814     cx_testing_allocator_init(&talloc);
   815     CxAllocator *alloc = &talloc.base;
   816     CX_TEST_DO {
   817         void *item = cxMalloc(alloc, sizeof(int));
   818         CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
   819         cxListAdd(list, item);
   820         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   821         cxListDestroy(list);
   822         // item is not yet freed
   823         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   824         cxFree(alloc, item);
   825         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   826     }
   827     cx_testing_allocator_destroy(&talloc);
   828 }
   830 CX_TEST(test_list_parl_destroy_simple_destr) {
   831     CX_TEST_DO {
   832         int item = 0;
   833         CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
   834         list->simple_destructor = test_fake_simple_int_destr;
   835         cxListAdd(list, &item);
   836         cxListDestroy(list);
   837         CX_TEST_ASSERT(item == 42);
   838     }
   839 }
   841 CX_TEST(test_list_parl_destroy_adv_destr) {
   842     CxTestingAllocator talloc;
   843     cx_testing_allocator_init(&talloc);
   844     CxAllocator *alloc = &talloc.base;
   845     CX_TEST_DO {
   846         void *item = cxMalloc(alloc, sizeof(int));
   847         CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
   848         list->destructor_data = alloc;
   849         list->advanced_destructor = (cx_destructor_func2) cxFree;
   850         cxListAdd(list, item);
   851         CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
   852         cxListDestroy(list);
   853         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
   854     }
   855     cx_testing_allocator_destroy(&talloc);
   856 }
   858 #define set_up_combo \
   859     CxTestingAllocator talloc; \
   860     cx_testing_allocator_init(&talloc); \
   861     CxAllocator *alloc = &talloc.base; \
   862     CX_TEST_DO {
   863 #define tear_down_combo \
   864         cxListDestroy(list); \
   865         CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));\
   866     } \
   867     cx_testing_allocator_destroy(&talloc);
   868 #define roll_out_test_combos(name, body) \
   869 static CX_TEST_SUBROUTINE(test_list_verify_##name, CxList *list, \
   870     __attribute__((__unused__)) bool isptrlist, \
   871     __attribute__((__unused__)) bool islinkedlist) body \
   872 CX_TEST(test_list_ll_##name) { \
   873     set_up_combo \
   874         CxList *list = cxLinkedListCreate(alloc, cx_cmp_int, sizeof(int)); \
   875         CX_TEST_CALL_SUBROUTINE(test_list_verify_##name, list, false, true); \
   876     tear_down_combo \
   877 } \
   878 CX_TEST(test_list_arl_##name) { \
   879     set_up_combo \
   880         CxList *list = cxArrayListCreate(alloc, cx_cmp_int, sizeof(int), 8); \
   881         CX_TEST_CALL_SUBROUTINE(test_list_verify_##name, list, false, false); \
   882     tear_down_combo \
   883 } \
   884 CX_TEST(test_list_pll_##name) { \
   885     set_up_combo \
   886         CxList *list = cxLinkedListCreate(alloc, cx_cmp_int, CX_STORE_POINTERS); \
   887         CX_TEST_CALL_SUBROUTINE(test_list_verify_##name, list, true, true); \
   888     tear_down_combo \
   889 } \
   890 CX_TEST(test_list_parl_##name) { \
   891     set_up_combo \
   892         CxList *list = cxArrayListCreate(alloc, cx_cmp_int, CX_STORE_POINTERS, 8); \
   893         CX_TEST_CALL_SUBROUTINE(test_list_verify_##name, list, true, false); \
   894     tear_down_combo \
   895 }
   896 #define array_init(...) {__VA_ARGS__}
   898 static inline int *int_test_data_added_to_list(CxList *list, bool isptrlist, size_t len) {
   899     int *testdata = int_test_data(len);
   900     if (isptrlist) {
   901         cx_for_n(i, len) {
   902             cxListAdd(list, &testdata[i]);
   903         }
   904     } else {
   905         cxListAddArray(list, testdata, len);
   906     }
   907     return testdata;
   908 }
   910 roll_out_test_combos(add, {
   911     const size_t len = 250;
   912     int *testdata = int_test_data(len);
   913     cx_for_n (i, len) CX_TEST_ASSERT(cxListAdd(list, &testdata[i]) == 0);
   914     CX_TEST_ASSERT(cxListSize(list) == len);
   915     cx_for_n (i, len) CX_TEST_ASSERT(*(int *) cxListAt(list, i) == testdata[i]);
   916     cx_for_n (i, len) ++testdata[i];
   917     if (isptrlist) {
   918         cx_for_n (i, len) CX_TEST_ASSERT(*(int *) cxListAt(list, i) == testdata[i]);
   919     } else {
   920         cx_for_n (i, len) CX_TEST_ASSERT(*(int *) cxListAt(list, i) == testdata[i] - 1);
   921     }
   922     free(testdata);
   923 })
   925 roll_out_test_combos(insert, {
   926     int a = 5;
   927     int b = 47;
   928     int c = 13;
   929     int d = 42;
   930     CX_TEST_ASSERT(cxListInsert(list, 1, &a) != 0);
   931     CX_TEST_ASSERT(cxListSize(list) == 0);
   932     CX_TEST_ASSERT(cxListInsert(list, 0, &a) == 0);
   933     CX_TEST_ASSERT(cxListSize(list) == 1);
   934     CX_TEST_ASSERT(cxListInsert(list, 0, &b) == 0);
   935     CX_TEST_ASSERT(cxListSize(list) == 2);
   936     CX_TEST_ASSERT(cxListInsert(list, 1, &c) == 0);
   937     CX_TEST_ASSERT(cxListSize(list) == 3);
   938     CX_TEST_ASSERT(cxListInsert(list, 3, &d) == 0);
   939     CX_TEST_ASSERT(cxListSize(list) == 4);
   940     CX_TEST_ASSERT(*(int *) cxListAt(list, 0) == 47);
   941     CX_TEST_ASSERT(*(int *) cxListAt(list, 1) == 13);
   942     CX_TEST_ASSERT(*(int *) cxListAt(list, 2) == 5);
   943     CX_TEST_ASSERT(*(int *) cxListAt(list, 3) == 42);
   944 })
   946 roll_out_test_combos(insert_array, {
   947     int a[5] = array_init(5, 47, 11, 13, 42);
   948     int b[5] = array_init(9, 18, 72, 50, 7);
   949     int *aptr[5];
   950     int *bptr[5];
   951     cx_for_n(i, 5) {
   952         aptr[i] = &a[i];
   953         bptr[i] = &b[i];
   954     }
   956     size_t inserted;
   958     if (isptrlist) {
   959         inserted = cxListInsertArray(list, 0, aptr, 5);
   960     } else {
   961         inserted = cxListInsertArray(list, 0, a, 5);
   962     }
   963     CX_TEST_ASSERT(inserted == 5);
   964     CX_TEST_ASSERT(*(int *) cxListAt(list, 0) == 5);
   965     CX_TEST_ASSERT(*(int *) cxListAt(list, 1) == 47);
   966     CX_TEST_ASSERT(*(int *) cxListAt(list, 2) == 11);
   967     CX_TEST_ASSERT(*(int *) cxListAt(list, 3) == 13);
   968     CX_TEST_ASSERT(*(int *) cxListAt(list, 4) == 42);
   969     if (isptrlist) {
   970         inserted = cxListInsertArray(list, 3, bptr, 5);
   971     } else {
   972         inserted = cxListInsertArray(list, 3, b, 5);
   973     }
   974     CX_TEST_ASSERT(inserted == 5);
   975     CX_TEST_ASSERT(*(int *) cxListAt(list, 0) == 5);
   976     CX_TEST_ASSERT(*(int *) cxListAt(list, 1) == 47);
   977     CX_TEST_ASSERT(*(int *) cxListAt(list, 2) == 11);
   978     CX_TEST_ASSERT(*(int *) cxListAt(list, 3) == 9);
   979     CX_TEST_ASSERT(*(int *) cxListAt(list, 4) == 18);
   980     CX_TEST_ASSERT(*(int *) cxListAt(list, 5) == 72);
   981     CX_TEST_ASSERT(*(int *) cxListAt(list, 6) == 50);
   982     CX_TEST_ASSERT(*(int *) cxListAt(list, 7) == 7);
   983     CX_TEST_ASSERT(*(int *) cxListAt(list, 8) == 13);
   984     CX_TEST_ASSERT(*(int *) cxListAt(list, 9) == 42);
   985 })
   987 roll_out_test_combos(remove, {
   988     const size_t testdata_len = 32;
   989     int *testdata = int_test_data_added_to_list(list, isptrlist, testdata_len);
   991     CX_TEST_ASSERT(cxListRemove(list, 2) == 0);
   992     CX_TEST_ASSERT(cxListRemove(list, 4) == 0);
   993     CX_TEST_ASSERT(cxListSize(list) == testdata_len - 2);
   994     CX_TEST_ASSERT(*(int *) cxListAt(list, 0) == testdata[0]);
   995     CX_TEST_ASSERT(*(int *) cxListAt(list, 1) == testdata[1]);
   996     CX_TEST_ASSERT(*(int *) cxListAt(list, 2) == testdata[3]);
   997     CX_TEST_ASSERT(*(int *) cxListAt(list, 3) == testdata[4]);
   998     CX_TEST_ASSERT(*(int *) cxListAt(list, 4) == testdata[6]);
   999     CX_TEST_ASSERT(cxListRemove(list, 0) == 0);
  1000     CX_TEST_ASSERT(cxListSize(list) == testdata_len - 3);
  1001     CX_TEST_ASSERT(*(int *) cxListAt(list, 0) == testdata[1]);
  1002     CX_TEST_ASSERT(*(int *) cxListAt(list, 1) == testdata[3]);
  1003     CX_TEST_ASSERT(cxListRemove(list, testdata_len) != 0);
  1004     free(testdata);
  1005 })
  1007 roll_out_test_combos(find_remove, {
  1008     const size_t testdata_len = 250;
  1009     int *testdata = int_test_data_added_to_list(list, isptrlist, testdata_len);
  1011     int exp = rand() % testdata_len; // NOLINT(cert-msc50-cpp)
  1012     int val = testdata[exp];
  1013     // randomly picked number could occur earlier in list - find first position
  1014     for (int i = 0 ; i < exp ; i++) {
  1015         if (testdata[i] == val) {
  1016             exp = i;
  1017             break;
  1020     CX_TEST_ASSERT(cxListSize(list) == testdata_len);
  1021     CX_TEST_ASSERT(cxListFind(list, &val) == exp);
  1022     CX_TEST_ASSERT(cxListFindRemove(list, &val) == exp);
  1023     CX_TEST_ASSERT(cxListSize(list) == testdata_len - 1);
  1024     CX_TEST_ASSERT(cxListFind(list, &val) != exp);
  1026     int notinlist = -1;
  1027     CX_TEST_ASSERT(cxListFindRemove(list, &notinlist) < 0);
  1028     CX_TEST_ASSERT(cxListSize(list) == testdata_len - 1);
  1030     free(testdata);
  1031 })
  1033 roll_out_test_combos(clear, {
  1034     int *testdata = int_test_data_added_to_list(list, isptrlist, 8);
  1035     CX_TEST_ASSERT(cxListSize(list) > 0);
  1036     cxListClear(list);
  1037     CX_TEST_ASSERT(cxListSize(list) == 0);
  1038     free(testdata);
  1039 })
  1041 roll_out_test_combos(at, {
  1042     size_t len = 128;
  1043     int *testdata = int_test_data_added_to_list(list, isptrlist, 128);
  1044     CX_TEST_ASSERT(cxListSize(list) == len);
  1045     cx_for_n (i, len) {
  1046         CX_TEST_ASSERT(*(int *) cxListAt(list, i) == testdata[i]);
  1048     CX_TEST_ASSERT(cxListAt(list, cxListSize(list)) == NULL);
  1049     free(testdata);
  1050 })
  1052 roll_out_test_combos(swap, {
  1053     int original[16] = array_init(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
  1054     int swapped[16] = array_init(8, 4, 14, 3, 1, 5, 9, 12, 0, 6, 11, 10, 7, 15, 2, 13);
  1056     cx_for_n(i, 16) {
  1057         cxListAdd(list, &original[i]);
  1060     CX_TEST_ASSERT(0 == cxListSwap(list, 1, 4));
  1061     CX_TEST_ASSERT(0 == cxListSwap(list, 2, 14));
  1062     CX_TEST_ASSERT(0 == cxListSwap(list, 9, 6));
  1063     CX_TEST_ASSERT(0 == cxListSwap(list, 3, 3));
  1064     CX_TEST_ASSERT(0 == cxListSwap(list, 10, 11));
  1065     CX_TEST_ASSERT(0 == cxListSwap(list, 8, 0));
  1066     CX_TEST_ASSERT(0 == cxListSwap(list, 7, 12));
  1067     CX_TEST_ASSERT(0 == cxListSwap(list, 13, 15));
  1069     CX_TEST_ASSERT(0 != cxListSwap(list, 5, 16));
  1070     CX_TEST_ASSERT(0 != cxListSwap(list, 16, 6));
  1071     CX_TEST_ASSERT(0 != cxListSwap(list, 16, 17));
  1073     CxIterator iter = cxListIterator(list);
  1074     cx_foreach(int*, e, iter) {
  1075         CX_TEST_ASSERT(*e == swapped[iter.index]);
  1077     iter = cxListBackwardsIterator(list);
  1078     cx_foreach(int*, e, iter) {
  1079         CX_TEST_ASSERT(*e == swapped[iter.index]);
  1081 })
  1083 roll_out_test_combos(swap_no_sbo, {
  1084     if (islinkedlist) {
  1085         CX_DISABLE_LINKED_LIST_SWAP_SBO = true;
  1086         CX_TEST_CALL_SUBROUTINE(test_list_verify_swap, list, isptrlist, true);
  1087         CX_DISABLE_LINKED_LIST_SWAP_SBO = false;
  1088     } else {
  1089         // TODO: currently, SBO for swap operation cannot be disabled for array lists
  1090         CX_TEST_ASSERT(true);
  1092 })
  1094 roll_out_test_combos(find, {
  1095     const size_t testdata_len = 500;
  1096     int *testdata = int_test_data_added_to_list(list, isptrlist, testdata_len);
  1098     cx_for_n (attempt, 25) {
  1099         int exp = rand() % testdata_len; // NOLINT(cert-msc50-cpp)
  1100         int val = testdata[exp];
  1101         // randomly picked number could occur earlier in list - find first position
  1102         for (int i = 0 ; i < exp ; i++) {
  1103             if (testdata[i] == val) {
  1104                 exp = i;
  1105                 break;
  1108         CX_TEST_ASSERT(cxListFind(list, &val) == exp);
  1111     int notinlist = -1;
  1112     CX_TEST_ASSERT(cxListFind(list, &notinlist) < 0);
  1114     free(testdata);
  1115 })
  1117 roll_out_test_combos(sort, {
  1118     const size_t testdata_len = 250;
  1119     int *testdata = int_test_data_added_to_list(list, isptrlist, testdata_len);
  1120     int *expected = malloc(testdata_len*sizeof(int));
  1121     memcpy(expected, testdata, testdata_len*sizeof(int));
  1122     qsort(expected, testdata_len, sizeof(int), cx_cmp_int);
  1124     cxListSort(list);
  1125     cx_for_n (i, testdata_len) CX_TEST_ASSERT(*(int *) cxListAt(list, i) == expected[i]);
  1127     free(expected);
  1128     free(testdata);
  1129 })
  1131 roll_out_test_combos(reverse, {
  1132     const size_t testdata_len = 50;
  1133     int *testdata = int_test_data_added_to_list(list, isptrlist, testdata_len);
  1134     cxListReverse(list);
  1135     cx_for_n(i, testdata_len) {
  1136         CX_TEST_ASSERT(*(int *) cxListAt(list, i) == testdata[testdata_len - 1 - i]);
  1138     free(testdata);
  1139 })
  1141 roll_out_test_combos(iterator, {
  1142     const size_t len = 50;
  1143     int *testdata = int_test_data_added_to_list(list, isptrlist, len);
  1145     CxIterator iter = cxListIterator(list);
  1146     size_t i = 0;
  1147     cx_foreach(int*, x, iter) {
  1148         CX_TEST_ASSERT(i == iter.index);
  1149         CX_TEST_ASSERT(*x == testdata[iter.index]);
  1150         i++;
  1152     CX_TEST_ASSERT(i == cxListSize(list));
  1153     iter = cxListBackwardsIterator(list);
  1154     cx_foreach(int*, x, iter) {
  1155         CX_TEST_ASSERT(i - 1 == iter.index);
  1156         CX_TEST_ASSERT(*x == testdata[iter.index]);
  1157         i--;
  1159     CX_TEST_ASSERT(i == 0);
  1160     i = len / 2;
  1161     CxMutIterator mut_iter = cxListMutIteratorAt(list, i);
  1162     size_t j = 0;
  1163     cx_foreach(int*, x, mut_iter) {
  1164         CX_TEST_ASSERT(mut_iter.index == len / 2 + j / 2);
  1165         CX_TEST_ASSERT(*x == testdata[i]);
  1166         if (i % 2 == 1) cxIteratorFlagRemoval(mut_iter);
  1167         i++;
  1168         j++;
  1170     CX_TEST_ASSERT(i == len);
  1171     i = len / 2;
  1172     j = 0;
  1173     mut_iter = cxListMutBackwardsIteratorAt(list, i - 1);
  1174     cx_foreach(int*, x, mut_iter) {
  1175         CX_TEST_ASSERT(mut_iter.index == len / 2 - 1 - j);
  1176         CX_TEST_ASSERT(*x == testdata[i - 1]);
  1177         if (i % 2 == 0) cxIteratorFlagRemoval(mut_iter);
  1178         i--;
  1179         j++;
  1181     CX_TEST_ASSERT(i == 0);
  1182     CX_TEST_ASSERT(cxListSize(list) == len / 2);
  1183     cx_for_n(k, len / 2) CX_TEST_ASSERT(*(int *) cxListAt(list, k) == testdata[k * 2]);
  1185     free(testdata);
  1186 })
  1188 roll_out_test_combos(insert_with_iterator, {
  1189     int fivenums[] = array_init(0, 1, 2, 3, 4);
  1190     cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
  1191     int newdata[] = array_init(10, 20, 30, 40, 50);
  1193     CxMutIterator iter = cxListMutIteratorAt(list, 2);
  1194     CX_TEST_ASSERT(cxIteratorValid(iter));
  1195     CX_TEST_ASSERT(iter.index == 2);
  1196     CX_TEST_ASSERT(*(int *) cxIteratorCurrent(iter) == 2);
  1197     cxListInsertAfter(&iter, &newdata[0]);
  1198     CX_TEST_ASSERT(cxIteratorValid(iter));
  1199     CX_TEST_ASSERT(iter.index == 2);
  1200     CX_TEST_ASSERT(*(int *) cxIteratorCurrent(iter) == 2);
  1201     cxListInsertBefore(&iter, &newdata[1]);
  1202     CX_TEST_ASSERT(cxIteratorValid(iter));
  1203     CX_TEST_ASSERT(iter.index == 3);
  1204     CX_TEST_ASSERT(*(int *) cxIteratorCurrent(iter) == 2);
  1206     iter = cxListMutIterator(list);
  1207     cxListInsertBefore(&iter, &newdata[2]);
  1208     CX_TEST_ASSERT(cxIteratorValid(iter));
  1209     CX_TEST_ASSERT(iter.index == 1);
  1210     CX_TEST_ASSERT(*(int *) cxIteratorCurrent(iter) == 0);
  1211     iter = cxListMutIteratorAt(list, cxListSize(list));
  1212     cxListInsertBefore(&iter, &newdata[3]);
  1213     CX_TEST_ASSERT(!cxIteratorValid(iter));
  1214     CX_TEST_ASSERT(iter.index == 9);
  1215     iter = cxListMutIteratorAt(list, cxListSize(list));
  1216     cxListInsertAfter(&iter, &newdata[4]);
  1217     CX_TEST_ASSERT(!cxIteratorValid(iter));
  1218     CX_TEST_ASSERT(iter.index == 10);
  1220     int expdata[] = array_init(30, 0, 1, 20, 2, 10, 3, 4, 40, 50);
  1221     cx_for_n (j, 10) CX_TEST_ASSERT(*(int *) cxListAt(list, j) == expdata[j]);
  1222 })
  1224 static CX_TEST_SUBROUTINE(test_list_verify_compare, CxList *left, CxList *right) {
  1225     CX_TEST_ASSERTM(cxListCompare(left, right) == 0, "lists don't start identical");
  1226     int x = 42;
  1227     cxListAdd(left, &x);
  1228     CX_TEST_ASSERT(cxListSize(left) > cxListSize(right));
  1229     CX_TEST_ASSERT(cxListCompare(left, right) > 0);
  1230     CX_TEST_ASSERT(cxListCompare(right, left) < 0);
  1231     cxListAdd(right, &x);
  1232     CX_TEST_ASSERT(cxListSize(left) == cxListSize(right));
  1233     CX_TEST_ASSERT(cxListCompare(left, right) == 0);
  1234     int a = 5, b = 10;
  1235     cxListInsert(left, 15, &a);
  1236     cxListInsert(right, 15, &b);
  1237     CX_TEST_ASSERT(cxListSize(left) == cxListSize(right));
  1238     CX_TEST_ASSERT(cxListCompare(left, right) < 0);
  1239     CX_TEST_ASSERT(cxListCompare(right, left) > 0);
  1240     *(int *) cxListAt(left, 15) = 10;
  1241     CX_TEST_ASSERT(cxListCompare(left, right) == 0);
  1244 #define roll_out_compare_tests(suffix, otherctr) \
  1245 roll_out_test_combos(compare_##suffix, { \
  1246     const size_t len = 47; \
  1247     int *testdata = int_test_data_added_to_list(list, isptrlist, len); \
  1248     CxList *other = otherctr; \
  1249     cx_for_n(i, len) cxListAdd(other, &testdata[i]); \
  1250     CX_TEST_CALL_SUBROUTINE(test_list_verify_compare, list, other); \
  1251     cxListDestroy(other); \
  1252     free(testdata); \
  1253 })
  1255 roll_out_compare_tests(
  1256         ll, cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int))
  1259 roll_out_compare_tests(
  1260         pll, cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS)
  1263 roll_out_compare_tests(
  1264         arl, cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int), 50)
  1267 roll_out_compare_tests(
  1268         parl, cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 50)
  1271 static unsigned destr_test_ctr;
  1272 static int destr_last_value;
  1274 static void simple_destr_test_fun(void *data) {
  1275     int *ptr = data;
  1276     destr_last_value = *ptr;
  1277     *ptr = destr_last_value + 1;
  1278     destr_test_ctr++;
  1281 static void advanced_destr_test_fun(__attribute__((__unused__)) void *u, void *data) {
  1282     simple_destr_test_fun(data);
  1285 static CX_TEST_SUBROUTINE(test_list_verify_destructor, CxList *list,
  1286                           int const *testdata, size_t testdata_len) {
  1287     destr_test_ctr = 0;
  1289     int off = cxListIsStoringPointers(list) ? 1 : 0;
  1291     cxListRemove(list, 15);
  1292     CX_TEST_ASSERT(1 == destr_test_ctr);
  1293     CX_TEST_ASSERT(testdata[15] == destr_last_value + off);
  1294     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1295     cxListRemove(list, 47);
  1296     CX_TEST_ASSERT(2 == destr_test_ctr);
  1297     CX_TEST_ASSERT(testdata[48] == destr_last_value + off);
  1298     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1300     CxMutIterator iter = cxListMutIteratorAt(list, 7);
  1301     cxIteratorNext(iter);
  1302     CX_TEST_ASSERT(2 == destr_test_ctr);
  1303     CX_TEST_ASSERT(testdata[48] == destr_last_value + off);
  1304     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1305     cxIteratorFlagRemoval(iter);
  1306     cxIteratorNext(iter);
  1307     CX_TEST_ASSERT(3 == destr_test_ctr);
  1308     CX_TEST_ASSERT(testdata[8] == destr_last_value + off);
  1309     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1311     iter = cxListMutBackwardsIteratorAt(list, 5);
  1312     cxIteratorNext(iter);
  1313     CX_TEST_ASSERT(3 == destr_test_ctr);
  1314     CX_TEST_ASSERT(testdata[8] == destr_last_value + off);
  1315     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1316     cxIteratorFlagRemoval(iter);
  1317     cxIteratorNext(iter);
  1318     CX_TEST_ASSERT(4 == destr_test_ctr);
  1319     CX_TEST_ASSERT(testdata[4] == destr_last_value + off);
  1320     CX_TEST_ASSERT(testdata_len - destr_test_ctr == cxListSize(list));
  1322     cxListClear(list);
  1323     CX_TEST_ASSERT(testdata_len == destr_test_ctr);
  1324     CX_TEST_ASSERT(testdata[testdata_len - 1] == destr_last_value + off);
  1327 roll_out_test_combos(simple_destr, {
  1328     const size_t len = 60;
  1329     int *testdata = int_test_data_added_to_list(list, isptrlist, len);
  1330     list->simple_destructor = simple_destr_test_fun;
  1331     CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len);
  1332     free(testdata);
  1333 })
  1335 roll_out_test_combos(advanced_destr, {
  1336     const size_t len = 75;
  1337     int *testdata = int_test_data_added_to_list(list, isptrlist, len);
  1338     list->advanced_destructor = advanced_destr_test_fun;
  1339     CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len);
  1340     free(testdata);
  1341 })
  1343 CxTestSuite *cx_test_suite_array_list(void) {
  1344     CxTestSuite *suite = cx_test_suite_new("array_list");
  1346     cx_test_register(suite, test_list_arl_create);
  1347     cx_test_register(suite, test_list_arl_create_simple);
  1348     cx_test_register(suite, test_list_arl_create_simple_for_pointers);
  1349     cx_test_register(suite, test_list_parl_destroy_no_destr);
  1350     cx_test_register(suite, test_list_parl_destroy_simple_destr);
  1351     cx_test_register(suite, test_list_parl_destroy_adv_destr);
  1353     cx_test_register(suite, test_list_arl_add);
  1354     cx_test_register(suite, test_list_parl_add);
  1355     cx_test_register(suite, test_list_arl_insert);
  1356     cx_test_register(suite, test_list_parl_insert);
  1357     cx_test_register(suite, test_list_arl_insert_array);
  1358     cx_test_register(suite, test_list_parl_insert_array);
  1359     cx_test_register(suite, test_list_arl_remove);
  1360     cx_test_register(suite, test_list_parl_remove);
  1361     cx_test_register(suite, test_list_arl_find_remove);
  1362     cx_test_register(suite, test_list_parl_find_remove);
  1363     cx_test_register(suite, test_list_arl_clear);
  1364     cx_test_register(suite, test_list_parl_clear);
  1365     cx_test_register(suite, test_list_arl_at);
  1366     cx_test_register(suite, test_list_parl_at);
  1367     cx_test_register(suite, test_list_arl_swap);
  1368     cx_test_register(suite, test_list_parl_swap);
  1369     cx_test_register(suite, test_list_arl_swap_no_sbo);
  1370     cx_test_register(suite, test_list_parl_swap_no_sbo);
  1371     cx_test_register(suite, test_list_arl_find);
  1372     cx_test_register(suite, test_list_parl_find);
  1373     cx_test_register(suite, test_list_arl_sort);
  1374     cx_test_register(suite, test_list_parl_sort);
  1375     cx_test_register(suite, test_list_arl_reverse);
  1376     cx_test_register(suite, test_list_parl_reverse);
  1377     cx_test_register(suite, test_list_arl_iterator);
  1378     cx_test_register(suite, test_list_parl_iterator);
  1379     cx_test_register(suite, test_list_arl_insert_with_iterator);
  1380     cx_test_register(suite, test_list_parl_insert_with_iterator);
  1381     cx_test_register(suite, test_list_arl_compare_ll);
  1382     cx_test_register(suite, test_list_arl_compare_arl);
  1383     cx_test_register(suite, test_list_arl_compare_pll);
  1384     cx_test_register(suite, test_list_arl_compare_parl);
  1385     cx_test_register(suite, test_list_parl_compare_ll);
  1386     cx_test_register(suite, test_list_parl_compare_arl);
  1387     cx_test_register(suite, test_list_parl_compare_pll);
  1388     cx_test_register(suite, test_list_parl_compare_parl);
  1389     cx_test_register(suite, test_list_arl_simple_destr);
  1390     cx_test_register(suite, test_list_parl_simple_destr);
  1391     cx_test_register(suite, test_list_arl_advanced_destr);
  1392     cx_test_register(suite, test_list_parl_advanced_destr);
  1394     return suite;
  1397 CxTestSuite *cx_test_suite_linked_list(void) {
  1398     CxTestSuite *suite = cx_test_suite_new("linked_list");
  1400     cx_test_register(suite, test_linked_list_link_unlink);
  1401     cx_test_register(suite, test_linked_list_at);
  1402     cx_test_register(suite, test_linked_list_find);
  1403     cx_test_register(suite, test_linked_list_compare);
  1404     cx_test_register(suite, test_linked_list_add);
  1405     cx_test_register(suite, test_linked_list_prepend);
  1406     cx_test_register(suite, test_linked_list_insert);
  1407     cx_test_register(suite, test_linked_list_insert_chain);
  1408     cx_test_register(suite, test_linked_list_first);
  1409     cx_test_register(suite, test_linked_list_last);
  1410     cx_test_register(suite, test_linked_list_prev);
  1411     cx_test_register(suite, test_linked_list_remove);
  1412     cx_test_register(suite, test_linked_list_size);
  1413     cx_test_register(suite, test_linked_list_sort_empty);
  1414     cx_test_register(suite, test_linked_list_sort);
  1415     cx_test_register(suite, test_linked_list_reverse);
  1417     cx_test_register(suite, test_list_ll_create);
  1418     cx_test_register(suite, test_list_ll_create_simple);
  1419     cx_test_register(suite, test_list_ll_store_pointers);
  1420     cx_test_register(suite, test_list_ll_create_simple_for_pointers);
  1421     cx_test_register(suite, test_list_pll_destroy_no_destr);
  1422     cx_test_register(suite, test_list_pll_destroy_simple_destr);
  1423     cx_test_register(suite, test_list_pll_destroy_adv_destr);
  1425     cx_test_register(suite, test_list_ll_add);
  1426     cx_test_register(suite, test_list_pll_add);
  1427     cx_test_register(suite, test_list_ll_insert);
  1428     cx_test_register(suite, test_list_pll_insert);
  1429     cx_test_register(suite, test_list_ll_insert_array);
  1430     cx_test_register(suite, test_list_pll_insert_array);
  1431     cx_test_register(suite, test_list_ll_remove);
  1432     cx_test_register(suite, test_list_pll_remove);
  1433     cx_test_register(suite, test_list_ll_find_remove);
  1434     cx_test_register(suite, test_list_pll_find_remove);
  1435     cx_test_register(suite, test_list_ll_clear);
  1436     cx_test_register(suite, test_list_pll_clear);
  1437     cx_test_register(suite, test_list_ll_at);
  1438     cx_test_register(suite, test_list_pll_at);
  1439     cx_test_register(suite, test_list_ll_swap);
  1440     cx_test_register(suite, test_list_pll_swap);
  1441     cx_test_register(suite, test_list_ll_swap_no_sbo);
  1442     cx_test_register(suite, test_list_pll_swap_no_sbo);
  1443     cx_test_register(suite, test_list_ll_find);
  1444     cx_test_register(suite, test_list_pll_find);
  1445     cx_test_register(suite, test_list_ll_sort);
  1446     cx_test_register(suite, test_list_pll_sort);
  1447     cx_test_register(suite, test_list_ll_reverse);
  1448     cx_test_register(suite, test_list_pll_reverse);
  1449     cx_test_register(suite, test_list_ll_iterator);
  1450     cx_test_register(suite, test_list_pll_iterator);
  1451     cx_test_register(suite, test_list_ll_insert_with_iterator);
  1452     cx_test_register(suite, test_list_pll_insert_with_iterator);
  1453     cx_test_register(suite, test_list_ll_compare_ll);
  1454     cx_test_register(suite, test_list_ll_compare_arl);
  1455     cx_test_register(suite, test_list_ll_compare_pll);
  1456     cx_test_register(suite, test_list_ll_compare_parl);
  1457     cx_test_register(suite, test_list_pll_compare_ll);
  1458     cx_test_register(suite, test_list_pll_compare_arl);
  1459     cx_test_register(suite, test_list_pll_compare_pll);
  1460     cx_test_register(suite, test_list_pll_compare_parl);
  1461     cx_test_register(suite, test_list_ll_simple_destr);
  1462     cx_test_register(suite, test_list_pll_simple_destr);
  1463     cx_test_register(suite, test_list_ll_advanced_destr);
  1464     cx_test_register(suite, test_list_pll_advanced_destr);
  1466     return suite;
  1469 CxTestSuite *cx_test_suite_empty_list(void) {
  1470     CxTestSuite *suite = cx_test_suite_new("empty list dummy");
  1472     cx_test_register(suite, test_empty_list_size);
  1473     cx_test_register(suite, test_empty_list_iterator);
  1474     cx_test_register(suite, test_empty_list_noops);
  1475     cx_test_register(suite, test_empty_list_at);
  1476     cx_test_register(suite, test_empty_list_find);
  1477     cx_test_register(suite, test_empty_list_compare);
  1479     return suite;

mercurial