1 #include "osi/include/list.h"
2
3 #include <gtest/gtest.h>
4
5 #include "osi/include/osi.h"
6
7 class ListTest : public ::testing::Test {};
8
TEST_F(ListTest,test_new_free_simple)9 TEST_F(ListTest, test_new_free_simple) {
10 list_t* list = list_new(NULL);
11 ASSERT_TRUE(list != NULL);
12 list_free(list);
13 }
14
TEST_F(ListTest,test_free_null)15 TEST_F(ListTest, test_free_null) {
16 // In this test we just verify that list_free is callable with NULL.
17 list_free(NULL);
18 }
19
TEST_F(ListTest,test_empty_list_is_empty)20 TEST_F(ListTest, test_empty_list_is_empty) {
21 list_t* list = list_new(NULL);
22 EXPECT_TRUE(list_is_empty(list));
23 list_free(list);
24 }
25
TEST_F(ListTest,test_empty_list_has_no_length)26 TEST_F(ListTest, test_empty_list_has_no_length) {
27 list_t* list = list_new(NULL);
28 EXPECT_EQ(list_length(list), 0U);
29 list_free(list);
30 }
31
TEST_F(ListTest,test_simple_list_prepend)32 TEST_F(ListTest, test_simple_list_prepend) {
33 list_t* list = list_new(NULL);
34 EXPECT_TRUE(list_prepend(list, &list));
35 EXPECT_FALSE(list_is_empty(list));
36 EXPECT_EQ(list_length(list), 1U);
37 list_free(list);
38 }
39
TEST_F(ListTest,test_simple_list_append)40 TEST_F(ListTest, test_simple_list_append) {
41 list_t* list = list_new(NULL);
42 EXPECT_TRUE(list_append(list, &list));
43 EXPECT_FALSE(list_is_empty(list));
44 EXPECT_EQ(list_length(list), 1U);
45 list_free(list);
46 }
47
TEST_F(ListTest,test_list_remove_found)48 TEST_F(ListTest, test_list_remove_found) {
49 list_t* list = list_new(NULL);
50 list_append(list, &list);
51 EXPECT_TRUE(list_remove(list, &list));
52 EXPECT_TRUE(list_is_empty(list));
53 EXPECT_EQ(list_length(list), 0U);
54 list_free(list);
55 }
56
TEST_F(ListTest,test_list_remove_not_found)57 TEST_F(ListTest, test_list_remove_not_found) {
58 int x;
59 list_t* list = list_new(NULL);
60 list_append(list, &list);
61 EXPECT_FALSE(list_remove(list, &x));
62 EXPECT_FALSE(list_is_empty(list));
63 EXPECT_EQ(list_length(list), 1U);
64 list_free(list);
65 }
66
TEST_F(ListTest,test_list_front)67 TEST_F(ListTest, test_list_front) {
68 int x[] = {1, 2, 3, 4, 5};
69 list_t* list = list_new(NULL);
70
71 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
72 list_append(list, &x[i]);
73 }
74
75 EXPECT_EQ(list_front(list), &x[0]);
76
77 list_free(list);
78 }
79
TEST_F(ListTest,test_list_back)80 TEST_F(ListTest, test_list_back) {
81 int x[] = {1, 2, 3, 4, 5};
82 list_t* list = list_new(NULL);
83
84 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
85 list_append(list, &x[i]);
86 }
87
88 EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
89
90 list_free(list);
91 }
92
TEST_F(ListTest,test_list_clear)93 TEST_F(ListTest, test_list_clear) {
94 int x[] = {1, 2, 3, 4, 5};
95 list_t* list = list_new(NULL);
96
97 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
98 list_append(list, &x[i]);
99 }
100
101 list_clear(list);
102 EXPECT_TRUE(list_is_empty(list));
103 EXPECT_EQ(list_length(list), 0U);
104
105 list_free(list);
106 }
107
TEST_F(ListTest,test_list_append_multiple)108 TEST_F(ListTest, test_list_append_multiple) {
109 int x[] = {1, 2, 3, 4, 5};
110 list_t* list = list_new(NULL);
111
112 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
113 list_append(list, &x[i]);
114 }
115
116 int i = 0;
117 for (const list_node_t* node = list_begin(list); node != list_end(list);
118 node = list_next(node), ++i) {
119 EXPECT_EQ(list_node(node), &x[i]);
120 }
121
122 list_free(list);
123 }
124
TEST_F(ListTest,test_list_prepend_multiple)125 TEST_F(ListTest, test_list_prepend_multiple) {
126 int x[] = {1, 2, 3, 4, 5};
127 list_t* list = list_new(NULL);
128
129 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
130 list_prepend(list, &x[i]);
131 }
132
133 int i = ARRAY_SIZE(x) - 1;
134 for (const list_node_t* node = list_begin(list); node != list_end(list);
135 node = list_next(node), --i) {
136 EXPECT_EQ(list_node(node), &x[i]);
137 }
138
139 list_free(list);
140 }
141
TEST_F(ListTest,test_list_begin_empty_list)142 TEST_F(ListTest, test_list_begin_empty_list) {
143 list_t* list = list_new(NULL);
144 EXPECT_EQ(list_begin(list), list_end(list));
145 list_free(list);
146 }
147
TEST_F(ListTest,test_list_next)148 TEST_F(ListTest, test_list_next) {
149 list_t* list = list_new(NULL);
150 list_append(list, &list);
151 EXPECT_NE(list_begin(list), list_end(list));
152 EXPECT_EQ(list_next(list_begin(list)), list_end(list));
153 list_free(list);
154 }
155
list_callback_sum(void * data,void * context)156 static bool list_callback_sum(void* data, void* context) {
157 EXPECT_NE(data, nullptr);
158 EXPECT_NE(context, nullptr);
159 int* sum = (int*)context;
160 int* value = (int*)data;
161 *sum += *value;
162 return true;
163 }
164
list_callback_find_int(void * data,void * context)165 static bool list_callback_find_int(void* data, void* context) {
166 EXPECT_NE(data, nullptr);
167 EXPECT_NE(context, nullptr);
168 return *(int*)data != *(int*)context;
169 }
170
TEST_F(ListTest,test_list_foreach_full)171 TEST_F(ListTest, test_list_foreach_full) {
172 list_t* list = list_new(NULL);
173
174 // Fill in test data
175 int x[] = {1, 2, 3, 4, 5};
176 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
177 list_append(list, &x[i]);
178 }
179 EXPECT_EQ(list_length(list), (size_t)5);
180
181 // Test complete iteration
182 int sum = 0;
183 list_node_t* rc = list_foreach(list, list_callback_sum, &sum);
184 EXPECT_EQ(sum, 15);
185 EXPECT_TRUE(rc == NULL);
186
187 list_free(list);
188 }
189
TEST_F(ListTest,test_list_foreach_partial)190 TEST_F(ListTest, test_list_foreach_partial) {
191 list_t* list = list_new(NULL);
192
193 // Fill in test data
194 int x[] = {1, 2, 3, 4, 5};
195 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) {
196 list_append(list, &x[i]);
197 }
198 EXPECT_EQ(list_length(list), (size_t)5);
199
200 // Test partial iteration
201 int find = 4;
202 list_node_t* rc = list_foreach(list, list_callback_find_int, &find);
203 EXPECT_TRUE(rc != NULL);
204 int* rc_val = (int*)list_node(rc);
205 EXPECT_EQ(4, *rc_val);
206
207 find = 1;
208 rc = list_foreach(list, list_callback_find_int, &find);
209 EXPECT_TRUE(rc != NULL);
210 rc_val = (int*)list_node(rc);
211 EXPECT_EQ(1, *rc_val);
212
213 find = 5;
214 rc = list_foreach(list, list_callback_find_int, &find);
215 EXPECT_TRUE(rc != NULL);
216 rc_val = (int*)list_node(rc);
217 EXPECT_EQ(5, *rc_val);
218
219 find = 0;
220 rc = list_foreach(list, list_callback_find_int, &find);
221 EXPECT_TRUE(rc == NULL);
222
223 list_free(list);
224 }
225