deque: New module
[ccan] / ccan / deque / test / run3.c
1 #include <ccan/failtest/failtest_override.h>
2 #include <ccan/failtest/failtest.h>
3 #include <ccan/deque/deque.h>
4 /* Include the C files directly. */
5 #include <ccan/deque/deque.c>
6 #include <ccan/tap/tap.h>
7
8 int main(int argc, char *argv[])
9 {
10         failtest_init(argc, argv);
11         plan_tests(18);
12
13         DEQ_WRAP(char) *a;
14         ok1(deq_new(a, 2, DEQ_SHRINK_IF_EMPTY) == 0); // two mallocs
15         ok1(a && deq_push(a, 'a') == 1);
16         ok1(a && deq_push(a, 'b') == 1);
17         ok1(a && deq_push(a, 'c') == 1); // malloc to grow
18
19         char t;
20         ok1(a && deq_pop(a, &t) == 1);
21         ok1(a && deq_pop(a, &t) == 1);
22         ok1(a && deq_pop(a, &t) == 1);   // malloc to shrink
23
24         if (a) deq_free(a);
25
26         DEQ_WRAP(char) *b;
27         ok1(deq_new(b, 5, DEQ_SHRINK_AT_20PCT) == 0); // two mallocs
28         int i;
29         for (i = 0; b && i < 6; i++)
30                 ok1(deq_push(b, i + 'A') == 1); // last iteration mallocs to grow
31         for (; b && i > 2; i--)
32                 ok1(deq_pop(b, &t) == 1);       // last iteration mallocs to shrink
33
34         if (b) deq_free(b);
35
36         failtest_exit(exit_status());
37 }