From 781f81012720e7f9f4c50630f37dfc73e2ad4906 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 3 Apr 2021 18:25:56 +0200 Subject: [PATCH 2/2] *-list tests: Add more tests. * tests/test-array_list.c (check_equals_by_forward_iteration, check_equals_by_backward_iteration): New functions. (main): Invoke them. * tests/test-carray_list.c: Likewise. * tests/test-linked_list.c: Likewise. * tests/test-linkedhash_list.c: Likewise. * tests/test-avltree_list.c: Likewise. * tests/test-avltreehash_list.c: Likewise. * tests/test-rbtree_list.c: Likewise. * tests/test-rbtreehash_list.c: Likewise. --- ChangeLog | 12 ++++++++++++ tests/test-array_list.c | 39 +++++++++++++++++++++++++++++++++++++++ tests/test-avltree_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-avltreehash_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-carray_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-linked_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-linkedhash_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-rbtree_list.c | 33 +++++++++++++++++++++++++++++++++ tests/test-rbtreehash_list.c | 33 +++++++++++++++++++++++++++++++++ 9 files changed, 282 insertions(+) diff --git a/ChangeLog b/ChangeLog index 958ad02..117ea44 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2021-04-03 Bruno Haible + *-list tests: Add more tests. + * tests/test-array_list.c (check_equals_by_forward_iteration, + check_equals_by_backward_iteration): New functions. + (main): Invoke them. + * tests/test-carray_list.c: Likewise. + * tests/test-linked_list.c: Likewise. + * tests/test-linkedhash_list.c: Likewise. + * tests/test-avltree_list.c: Likewise. + * tests/test-avltreehash_list.c: Likewise. + * tests/test-rbtree_list.c: Likewise. + * tests/test-rbtreehash_list.c: Likewise. + list: Add operations first_node, last_node. Reported by Marc Nieper-Wißkirchen in . diff --git a/tests/test-array_list.c b/tests/test-array_list.c index 1c736ee..fa60691 100644 --- a/tests/test-array_list.c +++ b/tests/test-array_list.c @@ -44,6 +44,42 @@ check_equals (gl_list_t list1, gl_list_t list2) } } +static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + size_t n = gl_list_size (list1); + size_t i; + gl_list_node_t node2; + + i = 0; + node2 = gl_list_first_node (list2); + while (i < n && node2 != NULL) + { + ASSERT (gl_list_get_at (list1, i) == gl_list_node_value (list2, node2)); + i++; + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((i == n) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + size_t n = gl_list_size (list1); + size_t i; + gl_list_node_t node2; + + i = n - 1; + node2 = gl_list_last_node (list2); + while (i != (size_t)(-1) && node2 != NULL) + { + ASSERT (gl_list_get_at (list1, i) == gl_list_node_value (list2, node2)); + i--; + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((i == (size_t)(-1)) == (node2 == NULL)); +} + int main (int argc, char *argv[]) { @@ -75,6 +111,9 @@ main (int argc, char *argv[]) check_equals (list1, list2); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-avltree_list.c b/tests/test-avltree_list.c index c4c0f02..b4938c4 100644 --- a/tests/test-avltree_list.c +++ b/tests/test-avltree_list.c @@ -48,6 +48,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { gl_avltree_list_check_invariants (list2); @@ -92,6 +122,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-avltreehash_list.c b/tests/test-avltreehash_list.c index a77ee86..040efd3 100644 --- a/tests/test-avltreehash_list.c +++ b/tests/test-avltreehash_list.c @@ -75,6 +75,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { gl_avltreehash_list_check_invariants (list2); @@ -122,6 +152,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-carray_list.c b/tests/test-carray_list.c index 53ab6f5..4077571 100644 --- a/tests/test-carray_list.c +++ b/tests/test-carray_list.c @@ -46,6 +46,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { check_equals (list1, list2); @@ -88,6 +118,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-linked_list.c b/tests/test-linked_list.c index 4f3ec5d..fff7e06 100644 --- a/tests/test-linked_list.c +++ b/tests/test-linked_list.c @@ -46,6 +46,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { check_equals (list1, list2); @@ -88,6 +118,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-linkedhash_list.c b/tests/test-linkedhash_list.c index b61feda..fc2a8a05 100644 --- a/tests/test-linkedhash_list.c +++ b/tests/test-linkedhash_list.c @@ -73,6 +73,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { check_equals (list1, list2); @@ -118,6 +148,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-rbtree_list.c b/tests/test-rbtree_list.c index 9c403f7..d3ea656 100644 --- a/tests/test-rbtree_list.c +++ b/tests/test-rbtree_list.c @@ -48,6 +48,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { gl_rbtree_list_check_invariants (list2); @@ -92,6 +122,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); diff --git a/tests/test-rbtreehash_list.c b/tests/test-rbtreehash_list.c index 41ef5c4..89fc3eb 100644 --- a/tests/test-rbtreehash_list.c +++ b/tests/test-rbtreehash_list.c @@ -75,6 +75,36 @@ check_equals (gl_list_t list1, gl_list_t list2) } static void +check_equals_by_forward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_first_node (list1); + gl_list_node_t node2 = gl_list_first_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_next_node (list1, node1); + node2 = gl_list_next_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void +check_equals_by_backward_iteration (gl_list_t list1, gl_list_t list2) +{ + gl_list_node_t node1 = gl_list_last_node (list1); + gl_list_node_t node2 = gl_list_last_node (list2); + while (node1 != NULL && node2 != NULL) + { + ASSERT (gl_list_node_value (list1, node1) + == gl_list_node_value (list2, node2)); + node1 = gl_list_previous_node (list1, node1); + node2 = gl_list_previous_node (list2, node2); + } + ASSERT ((node1 == NULL) == (node2 == NULL)); +} + +static void check_all (gl_list_t list1, gl_list_t list2, gl_list_t list3) { gl_rbtreehash_list_check_invariants (list2); @@ -122,6 +152,9 @@ main (int argc, char *argv[]) check_all (list1, list2, list3); + check_equals_by_forward_iteration (list1, list2); + check_equals_by_backward_iteration (list1, list2); + for (repeat = 0; repeat < 10000; repeat++) { unsigned int operation = RANDOM (18); -- 2.7.4