test/test_list.c

changeset 473
1bd4b8c28722
parent 469
0458bff0b1cd
child 474
9c1fccda16bc
     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  

mercurial