1 /* A non-exhaustive test for some of the functions and macros declared in
11 /* Sample list element. */
17 /* Puts the 'n' values in 'values' into 'elements', and then puts those
18 * elements in order into 'list'. */
20 make_list(struct list *list, struct element elements[],
21 int values[], size_t n)
26 for (i = 0; i < n; i++) {
27 elements[i].value = i;
28 list_push_back(list, &elements[i].node);
33 /* Verifies that 'list' contains exactly the 'n' values in 'values', in the
36 check_list(struct list *list, const int values[], size_t n)
42 LIST_FOR_EACH (e, struct element, node, list) {
44 assert(e->value == values[i]);
47 assert(&e->node == list);
51 LIST_FOR_EACH_REVERSE (e, struct element, node, list) {
53 assert(e->value == values[n - i - 1]);
56 assert(&e->node == list);
59 assert(list_is_empty(list) == !n);
60 assert(list_size(list) == n);
64 /* Prints the values in 'list', plus 'name' as a title. */
66 print_list(const char *name, struct list *list)
71 LIST_FOR_EACH (e, struct element, node, list) {
72 printf(" %d", e->value);
78 /* Tests basic list construction. */
80 test_list_construction(void)
82 enum { MAX_ELEMS = 100 };
85 for (n = 0; n <= MAX_ELEMS; n++) {
86 struct element elements[MAX_ELEMS];
87 int values[MAX_ELEMS];
90 make_list(&list, elements, values, n);
91 check_list(&list, values, n);
95 /* Tests that LIST_FOR_EACH_SAFE properly allows for deletion of the current
96 * element of a list. */
98 test_list_for_each_safe(void)
100 enum { MAX_ELEMS = 10 };
102 unsigned long int pattern;
104 for (n = 0; n <= MAX_ELEMS; n++) {
105 for (pattern = 0; pattern < 1ul << n; pattern++) {
106 struct element elements[MAX_ELEMS];
107 int values[MAX_ELEMS];
109 struct element *e, *next;
110 size_t values_idx, n_remaining;
113 make_list(&list, elements, values, n);
118 LIST_FOR_EACH_SAFE (e, next, struct element, node, &list) {
120 if (pattern & (1ul << i)) {
121 list_remove(&e->node);
123 memmove(&values[values_idx], &values[values_idx + 1],
124 sizeof *values * (n_remaining - values_idx));
128 check_list(&list, values, n_remaining);
132 assert(&e->node == &list);
134 for (i = 0; i < n; i++) {
135 if (pattern & (1ul << i)) {
139 assert(n == n_remaining);
145 run_test(void (*function)(void))
154 run_test(test_list_construction);
155 run_test(test_list_for_each_safe);