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