redream/test/test_list.c

117 lines
2.7 KiB
C

#include "core/list.h"
#include "retest.h"
struct person {
const char *name;
struct list_node it;
};
static struct person aaa = {"aaa", {0}};
static struct person bbb = {"bbb", {0}};
static struct person ccc = {"ccc", {0}};
static void init_people(struct list *people) {
list_add(people, &aaa.it);
list_add(people, &bbb.it);
list_add(people, &ccc.it);
}
static void validate_people(struct list *people, struct person **expected,
int num_expected) {
/* validate iterating forward */
{
int n = 0;
list_for_each_entry(person, people, struct person, it) {
struct person *expected_person = expected[n];
CHECK_STREQ(person->name, expected_person->name);
n++;
}
CHECK_EQ(n, num_expected);
}
/* validate iterating in reverse */
{
int n = 0;
list_for_each_entry_reverse(person, people, struct person, it) {
struct person *expected_person = expected[num_expected - n - 1];
CHECK_STREQ(person->name, expected_person->name);
n++;
}
CHECK_EQ(n, num_expected);
}
}
/* add tests */
TEST(intrusive_list_append) {
struct list people = {0};
list_add(&people, &aaa.it);
list_add(&people, &bbb.it);
list_add(&people, &ccc.it);
struct person *expected[] = {&aaa, &bbb, &ccc};
int num_expected = ARRAY_SIZE(expected);
validate_people(&people, expected, num_expected);
}
TEST(intrusive_list_prepend) {
struct list people = {0};
list_add_after(&people, NULL, &aaa.it);
list_add_after(&people, NULL, &bbb.it);
list_add_after(&people, NULL, &ccc.it);
struct person *expected[] = {&ccc, &bbb, &aaa};
int num_expected = ARRAY_SIZE(expected);
validate_people(&people, expected, num_expected);
}
/* remove tests */
TEST(intrusive_list_remove_head) {
struct list people = {0};
init_people(&people);
list_remove(&people, &aaa.it);
struct person *expected[] = {&bbb, &ccc};
int num_expected = ARRAY_SIZE(expected);
validate_people(&people, expected, num_expected);
}
TEST(intrusive_list_remove_middle) {
struct list people = {0};
init_people(&people);
list_remove(&people, &bbb.it);
struct person *expected[] = {&aaa, &ccc};
int num_expected = ARRAY_SIZE(expected);
validate_people(&people, expected, num_expected);
}
TEST(intrusive_list_remove_tail) {
struct list people = {0};
init_people(&people);
list_remove(&people, &ccc.it);
struct person *expected[] = {&aaa, &bbb};
int num_expected = ARRAY_SIZE(expected);
validate_people(&people, expected, num_expected);
}
TEST(intrusive_list_remove_clear) {
struct list people = {0};
init_people(&people);
CHECK(!list_empty(&people));
list_for_each(&people, it) {
list_remove(&people, it);
}
CHECK(list_empty(&people));
}