• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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