Mon, 27 Dec 2021 14:44:08 +0100
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);