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) list_append(list, &x[i]);
72
73 EXPECT_EQ(list_front(list), &x[0]);
74
75 list_free(list);
76 }
77
TEST_F(ListTest,test_list_back)78 TEST_F(ListTest, test_list_back) {
79 int x[] = {1, 2, 3, 4, 5};
80 list_t* list = list_new(NULL);
81
82 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
83
84 EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
85
86 list_free(list);
87 }
88
TEST_F(ListTest,test_list_clear)89 TEST_F(ListTest, test_list_clear) {
90 int x[] = {1, 2, 3, 4, 5};
91 list_t* list = list_new(NULL);
92
93 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
94
95 list_clear(list);
96 EXPECT_TRUE(list_is_empty(list));
97 EXPECT_EQ(list_length(list), 0U);
98
99 list_free(list);
100 }
101
TEST_F(ListTest,test_list_append_multiple)102 TEST_F(ListTest, test_list_append_multiple) {
103 int x[] = {1, 2, 3, 4, 5};
104 list_t* list = list_new(NULL);
105
106 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
107
108 int i = 0;
109 for (const list_node_t *node = list_begin(list); node != list_end(list);
110 node = list_next(node), ++i)
111 EXPECT_EQ(list_node(node), &x[i]);
112
113 list_free(list);
114 }
115
TEST_F(ListTest,test_list_prepend_multiple)116 TEST_F(ListTest, test_list_prepend_multiple) {
117 int x[] = {1, 2, 3, 4, 5};
118 list_t* list = list_new(NULL);
119
120 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_prepend(list, &x[i]);
121
122 int i = ARRAY_SIZE(x) - 1;
123 for (const list_node_t *node = list_begin(list); node != list_end(list);
124 node = list_next(node), --i)
125 EXPECT_EQ(list_node(node), &x[i]);
126
127 list_free(list);
128 }
129
TEST_F(ListTest,test_list_begin_empty_list)130 TEST_F(ListTest, test_list_begin_empty_list) {
131 list_t* list = list_new(NULL);
132 EXPECT_EQ(list_begin(list), list_end(list));
133 list_free(list);
134 }
135
TEST_F(ListTest,test_list_next)136 TEST_F(ListTest, test_list_next) {
137 list_t* list = list_new(NULL);
138 list_append(list, &list);
139 EXPECT_NE(list_begin(list), list_end(list));
140 EXPECT_EQ(list_next(list_begin(list)), list_end(list));
141 list_free(list);
142 }
143
list_callback_sum(void * data,void * context)144 static bool list_callback_sum(void* data, void* context) {
145 EXPECT_NE(data, nullptr);
146 EXPECT_NE(context, nullptr);
147 int* sum = (int*)context;
148 int* value = (int*)data;
149 *sum += *value;
150 return true;
151 }
152
list_callback_find_int(void * data,void * context)153 static bool list_callback_find_int(void* data, void* context) {
154 EXPECT_NE(data, nullptr);
155 EXPECT_NE(context, nullptr);
156 return (*(int*)data != *(int*)context);
157 }
158
TEST_F(ListTest,test_list_foreach_full)159 TEST_F(ListTest, test_list_foreach_full) {
160 list_t* list = list_new(NULL);
161
162 // Fill in test data
163 int x[] = {1, 2, 3, 4, 5};
164 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
165 EXPECT_EQ(list_length(list), (size_t)5);
166
167 // Test complete iteration
168 int sum = 0;
169 list_node_t* rc = list_foreach(list, list_callback_sum, &sum);
170 EXPECT_EQ(sum, 15);
171 EXPECT_TRUE(rc == NULL);
172
173 list_free(list);
174 }
175
TEST_F(ListTest,test_list_foreach_partial)176 TEST_F(ListTest, test_list_foreach_partial) {
177 list_t* list = list_new(NULL);
178
179 // Fill in test data
180 int x[] = {1, 2, 3, 4, 5};
181 for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
182 EXPECT_EQ(list_length(list), (size_t)5);
183
184 // Test partial iteration
185 int find = 4;
186 list_node_t* rc = list_foreach(list, list_callback_find_int, &find);
187 EXPECT_TRUE(rc != NULL);
188 int* rc_val = (int*)list_node(rc);
189 EXPECT_TRUE(*rc_val == 4);
190
191 find = 1;
192 rc = list_foreach(list, list_callback_find_int, &find);
193 EXPECT_TRUE(rc != NULL);
194 rc_val = (int*)list_node(rc);
195 EXPECT_TRUE(*rc_val == 1);
196
197 find = 5;
198 rc = list_foreach(list, list_callback_find_int, &find);
199 EXPECT_TRUE(rc != NULL);
200 rc_val = (int*)list_node(rc);
201 EXPECT_TRUE(*rc_val == 5);
202
203 find = 0;
204 rc = list_foreach(list, list_callback_find_int, &find);
205 EXPECT_TRUE(rc == NULL);
206
207 list_free(list);
208 }
209