]> begriffs open source - libderp/blob - test/t_list.c
Handy wrappers for std lib functions
[libderp] / test / t_list.c
1 #include "derp/common.h"
2 #include "derp/list.h"
3
4 #include <assert.h>
5 #include <stdlib.h>
6
7 #define ARRAY_LEN(a) (sizeof(a)/sizeof(*a))
8
9 int cmpint(const void *a, const void *b, void *aux)
10 {
11         (void)aux;
12         return *(int*)a - *(int*)b;
13 }
14
15 int ivals[] = {0,1,2,3,4,5,6,7,8,9};
16
17 int main(void)
18 {
19         list *l = l_new();
20
21         assert(l_length(l) == 0);
22         assert(l_is_empty(l));
23         l_prepend(l, &ivals[0]);
24         assert(l_length(l) == 1);
25         l_prepend(l, &ivals[0]);
26         assert(l_length(l) == 2);
27         assert(!l_is_empty(l));
28         l_remove_first(l);
29         l_remove_first(l);
30         l_remove_first(l); /* redundant */
31         assert(l_is_empty(l));
32         l_append(l, &ivals[0]);
33         assert(l_length(l) == 1);
34         l_remove_first(l);
35         assert(l_is_empty(l));
36
37         size_t i;
38         for (i = 0; i < 3; i++)
39                 l_append(l, ivals+i);
40         l_remove(l, l_first(l)->next);
41         assert(*(int*)l_first(l)->data == 0);
42         assert(*(int*)l_first(l)->next->data == 2);
43
44         assert(*(int*)l_last(l)->data == 2);
45         assert(*(int*)l_last(l)->prev->data == 0);
46
47         l_insert(l, l_first(l)->next, ivals+8);
48         assert(*(int*)l_first(l)->data == 0);
49         assert(*(int*)l_first(l)->next->data == 8);
50         assert(*(int*)l_first(l)->next->next->data == 2);
51         assert(l_length(l) == 3);
52
53         l_insert_after(l, l_first(l), ivals+7);
54         assert(*(int*)l_first(l)->data == 0);
55         assert(*(int*)l_first(l)->next->data == 7);
56         assert(*(int*)l_first(l)->next->next->data == 8);
57         assert(*(int*)l_first(l)->next->next->next->data == 2);
58
59         l_sort(l, cmpint, NULL);
60         assert(*(int*)l_first(l)->data == 0);
61         assert(*(int*)l_first(l)->next->data == 2);
62         assert(*(int*)l_first(l)->next->next->data == 7);
63         assert(*(int*)l_first(l)->next->next->next->data == 8);
64
65         l_insert_after(l, l_first(l)->next, ivals+9);
66         l_sort(l, cmpint, NULL);
67         assert(*(int*)l_first(l)->data == 0);
68         assert(*(int*)l_first(l)->next->data == 2);
69         assert(*(int*)l_first(l)->next->next->data == 7);
70         assert(*(int*)l_first(l)->next->next->next->data == 8);
71         assert(*(int*)l_first(l)->next->next->next->next->data == 9);
72
73         l_insert_after(l, l_first(l), ivals+4);
74         l_insert(l, l_last(l), ivals+4);
75         assert(l_find(l, ivals+4, cmpint, NULL) == l_first(l)->next);
76         assert(l_find_last(l, ivals+4, cmpint, NULL) == l_last(l)->prev);
77
78         int notfound = 100;
79         assert(!l_find(l, &notfound, cmpint, NULL));
80         assert(!l_find_last(l, &notfound, cmpint, NULL));
81
82         l_clear(l);
83
84         for (i = 0; i < ARRAY_LEN(ivals); i++)
85                 l_append(l, ivals+i);
86         assert(l_length(l) == ARRAY_LEN(ivals));
87         assert(*(int*)l_last(l)->data == 9);
88         assert(*(int*)l_remove_last(l) == 9);
89         assert(*(int*)l_remove_last(l) == 8);
90
91         l_clear(l);
92         l_dtor(l, derp_free, NULL);
93         int *life = malloc(sizeof *life);
94         *life = 42;
95         l_append(l, life);
96
97         l_free(l);
98
99         return 0;
100 }