--- a/test/test_list.c Mon Sep 27 18:57:17 2021 +0200 +++ b/test/test_list.c Tue Sep 28 18:03:10 2021 +0200 @@ -100,9 +100,74 @@ CU_ASSERT_PTR_EQUAL(&b, cx_linked_list_at(&d, 3, loc_prev, 1)); } +void test_cx_linked_list_add(void) { + struct node { + void *prev; + void *next; + int value; + }; + + struct node nodes[4]; + + // test with begin, end / prev, next + memset(nodes, 0, 4*sizeof(struct node)); + void *begin = NULL; + void *end = NULL; + + ptrdiff_t loc_prev = offsetof(struct node, prev); + ptrdiff_t loc_next = offsetof(struct node, next); + + int ret; + ret = cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]); + CU_ASSERT_EQUAL(ret, 0); + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]); + CU_ASSERT_PTR_EQUAL(end, &nodes[0]); + CU_ASSERT_PTR_EQUAL(nodes[0].prev, NULL); + CU_ASSERT_PTR_EQUAL(nodes[0].next, NULL); + + ret = cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]); + CU_ASSERT_EQUAL(ret, 0); + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]); + CU_ASSERT_PTR_EQUAL(end, &nodes[1]); + CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1]); + CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0]); + + // test with begin only / prev, next + memset(nodes, 0, 4*sizeof(struct node)); + begin = NULL; + end = NULL; + + ret = cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[0]); + CU_ASSERT_EQUAL(ret, 0); + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]); + ret = cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[1]); + CU_ASSERT_EQUAL(ret, 0); + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]); + CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1]); + CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0]); + + ret = cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[2]); + CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2]); + CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1]); + + // test with begin, end / next + memset(nodes, 0, 4*sizeof(struct node)); + begin = NULL; + end = NULL; + + ret = cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[0]); + CU_ASSERT_EQUAL(ret, 0); + CU_ASSERT_PTR_EQUAL(begin, &nodes[0]); + CU_ASSERT_PTR_EQUAL(end, &nodes[0]); + ret = cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[1]); + CU_ASSERT_PTR_EQUAL(end, &nodes[1]); + CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1]); + CU_ASSERT_PTR_EQUAL(nodes[1].prev, NULL); +} + int main() { CU_pSuite suite = NULL; - + if (CUE_SUCCESS != CU_initialize_registry()) { return CU_get_error(); } @@ -115,7 +180,8 @@ if ( !CU_add_test(suite, "linked list: create and destroy", test_linked_list_create) || - !CU_add_test(suite, "linked list: get node at index", test_linked_list_at) + !CU_add_test(suite, "linked list: get node at index", test_linked_list_at) || + !CU_add_test(suite, "linked list: add", test_cx_linked_list_add) ) { CU_cleanup_registry(); return CU_get_error();