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