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