#include #include #include #include static bool list_expect(struct list_head *h, ...) { va_list ap; struct list_node *n = &h->n, *expected; va_start(ap, h); while ((expected = va_arg(ap, struct list_node *)) != NULL) { n = n->next; if (n != expected) return false; } return (n->next == &h->n); } int main(void) { struct list_head h1, h2; struct list_node n[4]; plan_tests(40); list_head_init(&h1); list_head_init(&h2); /* Append an empty list to an empty list. */ list_append_list(&h1, &h2); ok1(list_empty(&h1)); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); /* Prepend an empty list to an empty list. */ list_prepend_list(&h1, &h2); ok1(list_empty(&h1)); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); /* Append an empty list to a non-empty list */ list_add(&h1, &n[0]); list_append_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[0], NULL)); /* Prepend an empty list to a non-empty list */ list_prepend_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[0], NULL)); /* Append a non-empty list to an empty list. */ list_append_list(&h2, &h1); ok1(list_empty(&h1)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h2, &n[0], NULL)); /* Prepend a non-empty list to an empty list. */ list_prepend_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[0], NULL)); /* Prepend a non-empty list to non-empty list. */ list_add(&h2, &n[1]); list_prepend_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[1], &n[0], NULL)); /* Append a non-empty list to non-empty list. */ list_add(&h2, &n[2]); list_append_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[1], &n[0], &n[2], NULL)); /* Prepend a 2-entry list to a 2-entry list. */ list_del_from(&h1, &n[2]); list_add(&h2, &n[2]); list_add_tail(&h2, &n[3]); list_prepend_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[2], &n[3], &n[1], &n[0], NULL)); /* Append a 2-entry list to a 2-entry list. */ list_del_from(&h1, &n[2]); list_del_from(&h1, &n[3]); list_add(&h2, &n[2]); list_add_tail(&h2, &n[3]); list_append_list(&h1, &h2); ok1(list_empty(&h2)); ok1(list_check(&h1, NULL)); ok1(list_check(&h2, NULL)); ok1(list_expect(&h1, &n[1], &n[0], &n[2], &n[3], NULL)); return exit_status(); }