ccan: make tal_dump() format more regular.
[ccan] / ccan / deque / test / run2.c
1 #include <stdlib.h>
2 #include <ccan/tap/tap.h>
3 #include <ccan/deque/deque.h>
4 /* Include the C files directly. */
5
6 size_t malloc_sz;
7 #define malloc(x) malloc(malloc_sz = x)
8 #include <ccan/deque/deque.c>
9
10 int main(void)
11 {
12         struct quad { int w, x, y, z; } p, q, r, s, *save;
13         assert(sizeof(struct quad) == sizeof(int) * 4);
14
15         plan_tests(20);
16
17         typedef DEQ_WRAP(struct quad) qd_t;
18         qd_t a_, *a = &a_;
19
20         ok1(deq_init(a, 4, DEQ_SHRINK_AT_20PCT) == 0);
21         ok1(malloc_sz == sizeof(struct quad) * 4);
22
23         ok1(a->v && a->deq.head == 0 && a->deq.tail == 0 && a->deq.len == 0 && a->deq.cap == 4 &&
24             a->deq.min == 4 && a->deq.esz == sizeof(struct quad) && a->deq.shrink == DEQ_SHRINK_AT_20PCT);
25         save = a->v;
26         memset(a->v, 0xFF, a->deq.cap * sizeof(struct quad));
27
28         int chk[12] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 };
29         p = (struct quad) { 1, 1, 1, 1 };
30         ok1(deq_push(a, p) == 1);
31         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 1 && a->deq.len == 1 && a->deq.cap == 4);
32         ok1(memcmp(a->v, chk, sizeof(int) * 4) == 0 && memcmp(a->v, chk, sizeof(chk)) != 0);
33         q = (struct quad) { 2, 2, 2, 2 };
34         ok1(deq_push(a, q) == 1);
35         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 2 && a->deq.len == 2 && a->deq.cap == 4);
36         ok1(memcmp(a->v, chk, sizeof(int) * 8) == 0 && memcmp(a->v, chk, sizeof(chk)) != 0);
37         r = (struct quad) { 3, 3, 3, 3 };
38         ok1(deq_push(a, r) == 1);
39         ok1(a->v == save && a->deq.head == 0 && a->deq.tail == 3 && a->deq.len == 3 && a->deq.cap == 4);
40         ok1(memcmp(a->v, chk, sizeof(int) * 12) == 0);
41
42         ok1(deq_shift(a, &s) == 1 && s.w == 1 && s.x == 1 && s.y == 1 && s.z == 1);
43         ok1(deq_shift(a, &s) == 1 && s.w == 2 && s.x == 2 && s.y == 2 && s.z == 2);
44         ok1(deq_shift(a, &s) == 1 && s.w == 3 && s.x == 3 && s.y == 3 && s.z == 3);
45         ok1(a->v == save && a->deq.head == 3 && a->deq.tail == 3 && a->deq.len == 0 && a->deq.cap == 4);
46         deq_push(a, p);
47         deq_push(a, q);
48         deq_push(a, r);
49         deq_push(a, p);
50         ok1(a->v == save && a->deq.head == 3 && a->deq.tail == 3 && a->deq.len == 4 && a->deq.cap == 4);
51
52         deq_push(a, q);
53         ok1(a->v != save && a->deq.head == 0 && a->deq.tail == 5 && a->deq.len == 5 && a->deq.cap == 8);
54         ok1(malloc_sz == sizeof(struct quad) * 8);
55         save = a->v;
56         deq_unshift(a, r);
57         ok1(a->v == save && a->deq.head == 7 && a->deq.tail == 5 && a->deq.len == 6 && a->deq.cap == 8);
58
59         deq_reset(a);
60
61         return exit_status();
62 }