Line data Source code
1 : /**
2 : * @file BListTests.cpp
3 : * @copyright (c) 2014 by Petr Zemek (s3rvac@gmail.com) and contributors
4 : * @license BSD, see the @c LICENSE file for more details
5 : * @brief Tests for the BList class.
6 : */
7 :
8 : #include <gtest/gtest.h>
9 :
10 : #include "BInteger.h"
11 : #include "BList.h"
12 :
13 : namespace bencoding {
14 : namespace tests {
15 :
16 : using namespace testing;
17 :
18 32 : class BListTests: public Test {};
19 :
20 5 : TEST_F(BListTests,
21 : ListIsEmptyAfterCreation) {
22 2 : auto l = BList::create();
23 :
24 1 : EXPECT_TRUE(l->empty());
25 1 : }
26 :
27 5 : TEST_F(BListTests,
28 : ListIsEmptyAfterCreationFromEmptySequenceOfItems) {
29 2 : auto l = BList::create({});
30 :
31 1 : EXPECT_TRUE(l->empty());
32 1 : }
33 :
34 5 : TEST_F(BListTests,
35 : ListIsNotEmptyAfterItemIsAppendedToEmptyList) {
36 2 : auto l = BList::create();
37 1 : l->push_back(BInteger::create(1));
38 :
39 1 : EXPECT_FALSE(l->empty());
40 1 : }
41 :
42 5 : TEST_F(BListTests,
43 : SizeCorrespondsToNumberOfItemsAppendedIntoList) {
44 2 : auto l = BList::create();
45 :
46 1 : ASSERT_EQ(0, l->size());
47 1 : l->push_back(BInteger::create(1));
48 1 : ASSERT_EQ(1, l->size());
49 1 : l->push_back(BInteger::create(1));
50 1 : ASSERT_EQ(2, l->size());
51 : }
52 :
53 5 : TEST_F(BListTests,
54 : ListCreatedFromNonEmptySequenceOfItemsContainsTheItems) {
55 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
56 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
57 2 : auto l = BList::create({firstItem, secondItem});
58 :
59 1 : EXPECT_EQ(2, l->size());
60 1 : EXPECT_EQ(firstItem, l->front());
61 1 : EXPECT_EQ(secondItem, l->back());
62 1 : }
63 :
64 5 : TEST_F(BListTests,
65 : PopBackCorrectlyRemovesLastItemInNonEmptyList) {
66 2 : auto l = BList::create();
67 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
68 1 : l->push_back(firstItem);
69 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
70 1 : l->push_back(secondItem);
71 :
72 1 : ASSERT_EQ(2, l->size());
73 1 : l->pop_back();
74 1 : ASSERT_EQ(1, l->size());
75 1 : EXPECT_EQ(firstItem, l->front());
76 : }
77 :
78 5 : TEST_F(BListTests,
79 : FrontReturnsFirstItemFromNonEmptyList) {
80 2 : auto l = BList::create();
81 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
82 1 : l->push_back(firstItem);
83 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
84 1 : l->push_back(secondItem);
85 :
86 1 : EXPECT_EQ(firstItem, l->front());
87 1 : }
88 :
89 5 : TEST_F(BListTests,
90 : FrontReturnsFirstItemFromNonEmptyConstantList) {
91 2 : auto l = BList::create();
92 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
93 1 : l->push_back(firstItem);
94 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
95 1 : l->push_back(secondItem);
96 2 : std::shared_ptr<const BList> cl(std::move(l));
97 :
98 1 : EXPECT_EQ(firstItem, cl->front());
99 1 : }
100 :
101 5 : TEST_F(BListTests,
102 : BackReturnsLastItemFromNonEmptyList) {
103 2 : auto l = BList::create();
104 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
105 1 : l->push_back(firstItem);
106 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
107 1 : l->push_back(secondItem);
108 :
109 1 : EXPECT_EQ(secondItem, l->back());
110 1 : }
111 :
112 5 : TEST_F(BListTests,
113 : BackReturnsLastItemFromNonEmptyConstantList) {
114 2 : auto l = BList::create();
115 2 : std::shared_ptr<BItem> firstItem = BInteger::create(1);
116 1 : l->push_back(firstItem);
117 2 : std::shared_ptr<BItem> secondItem = BInteger::create(2);
118 1 : l->push_back(secondItem);
119 2 : std::shared_ptr<const BList> cl(std::move(l));
120 :
121 1 : EXPECT_EQ(secondItem, cl->back());
122 1 : }
123 :
124 5 : TEST_F(BListTests,
125 : IterationWorksCorrectlyOverEmptyList) {
126 2 : auto l = BList::create();
127 :
128 1 : EXPECT_EQ(l->begin(), l->end());
129 1 : }
130 :
131 5 : TEST_F(BListTests,
132 : IterationWorksCorrectlyOverListWithTwoItems) {
133 2 : auto l = BList::create();
134 1 : l->push_back(BInteger::create(1));
135 1 : l->push_back(BInteger::create(2));
136 :
137 1 : auto i = l->begin();
138 2 : auto firstItem = (*i)->as<BInteger>();
139 1 : ASSERT_TRUE(firstItem != nullptr);
140 1 : ASSERT_EQ(1, firstItem->value());
141 :
142 1 : ++i;
143 2 : auto secondItem = (*i)->as<BInteger>();
144 1 : ASSERT_TRUE(secondItem != nullptr);
145 1 : ASSERT_EQ(2, secondItem->value());
146 :
147 1 : ++i;
148 1 : ASSERT_EQ(l->end(), i);
149 : }
150 :
151 5 : TEST_F(BListTests,
152 : IterationWorksCorrectlyOverEmptyConstantList) {
153 2 : std::unique_ptr<const BList> l = BList::create();
154 :
155 1 : EXPECT_EQ(l->begin(), l->end());
156 1 : }
157 :
158 5 : TEST_F(BListTests,
159 : IterationWorksCorrectlyOverConstantListWithTwoItems) {
160 2 : auto l = BList::create();
161 1 : l->push_back(BInteger::create(1));
162 1 : l->push_back(BInteger::create(2));
163 2 : std::shared_ptr<const BList> cl(std::move(l));
164 :
165 1 : auto i = cl->begin();
166 2 : auto firstItem = (*i)->as<BInteger>();
167 1 : ASSERT_TRUE(firstItem != nullptr);
168 1 : ASSERT_EQ(1, firstItem->value());
169 :
170 1 : ++i;
171 2 : auto secondItem = (*i)->as<BInteger>();
172 1 : ASSERT_TRUE(secondItem != nullptr);
173 1 : ASSERT_EQ(2, secondItem->value());
174 :
175 1 : ++i;
176 1 : ASSERT_EQ(cl->end(), i);
177 : }
178 :
179 5 : TEST_F(BListTests,
180 : IterationWorksCorrectlyOverEmptyConstantListUsingCPrefixedMethods) {
181 2 : std::unique_ptr<const BList> l = BList::create();
182 :
183 1 : EXPECT_EQ(l->cbegin(), l->cend());
184 1 : }
185 :
186 5 : TEST_F(BListTests,
187 : IterationWorksCorrectlyOverConstantListWithTwoItemsUsingCPrefixedMethods) {
188 2 : auto l = BList::create();
189 1 : l->push_back(BInteger::create(1));
190 1 : l->push_back(BInteger::create(2));
191 2 : std::shared_ptr<const BList> cl(std::move(l));
192 :
193 1 : auto i = cl->cbegin();
194 2 : auto firstItem = (*i)->as<BInteger>();
195 1 : ASSERT_TRUE(firstItem != nullptr);
196 1 : ASSERT_EQ(1, firstItem->value());
197 :
198 1 : ++i;
199 2 : auto secondItem = (*i)->as<BInteger>();
200 1 : ASSERT_TRUE(secondItem != nullptr);
201 1 : ASSERT_EQ(2, secondItem->value());
202 :
203 1 : ++i;
204 1 : ASSERT_EQ(cl->cend(), i);
205 : }
206 :
207 : } // namespace tests
208 3 : } // namespace bencoding
|