You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.1 KiB
212 lines
5.1 KiB
#include <gtest/gtest.h>
|
|
|
|
#include <base/logging.h>
|
|
|
|
#include "AllocationTestHarness.h"
|
|
|
|
#include "osi/include/list.h"
|
|
#include "osi/include/osi.h"
|
|
|
|
class ListTest : public AllocationTestHarness {};
|
|
|
|
TEST_F(ListTest, test_new_free_simple) {
|
|
list_t* list = list_new(NULL);
|
|
ASSERT_TRUE(list != NULL);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_free_null) {
|
|
// In this test we just verify that list_free is callable with NULL.
|
|
list_free(NULL);
|
|
}
|
|
|
|
TEST_F(ListTest, test_empty_list_is_empty) {
|
|
list_t* list = list_new(NULL);
|
|
EXPECT_TRUE(list_is_empty(list));
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_empty_list_has_no_length) {
|
|
list_t* list = list_new(NULL);
|
|
EXPECT_EQ(list_length(list), 0U);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_simple_list_prepend) {
|
|
list_t* list = list_new(NULL);
|
|
EXPECT_TRUE(list_prepend(list, &list));
|
|
EXPECT_FALSE(list_is_empty(list));
|
|
EXPECT_EQ(list_length(list), 1U);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_simple_list_append) {
|
|
list_t* list = list_new(NULL);
|
|
EXPECT_TRUE(list_append(list, &list));
|
|
EXPECT_FALSE(list_is_empty(list));
|
|
EXPECT_EQ(list_length(list), 1U);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_remove_found) {
|
|
list_t* list = list_new(NULL);
|
|
list_append(list, &list);
|
|
EXPECT_TRUE(list_remove(list, &list));
|
|
EXPECT_TRUE(list_is_empty(list));
|
|
EXPECT_EQ(list_length(list), 0U);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_remove_not_found) {
|
|
int x;
|
|
list_t* list = list_new(NULL);
|
|
list_append(list, &list);
|
|
EXPECT_FALSE(list_remove(list, &x));
|
|
EXPECT_FALSE(list_is_empty(list));
|
|
EXPECT_EQ(list_length(list), 1U);
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_front) {
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
list_t* list = list_new(NULL);
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
|
|
EXPECT_EQ(list_front(list), &x[0]);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_back) {
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
list_t* list = list_new(NULL);
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
|
|
EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_clear) {
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
list_t* list = list_new(NULL);
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
|
|
list_clear(list);
|
|
EXPECT_TRUE(list_is_empty(list));
|
|
EXPECT_EQ(list_length(list), 0U);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_append_multiple) {
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
list_t* list = list_new(NULL);
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
|
|
int i = 0;
|
|
for (const list_node_t *node = list_begin(list); node != list_end(list);
|
|
node = list_next(node), ++i)
|
|
EXPECT_EQ(list_node(node), &x[i]);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_prepend_multiple) {
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
list_t* list = list_new(NULL);
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_prepend(list, &x[i]);
|
|
|
|
int i = ARRAY_SIZE(x) - 1;
|
|
for (const list_node_t *node = list_begin(list); node != list_end(list);
|
|
node = list_next(node), --i)
|
|
EXPECT_EQ(list_node(node), &x[i]);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_begin_empty_list) {
|
|
list_t* list = list_new(NULL);
|
|
EXPECT_EQ(list_begin(list), list_end(list));
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_next) {
|
|
list_t* list = list_new(NULL);
|
|
list_append(list, &list);
|
|
EXPECT_NE(list_begin(list), list_end(list));
|
|
EXPECT_EQ(list_next(list_begin(list)), list_end(list));
|
|
list_free(list);
|
|
}
|
|
|
|
static bool list_callback_sum(void* data, void* context) {
|
|
CHECK(data);
|
|
CHECK(context);
|
|
int* sum = (int*)context;
|
|
int* value = (int*)data;
|
|
*sum += *value;
|
|
return true;
|
|
}
|
|
|
|
static bool list_callback_find_int(void* data, void* context) {
|
|
CHECK(data);
|
|
CHECK(context);
|
|
return (*(int*)data != *(int*)context);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_foreach_full) {
|
|
list_t* list = list_new(NULL);
|
|
|
|
// Fill in test data
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
EXPECT_EQ(list_length(list), (size_t)5);
|
|
|
|
// Test complete iteration
|
|
int sum = 0;
|
|
list_node_t* rc = list_foreach(list, list_callback_sum, &sum);
|
|
EXPECT_EQ(sum, 15);
|
|
EXPECT_TRUE(rc == NULL);
|
|
|
|
list_free(list);
|
|
}
|
|
|
|
TEST_F(ListTest, test_list_foreach_partial) {
|
|
list_t* list = list_new(NULL);
|
|
|
|
// Fill in test data
|
|
int x[] = {1, 2, 3, 4, 5};
|
|
for (size_t i = 0; i < ARRAY_SIZE(x); ++i) list_append(list, &x[i]);
|
|
EXPECT_EQ(list_length(list), (size_t)5);
|
|
|
|
// Test partial iteration
|
|
int find = 4;
|
|
list_node_t* rc = list_foreach(list, list_callback_find_int, &find);
|
|
EXPECT_TRUE(rc != NULL);
|
|
int* rc_val = (int*)list_node(rc);
|
|
EXPECT_TRUE(*rc_val == 4);
|
|
|
|
find = 1;
|
|
rc = list_foreach(list, list_callback_find_int, &find);
|
|
EXPECT_TRUE(rc != NULL);
|
|
rc_val = (int*)list_node(rc);
|
|
EXPECT_TRUE(*rc_val == 1);
|
|
|
|
find = 5;
|
|
rc = list_foreach(list, list_callback_find_int, &find);
|
|
EXPECT_TRUE(rc != NULL);
|
|
rc_val = (int*)list_node(rc);
|
|
EXPECT_TRUE(*rc_val == 5);
|
|
|
|
find = 0;
|
|
rc = list_foreach(list, list_callback_find_int, &find);
|
|
EXPECT_TRUE(rc == NULL);
|
|
|
|
list_free(list);
|
|
}
|