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