1#include <gtest/gtest.h>
2
3extern "C" {
4#include "list.h"
5#include "osi.h"
6}
7
8TEST(ListTest, test_new_simple) {
9  list_t *list = list_new(NULL);
10  ASSERT_TRUE(list != NULL);
11}
12
13TEST(ListTest, test_free_simple) {
14  // In this test we just verify that list_free is callable with a valid list.
15  list_t *list = list_new(NULL);
16  list_free(list);
17}
18
19TEST(ListTest, test_free_null) {
20  // In this test we just verify that list_free is callable with NULL.
21  list_free(NULL);
22}
23
24TEST(ListTest, test_empty_list_is_empty) {
25  list_t *list = list_new(NULL);
26  EXPECT_TRUE(list_is_empty(list));
27  list_free(list);
28}
29
30TEST(ListTest, test_empty_list_has_no_length) {
31  list_t *list = list_new(NULL);
32  EXPECT_EQ(list_length(list), 0U);
33  list_free(list);
34}
35
36TEST(ListTest, test_simple_list_prepend) {
37  list_t *list = list_new(NULL);
38  EXPECT_TRUE(list_prepend(list, &list));
39  EXPECT_FALSE(list_is_empty(list));
40  EXPECT_EQ(list_length(list), 1U);
41  list_free(list);
42}
43
44TEST(ListTest, test_simple_list_append) {
45  list_t *list = list_new(NULL);
46  EXPECT_TRUE(list_append(list, &list));
47  EXPECT_FALSE(list_is_empty(list));
48  EXPECT_EQ(list_length(list), 1U);
49  list_free(list);
50}
51
52TEST(ListTest, test_list_remove_found) {
53  list_t *list = list_new(NULL);
54  list_append(list, &list);
55  EXPECT_TRUE(list_remove(list, &list));
56  EXPECT_TRUE(list_is_empty(list));
57  EXPECT_EQ(list_length(list),  0U);
58  list_free(list);
59}
60
61TEST(ListTest, test_list_remove_not_found) {
62  int x;
63  list_t *list = list_new(NULL);
64  list_append(list, &list);
65  EXPECT_FALSE(list_remove(list, &x));
66  EXPECT_FALSE(list_is_empty(list));
67  EXPECT_EQ(list_length(list), 1U);
68  list_free(list);
69}
70
71TEST(ListTest, test_list_front) {
72  int x[] = { 1, 2, 3, 4, 5 };
73  list_t *list = list_new(NULL);
74
75  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
76    list_append(list, &x[i]);
77
78  EXPECT_EQ(list_front(list), &x[0]);
79
80  list_free(list);
81}
82
83TEST(ListTest, test_list_back) {
84  int x[] = { 1, 2, 3, 4, 5 };
85  list_t *list = list_new(NULL);
86
87  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
88    list_append(list, &x[i]);
89
90  EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
91
92  list_free(list);
93}
94
95TEST(ListTest, test_list_clear) {
96  int x[] = { 1, 2, 3, 4, 5 };
97  list_t *list = list_new(NULL);
98
99  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
100    list_append(list, &x[i]);
101
102  list_clear(list);
103  EXPECT_TRUE(list_is_empty(list));
104  EXPECT_EQ(list_length(list), 0U);
105
106  list_free(list);
107}
108
109TEST(ListTest, test_list_append_multiple) {
110  int x[] = { 1, 2, 3, 4, 5 };
111  list_t *list = list_new(NULL);
112
113  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
114    list_append(list, &x[i]);
115
116  int i = 0;
117  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), ++i)
118    EXPECT_EQ(list_node(node), &x[i]);
119
120  list_free(list);
121}
122
123TEST(ListTest, test_list_prepend_multiple) {
124  int x[] = { 1, 2, 3, 4, 5 };
125  list_t *list = list_new(NULL);
126
127  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
128    list_prepend(list, &x[i]);
129
130  int i = ARRAY_SIZE(x) - 1;
131  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), --i)
132    EXPECT_EQ(list_node(node), &x[i]);
133
134  list_free(list);
135}
136
137TEST(ListTest, test_list_begin_empty_list) {
138  list_t *list = list_new(NULL);
139  EXPECT_EQ(list_begin(list), list_end(list));
140  list_free(list);
141}
142
143TEST(ListTest, test_list_next) {
144  list_t *list = list_new(NULL);
145  list_append(list, &list);
146  EXPECT_NE(list_begin(list), list_end(list));
147  EXPECT_EQ(list_next(list_begin(list)), list_end(list));
148  list_free(list);
149}
150