1.1 --- a/test/test_list.c Fri Oct 08 18:58:49 2021 +0200 1.2 +++ b/test/test_list.c Fri Oct 08 19:47:31 2021 +0200 1.3 @@ -128,7 +128,6 @@ 1.4 } 1.5 1.6 void test_linked_list_last(void) { 1.7 - CU_ASSERT_PTR_NULL(cx_linked_list_last(NULL, -1)) 1.8 CU_ASSERT_PTR_NULL(cx_linked_list_last(NULL, 0)) 1.9 1.10 struct node { 1.11 @@ -146,6 +145,97 @@ 1.12 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(&third, loc), &third) 1.13 } 1.14 1.15 +void test_linked_list_prev(void) { 1.16 + struct node { 1.17 + void *next; 1.18 + }; 1.19 + ptrdiff_t loc = offsetof(struct node, next); 1.20 + 1.21 + struct node third = {NULL}; 1.22 + struct node second = {&third}; 1.23 + struct node first = {&second}; 1.24 + 1.25 + CU_ASSERT_PTR_NULL(cx_linked_list_prev(&first, loc, &first)) 1.26 + CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(&first, loc, &second), &first) 1.27 + CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(&first, loc, &third), &second) 1.28 +} 1.29 + 1.30 +void test_linked_list_remove(void) { 1.31 + struct node { 1.32 + void *next; 1.33 + }; 1.34 + struct dnode { 1.35 + void *next; 1.36 + void *prev; 1.37 + }; 1.38 + ptrdiff_t loc = offsetof(struct node, next); 1.39 + ptrdiff_t ploc = offsetof(struct dnode, prev); 1.40 + 1.41 + void *begin; 1.42 + void *end; 1.43 + void *result; 1.44 + 1.45 + // single linked list 1.46 + struct node third = {NULL}; 1.47 + struct node second = {&third}; 1.48 + struct node first = {&second}; 1.49 + begin = &first; 1.50 + 1.51 + result = cx_linked_list_remove(&begin, NULL, -1, loc, &second); 1.52 + CU_ASSERT_PTR_EQUAL(result, &first) 1.53 + CU_ASSERT_PTR_EQUAL(begin, &first) 1.54 + CU_ASSERT_PTR_EQUAL(first.next, &third) 1.55 + CU_ASSERT_PTR_NULL(second.next) 1.56 + CU_ASSERT_PTR_NULL(third.next) 1.57 + 1.58 + result = cx_linked_list_remove(&begin, NULL, -1, loc, &first); 1.59 + CU_ASSERT_PTR_EQUAL(result, &third) 1.60 + CU_ASSERT_PTR_EQUAL(begin, &third) 1.61 + CU_ASSERT_PTR_NULL(first.next) 1.62 + CU_ASSERT_PTR_NULL(third.next) 1.63 + 1.64 + result = cx_linked_list_remove(&begin, NULL, -1, loc, &third); 1.65 + CU_ASSERT_PTR_NULL(result) 1.66 + CU_ASSERT_PTR_NULL(begin) 1.67 + CU_ASSERT_PTR_NULL(third.next) 1.68 + 1.69 + // doubly linked list 1.70 + struct dnode dthird = {NULL , NULL}; 1.71 + struct dnode dsecond = {&dthird, NULL}; 1.72 + struct dnode dfirst = {&dsecond, NULL}; 1.73 + dthird.prev = &dsecond; 1.74 + dsecond.prev = &dfirst; 1.75 + begin = &dfirst; 1.76 + end = &dthird; 1.77 + 1.78 + result = cx_linked_list_remove(&begin, &end, ploc, loc, &dsecond); 1.79 + CU_ASSERT_PTR_EQUAL(result, &dfirst) 1.80 + CU_ASSERT_PTR_EQUAL(begin, &dfirst) 1.81 + CU_ASSERT_PTR_EQUAL(end, &dthird) 1.82 + CU_ASSERT_PTR_NULL(dfirst.prev) 1.83 + CU_ASSERT_PTR_EQUAL(dfirst.next, &dthird) 1.84 + CU_ASSERT_PTR_NULL(dsecond.prev) 1.85 + CU_ASSERT_PTR_NULL(dsecond.next) 1.86 + CU_ASSERT_PTR_EQUAL(dthird.prev, &dfirst) 1.87 + CU_ASSERT_PTR_NULL(dthird.next) 1.88 + 1.89 + result = cx_linked_list_remove(&begin, &end, ploc, loc, &dthird); 1.90 + CU_ASSERT_PTR_EQUAL(result, &dfirst) 1.91 + CU_ASSERT_PTR_EQUAL(begin, &dfirst) 1.92 + CU_ASSERT_PTR_EQUAL(end, &dfirst) 1.93 + CU_ASSERT_PTR_NULL(dfirst.prev) 1.94 + CU_ASSERT_PTR_NULL(dfirst.next) 1.95 + CU_ASSERT_PTR_NULL(dthird.prev) 1.96 + CU_ASSERT_PTR_NULL(dthird.next) 1.97 + 1.98 + result = cx_linked_list_remove(&begin, &end, ploc, loc, &dfirst); 1.99 + CU_ASSERT_PTR_NULL(result) 1.100 + CU_ASSERT_PTR_NULL(begin) 1.101 + CU_ASSERT_PTR_NULL(end) 1.102 + CU_ASSERT_PTR_NULL(dfirst.next) 1.103 + CU_ASSERT_PTR_NULL(dfirst.prev) 1.104 +} 1.105 + 1.106 void test_linked_list_size(void) { 1.107 struct node { 1.108 void *next; 1.109 @@ -209,7 +299,7 @@ 1.110 CU_ASSERT_EQUAL(begin->data, expected[0]) 1.111 struct node *check = begin; 1.112 struct node *check_last = NULL; 1.113 - for (int i = 0 ; i < 100 ; i++) { 1.114 + for (int i = 0; i < 100; i++) { 1.115 CU_ASSERT_EQUAL(check->data, expected[i]) 1.116 CU_ASSERT_PTR_EQUAL(check->prev, check_last) 1.117 if (i < 99) { 1.118 @@ -222,6 +312,51 @@ 1.119 CU_ASSERT_EQUAL(end->data, expected[99]) 1.120 } 1.121 1.122 +void test_linked_list_reverse(void) { 1.123 + struct node { 1.124 + void *next; 1.125 + }; 1.126 + struct dnode { 1.127 + void *next; 1.128 + void *prev; 1.129 + }; 1.130 + ptrdiff_t loc = offsetof(struct node, next); 1.131 + ptrdiff_t ploc = offsetof(struct dnode, prev); 1.132 + 1.133 + void *begin; 1.134 + void *end; 1.135 + 1.136 + // single linked list 1.137 + struct node third = {NULL}; 1.138 + struct node second = {&third}; 1.139 + struct node first = {&second}; 1.140 + begin = &first; 1.141 + 1.142 + cx_linked_list_reverse(&begin, NULL, -1, loc); 1.143 + CU_ASSERT_PTR_EQUAL(begin, &third) 1.144 + CU_ASSERT_PTR_EQUAL(third.next, &second) 1.145 + CU_ASSERT_PTR_EQUAL(second.next, &first) 1.146 + CU_ASSERT_PTR_NULL(first.next) 1.147 + 1.148 + // doubly linked list 1.149 + struct dnode dthird = {NULL , NULL}; 1.150 + struct dnode dsecond = {&dthird, NULL}; 1.151 + struct dnode dfirst = {&dsecond, NULL}; 1.152 + dthird.prev = &dsecond; 1.153 + dsecond.prev = &dfirst; 1.154 + begin = &dfirst; 1.155 + end = &dthird; 1.156 + 1.157 + cx_linked_list_reverse(&begin, &end, ploc, loc); 1.158 + CU_ASSERT_PTR_EQUAL(begin, &dthird) 1.159 + CU_ASSERT_PTR_EQUAL(end, &dfirst) 1.160 + CU_ASSERT_PTR_EQUAL(dthird.next, &dsecond) 1.161 + CU_ASSERT_PTR_EQUAL(dsecond.next, &dfirst) 1.162 + CU_ASSERT_PTR_NULL(dfirst.next) 1.163 + CU_ASSERT_PTR_NULL(dthird.prev) 1.164 + CU_ASSERT_PTR_EQUAL(dsecond.prev, &dthird) 1.165 + CU_ASSERT_PTR_EQUAL(dfirst.prev, &dsecond) 1.166 +} 1.167 1.168 void test_hl_linked_list_create(void) { 1.169 cxTestingAllocatorReset(); 1.170 @@ -415,14 +550,14 @@ 1.171 1.172 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int)); 1.173 1.174 - for (int i = 0 ; i < 100 ; i++) { 1.175 + for (int i = 0; i < 100; i++) { 1.176 cxListAdd(list, &scrambled[i]); 1.177 } 1.178 1.179 cxListSort(list); 1.180 1.181 - for (int i = 0 ; i < 100 ; i++) { 1.182 - CU_ASSERT_EQUAL(*(int*)cxListAt(list, i), expected[i]) 1.183 + for (int i = 0; i < 100; i++) { 1.184 + CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expected[i]) 1.185 } 1.186 1.187 cxLinkedListDestroy(list); 1.188 @@ -616,14 +751,14 @@ 1.189 1.190 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int); 1.191 1.192 - for (int i = 0 ; i < 100 ; i++) { 1.193 + for (int i = 0; i < 100; i++) { 1.194 cxListAdd(list, &scrambled[i]); 1.195 } 1.196 1.197 cxListSort(list); 1.198 1.199 - for (int i = 0 ; i < 100 ; i++) { 1.200 - CU_ASSERT_EQUAL(*(int*)cxListAt(list, i), expected[i]) 1.201 + for (int i = 0; i < 100; i++) { 1.202 + CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expected[i]) 1.203 } 1.204 1.205 cxLinkedListDestroy(list); 1.206 @@ -642,8 +777,11 @@ 1.207 cu_add_test(suite, test_linked_list_at); 1.208 cu_add_test(suite, test_linked_list_add); 1.209 cu_add_test(suite, test_linked_list_last); 1.210 + cu_add_test(suite, test_linked_list_prev); 1.211 + cu_add_test(suite, test_linked_list_remove); 1.212 cu_add_test(suite, test_linked_list_size); 1.213 cu_add_test(suite, test_linked_list_sort); 1.214 + cu_add_test(suite, test_linked_list_reverse); 1.215 1.216 suite = CU_add_suite("high level linked list", NULL, NULL); 1.217