test/test_list.c

changeset 442
310019ddfe4e
parent 438
cd3069757010
child 443
d6d8712e15bc
--- 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();

mercurial