1.1 --- a/test/test_list.c Sat Oct 09 11:12:48 2021 +0200 1.2 +++ b/test/test_list.c Sat Dec 04 17:38:23 2021 +0100 1.3 @@ -88,8 +88,8 @@ 1.4 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]); 1.5 CU_ASSERT_PTR_EQUAL(begin, &nodes[0]) 1.6 CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.7 - CU_ASSERT_PTR_EQUAL(nodes[0].prev, NULL) 1.8 - CU_ASSERT_PTR_EQUAL(nodes[0].next, NULL) 1.9 + CU_ASSERT_PTR_NULL(nodes[0].prev) 1.10 + CU_ASSERT_PTR_NULL(nodes[0].next) 1.11 1.12 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]); 1.13 CU_ASSERT_PTR_EQUAL(begin, &nodes[0]) 1.14 @@ -113,6 +113,23 @@ 1.15 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2]) 1.16 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1]) 1.17 1.18 + // test with end only / prev, next 1.19 + memset(nodes, 0, 4 * sizeof(struct node)); 1.20 + begin = NULL; 1.21 + end = NULL; 1.22 + 1.23 + cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[0]); 1.24 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.25 + cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[1]); 1.26 + CU_ASSERT_PTR_EQUAL(end, &nodes[1]) 1.27 + CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1]) 1.28 + CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0]) 1.29 + 1.30 + cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[2]); 1.31 + CU_ASSERT_PTR_EQUAL(end, &nodes[2]) 1.32 + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2]) 1.33 + CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1]) 1.34 + 1.35 // test with begin, end / next 1.36 memset(nodes, 0, 4 * sizeof(struct node)); 1.37 begin = NULL; 1.38 @@ -127,6 +144,104 @@ 1.39 CU_ASSERT_PTR_NULL(nodes[1].prev) 1.40 } 1.41 1.42 +void test_linked_list_prepend(void) { 1.43 + struct node { 1.44 + void *prev; 1.45 + void *next; 1.46 + }; 1.47 + 1.48 + struct node nodes[4]; 1.49 + 1.50 + // test with begin, end / prev, next 1.51 + memset(nodes, 0, 4 * sizeof(struct node)); 1.52 + void *begin = NULL; 1.53 + void *end = NULL; 1.54 + 1.55 + ptrdiff_t loc_prev = offsetof(struct node, prev); 1.56 + ptrdiff_t loc_next = offsetof(struct node, next); 1.57 + 1.58 + cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[0]); 1.59 + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]) 1.60 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.61 + CU_ASSERT_PTR_NULL(nodes[0].prev) 1.62 + CU_ASSERT_PTR_NULL(nodes[0].next) 1.63 + 1.64 + cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[1]); 1.65 + CU_ASSERT_PTR_EQUAL(begin, &nodes[1]) 1.66 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.67 + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0]) 1.68 + CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1]) 1.69 + 1.70 + // test with begin only / prev, next 1.71 + memset(nodes, 0, 4 * sizeof(struct node)); 1.72 + begin = NULL; 1.73 + end = NULL; 1.74 + 1.75 + cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[0]); 1.76 + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]) 1.77 + cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[1]); 1.78 + CU_ASSERT_PTR_EQUAL(begin, &nodes[1]) 1.79 + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0]) 1.80 + CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1]) 1.81 + 1.82 + cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[2]); 1.83 + CU_ASSERT_PTR_EQUAL(begin, &nodes[2]) 1.84 + CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1]) 1.85 + CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[2]) 1.86 + 1.87 + // test with end only / prev, next 1.88 + memset(nodes, 0, 4 * sizeof(struct node)); 1.89 + begin = NULL; 1.90 + end = NULL; 1.91 + 1.92 + cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[0]); 1.93 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.94 + cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[1]); 1.95 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.96 + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0]) 1.97 + CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1]) 1.98 + 1.99 + cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[2]); 1.100 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.101 + CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1]) 1.102 + CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[2]) 1.103 + 1.104 + // test with begin, end / next 1.105 + memset(nodes, 0, 4 * sizeof(struct node)); 1.106 + begin = NULL; 1.107 + end = NULL; 1.108 + 1.109 + cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[0]); 1.110 + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]) 1.111 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.112 + cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[1]); 1.113 + cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[2]); 1.114 + CU_ASSERT_PTR_EQUAL(begin, &nodes[2]) 1.115 + CU_ASSERT_PTR_EQUAL(end, &nodes[0]) 1.116 + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0]) 1.117 + CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1]) 1.118 + CU_ASSERT_PTR_NULL(nodes[1].prev) 1.119 + CU_ASSERT_PTR_NULL(nodes[0].prev) 1.120 +} 1.121 + 1.122 +void test_linked_list_first(void) { 1.123 + CU_ASSERT_PTR_NULL(cx_linked_list_first(NULL, 0)) 1.124 + 1.125 + struct node { 1.126 + int data; 1.127 + void *prev; 1.128 + }; 1.129 + ptrdiff_t loc = offsetof(struct node, prev); 1.130 + 1.131 + struct node first = {1, NULL}; 1.132 + struct node second = {2, &first}; 1.133 + struct node third = {3, &second}; 1.134 + 1.135 + CU_ASSERT_PTR_EQUAL(cx_linked_list_first(&first, loc), &first) 1.136 + CU_ASSERT_PTR_EQUAL(cx_linked_list_first(&second, loc), &first) 1.137 + CU_ASSERT_PTR_EQUAL(cx_linked_list_first(&third, loc), &first) 1.138 +} 1.139 + 1.140 void test_linked_list_last(void) { 1.141 CU_ASSERT_PTR_NULL(cx_linked_list_last(NULL, 0)) 1.142 1.143 @@ -738,7 +853,9 @@ 1.144 suite = CU_add_suite("low level linked list", NULL, NULL); 1.145 1.146 cu_add_test(suite, test_linked_list_at); 1.147 + cu_add_test(suite, test_linked_list_prepend); 1.148 cu_add_test(suite, test_linked_list_add); 1.149 + cu_add_test(suite, test_linked_list_first); 1.150 cu_add_test(suite, test_linked_list_last); 1.151 cu_add_test(suite, test_linked_list_prev); 1.152 cu_add_test(suite, test_linked_list_remove);