1540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati#include <gtest/gtest.h>
2540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
3540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavatiextern "C" {
4540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati#include "list.h"
5540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati#include "osi.h"
6540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
7540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
8540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_new_simple) {
9540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
10540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  ASSERT_TRUE(list != NULL);
11540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
12540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
13540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_free_simple) {
14540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  // In this test we just verify that list_free is callable with a valid list.
15540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
16540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
17540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
18540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
19540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_free_null) {
20540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  // In this test we just verify that list_free is callable with NULL.
21540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(NULL);
22540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
23540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
24540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_empty_list_is_empty) {
25540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
26540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_is_empty(list));
27540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
28540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
29540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
30540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_empty_list_has_no_length) {
31540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
32540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list), 0U);
33540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
34540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
35540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
36540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_simple_list_prepend) {
37540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
38540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_prepend(list, &list));
39540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_FALSE(list_is_empty(list));
40540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list), 1U);
41540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
42540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
43540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
44540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_simple_list_append) {
45540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
46540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_append(list, &list));
47540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_FALSE(list_is_empty(list));
48540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list), 1U);
49540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
50540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
51540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
52540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_remove_found) {
53540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
54540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_append(list, &list);
55540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_remove(list, &list));
56540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_is_empty(list));
57540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list),  0U);
58540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
59540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
60540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
61540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_remove_not_found) {
62540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x;
63540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
64540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_append(list, &list);
65540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_FALSE(list_remove(list, &x));
66540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_FALSE(list_is_empty(list));
67540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list), 1U);
68540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
69540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
70540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
71540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_front) {
72540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x[] = { 1, 2, 3, 4, 5 };
73540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
74540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
75540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
76540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    list_append(list, &x[i]);
77540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
78540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_front(list), &x[0]);
79540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
80540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
81540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
82540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
83540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_back) {
84540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x[] = { 1, 2, 3, 4, 5 };
85540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
86540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
87540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
88540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    list_append(list, &x[i]);
89540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
90540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_back(list), &x[ARRAY_SIZE(x) - 1]);
91540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
92540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
93540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
94540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
95540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_clear) {
96540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x[] = { 1, 2, 3, 4, 5 };
97540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
98540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
99540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
100540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    list_append(list, &x[i]);
101540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
102540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_clear(list);
103540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_TRUE(list_is_empty(list));
104540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  EXPECT_EQ(list_length(list), 0U);
105540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
106540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
107540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
108540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
109540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_append_multiple) {
110540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x[] = { 1, 2, 3, 4, 5 };
111540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
112540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
113540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
114540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    list_append(list, &x[i]);
115540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
116540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int i = 0;
117540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), ++i)
118540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    EXPECT_EQ(list_node(node), &x[i]);
119540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
120540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
121540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
122540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
123540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil NanavatiTEST(ListTest, test_list_prepend_multiple) {
124540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int x[] = { 1, 2, 3, 4, 5 };
125540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_t *list = list_new(NULL);
126540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
127540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (size_t i = 0; i < ARRAY_SIZE(x); ++i)
128540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    list_prepend(list, &x[i]);
129540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
130540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  int i = ARRAY_SIZE(x) - 1;
131540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  for (const list_node_t *node = list_begin(list); node != list_end(list); node = list_next(node), --i)
132540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati    EXPECT_EQ(list_node(node), &x[i]);
133540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati
134540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati  list_free(list);
135540e7cab4a9a47dc2d38f96e332e19d16dbfc1d2Sharvil Nanavati}
136bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati
137bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil NanavatiTEST(ListTest, test_list_begin_empty_list) {
138bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  list_t *list = list_new(NULL);
139bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  EXPECT_EQ(list_begin(list), list_end(list));
140bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  list_free(list);
141bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati}
142bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati
143bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil NanavatiTEST(ListTest, test_list_next) {
144bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  list_t *list = list_new(NULL);
145bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  list_append(list, &list);
146bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  EXPECT_NE(list_begin(list), list_end(list));
147bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  EXPECT_EQ(list_next(list_begin(list)), list_end(list));
148bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati  list_free(list);
149bfaea44aa24ad3d8b7aac98204ce8ee5c12857b5Sharvil Nanavati}
150