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