1 #include <ccan/list/list.h>
2 #include <ccan/tap/tap.h>
3 #include <ccan/list/list.c>
8 struct ccan_list_head children
;
9 unsigned int num_children
;
14 struct ccan_list_node list
;
17 static CCAN_LIST_HEAD(static_list
);
19 int main(int argc
, char *argv
[])
22 struct child c1
, c2
, c3
, *c
, *n
;
24 struct ccan_list_head list
= CCAN_LIST_HEAD_INIT(list
);
26 struct ccan_list_head opaque_list
= CCAN_LIST_HEAD_INIT(opaque_list
);
29 /* Test CCAN_LIST_HEAD, CCAN_LIST_HEAD_INIT, ccan_list_empty and check_list */
30 ok1(ccan_list_empty(&static_list
));
31 ok1(ccan_list_check(&static_list
, NULL
));
32 ok1(ccan_list_empty(&list
));
33 ok1(ccan_list_check(&list
, NULL
));
35 parent
.num_children
= 0;
36 ccan_list_head_init(&parent
.children
);
37 /* Test ccan_list_head_init */
38 ok1(ccan_list_empty(&parent
.children
));
39 ok1(ccan_list_check(&parent
.children
, NULL
));
42 ccan_list_add(&parent
.children
, &c2
.list
);
43 /* Test ccan_list_add and !ccan_list_empty. */
44 ok1(!ccan_list_empty(&parent
.children
));
45 ok1(c2
.list
.next
== &parent
.children
.n
);
46 ok1(c2
.list
.prev
== &parent
.children
.n
);
47 ok1(parent
.children
.n
.next
== &c2
.list
);
48 ok1(parent
.children
.n
.prev
== &c2
.list
);
49 /* Test ccan_list_check */
50 ok1(ccan_list_check(&parent
.children
, NULL
));
53 ccan_list_add(&parent
.children
, &c1
.list
);
54 /* Test ccan_list_add and !ccan_list_empty. */
55 ok1(!ccan_list_empty(&parent
.children
));
56 ok1(c2
.list
.next
== &parent
.children
.n
);
57 ok1(c2
.list
.prev
== &c1
.list
);
58 ok1(parent
.children
.n
.next
== &c1
.list
);
59 ok1(parent
.children
.n
.prev
== &c2
.list
);
60 ok1(c1
.list
.next
== &c2
.list
);
61 ok1(c1
.list
.prev
== &parent
.children
.n
);
62 /* Test ccan_list_check */
63 ok1(ccan_list_check(&parent
.children
, NULL
));
66 ccan_list_add_tail(&parent
.children
, &c3
.list
);
67 /* Test ccan_list_add_tail and !ccan_list_empty. */
68 ok1(!ccan_list_empty(&parent
.children
));
69 ok1(parent
.children
.n
.next
== &c1
.list
);
70 ok1(parent
.children
.n
.prev
== &c3
.list
);
71 ok1(c1
.list
.next
== &c2
.list
);
72 ok1(c1
.list
.prev
== &parent
.children
.n
);
73 ok1(c2
.list
.next
== &c3
.list
);
74 ok1(c2
.list
.prev
== &c1
.list
);
75 ok1(c3
.list
.next
== &parent
.children
.n
);
76 ok1(c3
.list
.prev
== &c2
.list
);
77 /* Test ccan_list_check */
78 ok1(ccan_list_check(&parent
.children
, NULL
));
80 /* Test ccan_list_check_node */
81 ok1(ccan_list_check_node(&c1
.list
, NULL
));
82 ok1(ccan_list_check_node(&c2
.list
, NULL
));
83 ok1(ccan_list_check_node(&c3
.list
, NULL
));
85 /* Test ccan_list_top */
86 ok1(ccan_list_top(&parent
.children
, struct child
, list
) == &c1
);
88 /* Test ccan_list_tail */
89 ok1(ccan_list_tail(&parent
.children
, struct child
, list
) == &c3
);
91 /* Test ccan_list_for_each. */
93 ccan_list_for_each(&parent
.children
, c
, list
) {
110 /* Test ccan_list_for_each_rev. */
112 ccan_list_for_each_rev(&parent
.children
, c
, list
) {
129 /* Test ccan_list_for_each_safe, ccan_list_del and ccan_list_del_from. */
131 ccan_list_for_each_safe(&parent
.children
, c
, n
, list
) {
135 ccan_list_del(&c
->list
);
139 ccan_list_del_from(&parent
.children
, &c
->list
);
143 ccan_list_del_from(&parent
.children
, &c
->list
);
146 ok1(ccan_list_check(&parent
.children
, NULL
));
151 ok1(ccan_list_empty(&parent
.children
));
153 /* Test ccan_list_for_each_off. */
154 ccan_list_add_tail(&opaque_list
,
155 (struct ccan_list_node
*)create_opaque_blob());
156 ccan_list_add_tail(&opaque_list
,
157 (struct ccan_list_node
*)create_opaque_blob());
158 ccan_list_add_tail(&opaque_list
,
159 (struct ccan_list_node
*)create_opaque_blob());
163 ccan_list_for_each_off(&opaque_list
, q
, 0) {
165 ok1(if_blobs_know_the_secret(q
));
169 /* Test ccan_list_for_each_safe_off, ccan_list_del_off and ccan_list_del_from_off. */
171 ccan_list_for_each_safe_off(&opaque_list
, q
, nq
, 0) {
174 ok1(if_blobs_know_the_secret(q
));
175 ccan_list_del_off(q
, 0);
176 destroy_opaque_blob(q
);
179 ok1(if_blobs_know_the_secret(q
));
180 ccan_list_del_from_off(&opaque_list
, q
, 0);
181 destroy_opaque_blob(q
);
185 ccan_list_del_from_off(&opaque_list
, q
, 0);
186 destroy_opaque_blob(q
);
189 ok1(ccan_list_check(&opaque_list
, NULL
));
194 ok1(ccan_list_empty(&opaque_list
));
196 /* Test ccan_list_top/ccan_list_tail on empty list. */
197 ok1(ccan_list_top(&parent
.children
, struct child
, list
) == NULL
);
198 ok1(ccan_list_tail(&parent
.children
, struct child
, list
) == NULL
);
199 return exit_status();