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