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