deque: New module
[ccan] / ccan / deque / test / run1.c
1 #include <ccan/deque/deque.h>
2 /* Include the C files directly. */
3 #include <ccan/deque/deque.c>
4 #include <ccan/tap/tap.h>
5
6 int main(void)
7 {
8         char t, *save;
9
10         plan_tests(64);
11
12         DEQ_WRAP(char) *a;
13         ok1(deq_new(a, 4, DEQ_SHRINK_AT_20PCT) == 0);
14         ok1(a->v && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 0 && a->deq.cap == 4 &&
15             a->deq.min == 4 && a->deq.esz == 1 && a->deq.shrink == DEQ_SHRINK_AT_20PCT);
16         save = a->v;
17         memset(a->v, 0, a->deq.cap);
18         ok1(deq_len(a) == 0 && deq_cap(a) == 4);
19
20         ok1(deq_push(a, 'a') == 1);
21         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 1 && a->deq.len == 1 && a->deq.cap == 4);
22         ok1(a->v[0] == 'a');
23         ok1(t = '~' && deq_first(a, &t) == 1 && t == 'a');
24         ok1(t = '~' && deq_last(a, &t)  == 1 && t == 'a');
25         ok1(deq_len(a) == 1 && deq_cap(a) == 4);
26
27         ok1(t = '~' && deq_pop(a, &t) == 1 && t == 'a');
28         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 0 && a->deq.cap == 4);
29
30         ok1(deq_unshift(a, 'a') == 1);
31         ok1(a->v == save && a->deq.head == 3 && a->deq.tail == 0 && a->deq.len == 1 && a->deq.cap == 4);
32         ok1(a->v[3] == 'a');
33         ok1(t = '~' && deq_first(a, &t) == 1 && t == 'a');
34         ok1(t = '~' && deq_last(a, &t)  == 1 && t == 'a');
35
36         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'a');
37         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 0 && a->deq.cap == 4);
38
39         memset(a->v, 0, a->deq.cap);
40         deq_push(a, 'a');
41         deq_push(a, 'b');
42         deq_push(a, 'c');
43         deq_push(a, 'd');
44         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 4 && a->deq.cap == 4);
45         ok1(strncmp("abcd", a->v + a->deq.head, a->deq.len) == 0);
46         ok1(t = '~' && deq_first(a, &t) == 1 && t == 'a');
47         ok1(t = '~' && deq_last(a, &t)  == 1 && t == 'd');
48
49         deq_push(a, 'e');
50         ok1(a->v != save);
51         save = a->v;
52         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 5 && a->deq.len == 5 && a->deq.cap == 8);
53         ok1(strncmp("abcde", a->v + a->deq.head, a->deq.len) == 0);
54         ok1(t = '~' && deq_first(a, &t) == 1 && t == 'a');
55         ok1(t = '~' && deq_last(a, &t)  == 1 && t == 'e');
56         ok1(deq_len(a) == 5 && deq_cap(a) == 8);
57
58
59         deq_push(a, 'f');
60         deq_push(a, 'g');
61         deq_push(a, 'h');
62         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 8 && a->deq.cap == 8);
63         ok1(strncmp("abcdefgh", a->v + a->deq.head, a->deq.len) == 0);
64
65         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'a');
66         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'b');
67         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'c');
68         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'd');
69         ok1(a->v == save && a->deq.head == 4 && a->deq.tail == 0 && a->deq.len == 4 && a->deq.cap == 8);
70         ok1(strncmp("efgh", a->v + a->deq.head, a->deq.len) == 0);
71         ok1(t = '~' && deq_first(a, &t) == 1 && t == 'e');
72         ok1(t = '~' && deq_last(a, &t)  == 1 && t == 'h');
73
74         deq_push(a, 'i');
75         deq_push(a, 'j');
76         deq_push(a, 'k');
77         deq_push(a, 'l');
78         ok1(a->v == save && a->deq.head == 4 && a->deq.tail == 4 && a->deq.len == 8 && a->deq.cap == 8);
79         ok1(strncmp("ijklefgh", a->v, a->deq.len) == 0);
80
81         deq_push(a, 'm');
82         ok1(a->v != save);
83         save = a->v;
84         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 9 && a->deq.len == 9 && a->deq.cap == 16);
85         ok1(strncmp("efghijklm", a->v + a->deq.head, a->deq.len) == 0);
86
87         int i;
88         for (i = 9, t = '!'; i <= 128; i++, t = (t == '~' ? '!' : t + 1))
89                 deq_push(a, t);
90
91         save = a->v;
92         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 129 && a->deq.len == 129 && a->deq.cap == 256);
93         int j;
94         for(j = 0; i > 52; i--, j++)
95                 deq_shift(a, &t);
96         ok1(a->v == save && a->deq.head == j && a->deq.tail == 129 && a->deq.len == 52 && a->deq.cap == 256);
97         deq_shift(a, &t);
98         ok1(a->v != save);
99         save = a->v;
100         ok1(a->v == save && a->deq.head == 1 && a->deq.tail == 52 && a->deq.len == 51 && a->deq.cap == 128);
101         ok1(strncmp("fghijklmnopqrstuvwxyz{|}~!\"#$%&'()*+,-./0123456789:", a->v + a->deq.head, a->deq.len) == 0);
102
103         a->deq.shrink = DEQ_SHRINK_IF_EMPTY;
104         for(i = a->deq.len; i > 1; i--)
105                 deq_shift(a, &t);
106         ok1(a->v == save && a->deq.head == 51 && a->deq.tail == 52 && a->deq.len == 1 && a->deq.cap == 128);
107         deq_shift(a, &t);
108         ok1(a->v != save);
109         save = a->v;
110         ok1(a->v == save && a->deq.head == 1 && a->deq.tail == 1 && a->deq.len == 0 && a->deq.cap == a->deq.min);
111
112         deq_reset(a);
113         ok1(!a->v);
114         ok1(deq_unshift(a, 'a') == 1);
115         save = a->v;
116         memset(a->v, 0, a->deq.cap - 1);
117         ok1(t = '~' && deq_pop(a, &t) == 1 && t == 'a');
118         ok1(a->v == save && a->deq.head == 3 && a->deq.tail == 3 && a->deq.len == 0 && a->deq.cap == 4);
119
120         deq_reset(a);
121         deq_push(a, 'A');
122         save = a->v;
123         deq_unshift(a, 'B');
124         deq_push(a, 'C');
125         deq_unshift(a, 'D');
126         ok1(strncmp("ACDB", a->v, 4) == 0);
127         ok1(a->v == save && a->deq.head == 2 && a->deq.tail == 2 && a->deq.len == 4 && a->deq.cap == 4);
128         ok1(t = '~' && deq_pop(a, &t) == 1 && t == 'C');
129         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'D');
130         ok1(t = '~' && deq_shift(a, &t) == 1 && t == 'B');
131         ok1(t = '~' && deq_pop(a, &t) == 1 && t == 'A');
132
133         ok1(deq_pop(a, &t) == 0);
134         ok1(deq_shift(a, &t) == 0);
135
136         deq_free(a);
137         ok1(!a);
138
139         return exit_status();
140 }