struct parent {
const char *name;
- struct tlist_children children;
unsigned int num_children;
+ struct tlist_children children;
};
struct child {
unsigned int i;
struct tlist_children tlist = TLIST_INIT(tlist);
- plan_tests(44);
+ plan_tests(60);
/* Test TLIST_INIT, and tlist_empty */
ok1(tlist_empty(&tlist));
ok1(tlist_check(&tlist, NULL));
tlist_add(&parent.children, &c2, list);
/* Test tlist_add and !tlist_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(c2.list.next == &parent.children.raw.n);
- ok1(c2.list.prev == &parent.children.raw.n);
- ok1(parent.children.raw.n.next == &c2.list);
- ok1(parent.children.raw.n.prev == &c2.list);
+ ok1(c2.list.next == &tcon_unwrap(&parent.children)->n);
+ ok1(c2.list.prev == &tcon_unwrap(&parent.children)->n);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c2.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c2.list);
+ ok1(tlist_next(&parent.children, &c2, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c2, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
tlist_add(&parent.children, &c1, list);
/* Test list_add and !list_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(c2.list.next == &parent.children.raw.n);
+ ok1(c2.list.next == &tcon_unwrap(&parent.children)->n);
ok1(c2.list.prev == &c1.list);
- ok1(parent.children.raw.n.next == &c1.list);
- ok1(parent.children.raw.n.prev == &c2.list);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c1.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c2.list);
ok1(c1.list.next == &c2.list);
- ok1(c1.list.prev == &parent.children.raw.n);
+ ok1(c1.list.prev == &tcon_unwrap(&parent.children)->n);
+ ok1(tlist_next(&parent.children, &c1, list) == &c2);
+ ok1(tlist_next(&parent.children, &c2, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c2, list) == &c1);
+ ok1(tlist_prev(&parent.children, &c1, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
tlist_add_tail(&parent.children, &c3, list);
/* Test list_add_tail and !list_empty. */
ok1(!tlist_empty(&parent.children));
- ok1(parent.children.raw.n.next == &c1.list);
- ok1(parent.children.raw.n.prev == &c3.list);
+ ok1(tcon_unwrap(&parent.children)->n.next == &c1.list);
+ ok1(tcon_unwrap(&parent.children)->n.prev == &c3.list);
ok1(c1.list.next == &c2.list);
- ok1(c1.list.prev == &parent.children.raw.n);
+ ok1(c1.list.prev == &tcon_unwrap(&parent.children)->n);
ok1(c2.list.next == &c3.list);
ok1(c2.list.prev == &c1.list);
- ok1(c3.list.next == &parent.children.raw.n);
+ ok1(c3.list.next == &tcon_unwrap(&parent.children)->n);
ok1(c3.list.prev == &c2.list);
+ ok1(tlist_next(&parent.children, &c1, list) == &c2);
+ ok1(tlist_next(&parent.children, &c2, list) == &c3);
+ ok1(tlist_next(&parent.children, &c3, list) == NULL);
+ ok1(tlist_prev(&parent.children, &c3, list) == &c2);
+ ok1(tlist_prev(&parent.children, &c2, list) == &c1);
+ ok1(tlist_prev(&parent.children, &c1, list) == NULL);
/* Test tlist_check */
ok1(tlist_check(&parent.children, NULL));
/* Test tlist_top */
- ok1(tlist_top(&parent.children, struct child, list) == &c1);
+ ok1(tlist_top(&parent.children, list) == &c1);
/* Test list_tail */
- ok1(tlist_tail(&parent.children, struct child, list) == &c3);
+ ok1(tlist_tail(&parent.children, list) == &c3);
/* Test tlist_for_each. */
i = 0;
}
ok1(i == 3);
+ /* Test tlist_for_each_rev. */
+ i = 0;
+ tlist_for_each_rev(&parent.children, c, list) {
+ switch (i++) {
+ case 0:
+ ok1(c == &c3);
+ break;
+ case 1:
+ ok1(c == &c2);
+ break;
+ case 2:
+ ok1(c == &c1);
+ break;
+ }
+ if (i > 2)
+ break;
+ }
+ ok1(i == 3);
+
/* Test tlist_for_each_safe, tlist_del and tlist_del_from. */
i = 0;
tlist_for_each_safe(&parent.children, c, n, list) {
ok1(tlist_empty(&parent.children));
/* Test list_top/list_tail on empty list. */
- ok1(tlist_top(&parent.children, struct child, list) == NULL);
- ok1(tlist_tail(&parent.children, struct child, list) == NULL);
+ ok1(tlist_top(&parent.children, list) == (struct child *)NULL);
+ ok1(tlist_tail(&parent.children, list) == (struct child *)NULL);
return exit_status();
}