add tests for the new low level functions

Mon, 27 Dec 2021 14:44:08 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 27 Dec 2021 14:44:08 +0100
changeset 482
0d998f19d130
parent 481
eef025d82a34
child 483
929016224c3c

add tests for the new low level functions

test/test_list.c file | annotate | diff | comparison | revisions
     1.1 --- a/test/test_list.c	Thu Dec 23 15:20:50 2021 +0100
     1.2 +++ b/test/test_list.c	Mon Dec 27 14:44:08 2021 +0100
     1.3 @@ -35,6 +35,40 @@
     1.4      return left == right ? 0 : (left < right ? -1 : 1);
     1.5  }
     1.6  
     1.7 +void test_linked_list_link_unlink(void) {
     1.8 +    struct node {
     1.9 +        void *next;
    1.10 +        void *prev;
    1.11 +    };
    1.12 +    const ptrdiff_t loc_prev = offsetof(struct node, prev);
    1.13 +    const ptrdiff_t loc_next = offsetof(struct node, next);
    1.14 +
    1.15 +    struct node a = {NULL, NULL}, b = {NULL, NULL};
    1.16 +
    1.17 +    cx_linked_list_link(&a, &b, loc_prev, loc_next);
    1.18 +    CU_ASSERT_PTR_NULL(a.prev)
    1.19 +    CU_ASSERT_PTR_EQUAL(a.next, &b)
    1.20 +    CU_ASSERT_PTR_EQUAL(b.prev, &a)
    1.21 +    CU_ASSERT_PTR_NULL(b.next)
    1.22 +
    1.23 +    cx_linked_list_unlink(&a, &b, loc_prev, loc_next);
    1.24 +    CU_ASSERT_PTR_NULL(a.prev)
    1.25 +    CU_ASSERT_PTR_NULL(a.next)
    1.26 +    CU_ASSERT_PTR_NULL(b.prev)
    1.27 +    CU_ASSERT_PTR_NULL(b.next)
    1.28 +
    1.29 +    struct node c = {NULL, NULL};
    1.30 +    cx_linked_list_link(&b, &c, loc_prev, loc_next);
    1.31 +    cx_linked_list_link(&a, &b, loc_prev, loc_next);
    1.32 +    cx_linked_list_unlink(&b, &c, loc_prev, loc_next);
    1.33 +    CU_ASSERT_PTR_NULL(a.prev)
    1.34 +    CU_ASSERT_PTR_EQUAL(a.next, &b)
    1.35 +    CU_ASSERT_PTR_EQUAL(b.prev, &a)
    1.36 +    CU_ASSERT_PTR_NULL(b.next)
    1.37 +    CU_ASSERT_PTR_NULL(c.prev)
    1.38 +    CU_ASSERT_PTR_NULL(c.next)
    1.39 +}
    1.40 +
    1.41  void test_linked_list_at(void) {
    1.42      struct node {
    1.43          void *next;
    1.44 @@ -224,6 +258,125 @@
    1.45      CU_ASSERT_PTR_NULL(nodes[0].prev)
    1.46  }
    1.47  
    1.48 +void test_linked_list_insert(void) {
    1.49 +    struct node {
    1.50 +        void *prev;
    1.51 +        void *next;
    1.52 +    };
    1.53 +    ptrdiff_t loc_prev = offsetof(struct node, prev);
    1.54 +    ptrdiff_t loc_next = offsetof(struct node, next);
    1.55 +
    1.56 +    struct node nodes[4];
    1.57 +    void *begin, *end;
    1.58 +
    1.59 +    // insert mid list
    1.60 +    memset(nodes, 0, 4 * sizeof(struct node));
    1.61 +    begin = &nodes[0];
    1.62 +    end = &nodes[2];
    1.63 +
    1.64 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
    1.65 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
    1.66 +
    1.67 +    cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3]);
    1.68 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
    1.69 +    CU_ASSERT_PTR_EQUAL(end, &nodes[2])
    1.70 +    CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[3])
    1.71 +    CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[3])
    1.72 +    CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[1])
    1.73 +    CU_ASSERT_PTR_EQUAL(nodes[3].next, &nodes[2])
    1.74 +
    1.75 +    // insert end
    1.76 +    memset(nodes, 0, 4 * sizeof(struct node));
    1.77 +    begin = &nodes[0];
    1.78 +    end = &nodes[2];
    1.79 +
    1.80 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
    1.81 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
    1.82 +
    1.83 +    cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3]);
    1.84 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
    1.85 +    CU_ASSERT_PTR_EQUAL(end, &nodes[3])
    1.86 +    CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[3])
    1.87 +    CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[2])
    1.88 +    CU_ASSERT_PTR_NULL(nodes[3].next)
    1.89 +
    1.90 +    // insert begin
    1.91 +    memset(nodes, 0, 4 * sizeof(struct node));
    1.92 +    begin = &nodes[0];
    1.93 +    end = &nodes[2];
    1.94 +
    1.95 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
    1.96 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
    1.97 +
    1.98 +    cx_linked_list_insert(&begin, &end, loc_prev, loc_next, NULL, &nodes[3]);
    1.99 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[3])
   1.100 +    CU_ASSERT_PTR_EQUAL(end, &nodes[2])
   1.101 +    CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[3])
   1.102 +    CU_ASSERT_PTR_NULL(nodes[3].prev)
   1.103 +    CU_ASSERT_PTR_EQUAL(nodes[3].next, &nodes[0])
   1.104 +}
   1.105 +
   1.106 +void test_linked_list_insert_chain(void) {
   1.107 +    struct node {
   1.108 +        void *prev;
   1.109 +        void *next;
   1.110 +    };
   1.111 +    ptrdiff_t loc_prev = offsetof(struct node, prev);
   1.112 +    ptrdiff_t loc_next = offsetof(struct node, next);
   1.113 +
   1.114 +    struct node nodes[5];
   1.115 +    void *begin, *end;
   1.116 +
   1.117 +    // insert mid list
   1.118 +    memset(nodes, 0, 5 * sizeof(struct node));
   1.119 +    begin = &nodes[0];
   1.120 +    end = &nodes[2];
   1.121 +
   1.122 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.123 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.124 +    cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.125 +
   1.126 +    cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3], NULL);
   1.127 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
   1.128 +    CU_ASSERT_PTR_EQUAL(end, &nodes[2])
   1.129 +    CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[3])
   1.130 +    CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[4])
   1.131 +    CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[1])
   1.132 +    CU_ASSERT_PTR_EQUAL(nodes[4].next, &nodes[2])
   1.133 +
   1.134 +    // insert end
   1.135 +    memset(nodes, 0, 5 * sizeof(struct node));
   1.136 +    begin = &nodes[0];
   1.137 +    end = &nodes[2];
   1.138 +
   1.139 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.140 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.141 +    cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.142 +
   1.143 +    cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3], NULL);
   1.144 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
   1.145 +    CU_ASSERT_PTR_EQUAL(end, &nodes[4])
   1.146 +    CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[3])
   1.147 +    CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[2])
   1.148 +    CU_ASSERT_PTR_NULL(nodes[4].next)
   1.149 +
   1.150 +    // insert begin
   1.151 +    memset(nodes, 0, 5 * sizeof(struct node));
   1.152 +    begin = &nodes[0];
   1.153 +    end = &nodes[2];
   1.154 +
   1.155 +    cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.156 +    cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.157 +    cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.158 +
   1.159 +    cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, NULL, &nodes[3], NULL);
   1.160 +    CU_ASSERT_PTR_EQUAL(begin, &nodes[3])
   1.161 +    CU_ASSERT_PTR_EQUAL(end, &nodes[2])
   1.162 +    CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[4])
   1.163 +    CU_ASSERT_PTR_NULL(nodes[3].prev)
   1.164 +    CU_ASSERT_PTR_EQUAL(nodes[4].next, &nodes[0])
   1.165 +}
   1.166 +
   1.167  void test_linked_list_first(void) {
   1.168      struct node {
   1.169          int data;
   1.170 @@ -873,9 +1026,12 @@
   1.171  
   1.172      suite = CU_add_suite("low level linked list", NULL, NULL);
   1.173  
   1.174 +    cu_add_test(suite, test_linked_list_link_unlink);
   1.175      cu_add_test(suite, test_linked_list_at);
   1.176      cu_add_test(suite, test_linked_list_prepend);
   1.177      cu_add_test(suite, test_linked_list_add);
   1.178 +    cu_add_test(suite, test_linked_list_insert);
   1.179 +    cu_add_test(suite, test_linked_list_insert_chain);
   1.180      cu_add_test(suite, test_linked_list_first);
   1.181      cu_add_test(suite, test_linked_list_last);
   1.182      cu_add_test(suite, test_linked_list_prev);

mercurial