1 #include "gtest/gtest.h"
2 #include "chre/util/array_queue.h"
3
4 using chre::ArrayQueue;
5
6 namespace {
7 constexpr int kMaxTestCapacity = 10;
8 int destructor_count[kMaxTestCapacity];
9 int constructor_count;
10
11 class DummyElement {
12 public:
DummyElement()13 DummyElement() {
14 constructor_count++;
15 };
DummyElement(int i)16 DummyElement(int i) {
17 val_ = i;
18 constructor_count++;
19 };
~DummyElement()20 ~DummyElement() {
21 if (val_ >= 0 && val_ < kMaxTestCapacity) {
22 destructor_count[val_]++;
23 }
24 };
setValue(int i)25 void setValue(int i) {
26 val_ = i;
27 }
28
29 private:
30 int val_ = kMaxTestCapacity - 1;
31 };
32 }
33
TEST(ArrayQueueTest,IsEmptyInitially)34 TEST(ArrayQueueTest, IsEmptyInitially) {
35 ArrayQueue<int, 4> q;
36 EXPECT_TRUE(q.empty());
37 EXPECT_EQ(0, q.size());
38 }
39
TEST(ArrayQueueTest,SimplePushPop)40 TEST(ArrayQueueTest, SimplePushPop) {
41 ArrayQueue<int, 3> q;
42 EXPECT_TRUE(q.push(1));
43 EXPECT_TRUE(q.push(2));
44 q.pop();
45 EXPECT_TRUE(q.push(3));
46 }
47
TEST(ArrayQueueTest,TestSize)48 TEST(ArrayQueueTest, TestSize) {
49 ArrayQueue<int, 2> q;
50 q.push(1);
51 EXPECT_EQ(1, q.size());
52 q.push(2);
53 EXPECT_EQ(2, q.size());
54 q.pop();
55 EXPECT_EQ(1, q.size());
56 q.pop();
57 }
58
TEST(ArrayQueueTest,TestEmpty)59 TEST(ArrayQueueTest, TestEmpty) {
60 ArrayQueue<int, 2> q;
61 q.push(1);
62 EXPECT_FALSE(q.empty());
63 q.push(2);
64 EXPECT_FALSE(q.empty());
65 q.pop();
66 EXPECT_FALSE(q.empty());
67 q.pop();
68 EXPECT_TRUE(q.empty());
69 }
70
TEST(ArrayQueueTest,PopWhenEmpty)71 TEST(ArrayQueueTest, PopWhenEmpty) {
72 ArrayQueue<int, 4> q;
73 q.pop();
74 EXPECT_EQ(0, q.size());
75 }
76
TEST(ArrayQueueTest,PushWhenFull)77 TEST(ArrayQueueTest, PushWhenFull) {
78 ArrayQueue<int, 2> q;
79 q.push(1);
80 q.push(2);
81 EXPECT_FALSE(q.push(3));
82 }
83
TEST(ArrayQueueDeathTest,FrontWhenEmpty)84 TEST(ArrayQueueDeathTest, FrontWhenEmpty) {
85 ArrayQueue<int, 4> q;
86 EXPECT_DEATH(q.front(), "");
87 }
88
TEST(ArrayQueueTest,TestFront)89 TEST(ArrayQueueTest, TestFront) {
90 ArrayQueue<int, 3> q;
91 q.push(1);
92 EXPECT_EQ(1, q.front());
93 q.pop();
94 q.push(2);
95 EXPECT_EQ(2, q.front());
96 }
97
TEST(ArrayQueueDeathTest,InvalidSubscript)98 TEST(ArrayQueueDeathTest, InvalidSubscript) {
99 ArrayQueue<int, 2> q;
100 EXPECT_DEATH(q[0], "");
101 }
102
TEST(ArrayQueueTest,Subscript)103 TEST(ArrayQueueTest, Subscript) {
104 ArrayQueue<int, 2> q;
105 q.push(1);
106 q.push(2);
107 EXPECT_EQ(1, q[0]);
108 EXPECT_EQ(2, q[1]);
109 q.pop();
110 EXPECT_EQ(2, q[0]);
111 }
112
TEST(ArrayQueueTest,RemoveWithInvalidIndex)113 TEST(ArrayQueueTest, RemoveWithInvalidIndex) {
114 ArrayQueue<int, 3> q;
115 EXPECT_FALSE(q.remove(0));
116 }
117
TEST(ArrayQueueTest,RemoveWithIndex)118 TEST(ArrayQueueTest, RemoveWithIndex) {
119 ArrayQueue<int, 3> q;
120 q.push(1);
121 q.push(2);
122 q.remove(0);
123 EXPECT_EQ(2, q.front());
124 EXPECT_EQ(1, q.size());
125 q.push(3);
126 q.remove(1);
127 EXPECT_EQ(2, q.front());
128 EXPECT_EQ(1, q.size());
129 }
130
TEST(ArrayQueueTest,DestructorCalledOnPop)131 TEST(ArrayQueueTest, DestructorCalledOnPop) {
132 for (size_t i = 0; i < kMaxTestCapacity; ++i) {
133 destructor_count[i] = 0;
134 }
135
136 ArrayQueue<DummyElement, 3> q;
137 DummyElement e;
138 q.push(e);
139 q.push(e);
140
141 q.front().setValue(0);
142 q.pop();
143 EXPECT_EQ(1, destructor_count[0]);
144
145 q.front().setValue(1);
146 q.pop();
147 EXPECT_EQ(1, destructor_count[1]);
148 }
149
TEST(ArrayQueueTest,ElementsDestructedWhenQueueDestructed)150 TEST(ArrayQueueTest, ElementsDestructedWhenQueueDestructed) {
151 for (size_t i = 0; i < kMaxTestCapacity; ++i) {
152 destructor_count[i] = 0;
153 }
154
155 // Put q and e in the scope so their destructor will be called going
156 // out of scope.
157 { ArrayQueue<DummyElement, 4> q;
158 DummyElement e;
159
160 for (size_t i = 0; i < 3; ++i) {
161 q.push(e);
162 q[i].setValue(i);
163 }
164
165 q.~ArrayQueue();
166
167 for (size_t i = 0; i < 3; ++i) {
168 EXPECT_EQ(1, destructor_count[i]);
169 }
170 }
171
172 // Check destructor count.
173 for (size_t i = 0; i < 3; ++i) {
174 EXPECT_EQ(1, destructor_count[i]);
175 }
176 EXPECT_EQ(0, destructor_count[3]);
177 EXPECT_EQ(1, destructor_count[kMaxTestCapacity - 1]);
178 }
179
TEST(ArrayQueueTest,EmplaceTest)180 TEST(ArrayQueueTest, EmplaceTest) {
181 constructor_count = 0;
182 ArrayQueue<DummyElement, 2> q;
183
184 EXPECT_TRUE(q.emplace(0));
185 EXPECT_EQ(1, constructor_count);
186 EXPECT_EQ(1, q.size());
187
188 EXPECT_TRUE(q.emplace(1));
189 EXPECT_EQ(2, constructor_count);
190 EXPECT_EQ(2, q.size());
191
192 EXPECT_FALSE(q.emplace(2));
193 EXPECT_EQ(2, constructor_count);
194 EXPECT_EQ(2, q.size());
195 }
196
TEST(ArrayQueueTest,EmptyQueueIterator)197 TEST(ArrayQueueTest, EmptyQueueIterator) {
198 ArrayQueue<int, 4> q;
199
200 ArrayQueue<int, 4>::iterator it = q.begin();
201 EXPECT_TRUE(it == q.end());
202 EXPECT_FALSE(it != q.end());
203 }
204
TEST(ArrayQueueTest,SimpleIterator)205 TEST(ArrayQueueTest, SimpleIterator) {
206 ArrayQueue<int, 4> q;
207 for (size_t i = 0; i < 3; ++i) {
208 q.push(i);
209 }
210
211 size_t index = 0;
212 for (ArrayQueue<int, 4>::iterator it = q.begin(); it != q.end(); ++it) {
213 EXPECT_EQ(q[index++], *it);
214 }
215
216 index = 0;
217 ArrayQueue<int, 4>::iterator it = q.begin();
218 while (it != q.end()) {
219 EXPECT_EQ(q[index++], *it++);
220 }
221
222 for (size_t i = 0; i < 3; ++i) {
223 q.pop();
224 q.push(i + 3);
225 }
226
227 index = 0;
228 it = q.begin();
229 while (it != q.end()) {
230 EXPECT_EQ(q[index++], *it++);
231 }
232 }
233
TEST(ArrayQueueTest,IteratorAndPush)234 TEST(ArrayQueueTest, IteratorAndPush) {
235 ArrayQueue<int, 4> q;
236 for (size_t i = 0; i < 2; ++i) {
237 q.push(i);
238 }
239
240 ArrayQueue<int, 4>::iterator it_b = q.begin();
241 ArrayQueue<int, 4>::iterator it_e = q.end();
242 q.push(3);
243
244 size_t index = 0;
245 while (it_b != it_e) {
246 EXPECT_EQ(q[index++], *it_b++);
247 }
248 }
249
TEST(ArrayQueueTest,IteratorAndPop)250 TEST(ArrayQueueTest, IteratorAndPop) {
251 ArrayQueue<int, 4> q;
252 for (size_t i = 0; i < 3; ++i) {
253 q.push(i);
254 }
255
256 ArrayQueue<int, 4>::iterator it_b = q.begin();
257 q.pop();
258 it_b++;
259
260 for (size_t i = 0; i < 2; ++i) {
261 EXPECT_EQ(q[i], *it_b++);
262 }
263 }
264
TEST(ArrayQueueTest,IteratorAndRemove)265 TEST(ArrayQueueTest, IteratorAndRemove) {
266 ArrayQueue<int, 4> q;
267 for (size_t i = 0; i < 2; ++i) {
268 q.push(i);
269 }
270
271 ArrayQueue<int, 4>::iterator it_b = q.begin();
272 q.remove(1);
273
274 EXPECT_EQ(q[0], *it_b);
275 }
276
TEST(ArrayQueueTest,IteratorAndEmplace)277 TEST(ArrayQueueTest, IteratorAndEmplace) {
278 ArrayQueue<int, 4> q;
279 for (size_t i = 0; i < 2; ++i) {
280 q.push(i);
281 }
282
283 ArrayQueue<int, 4>::iterator it_b = q.begin();
284 ArrayQueue<int, 4>::iterator it_e = q.end();
285 q.emplace(3);
286
287 size_t index = 0;
288 while (it_b != it_e) {
289 EXPECT_EQ(q[index++], *it_b++);
290 }
291 }
292
TEST(ArrayQueueTest,SimpleConstIterator)293 TEST(ArrayQueueTest, SimpleConstIterator) {
294 ArrayQueue<int, 4> q;
295 for (size_t i = 0; i < 3; ++i) {
296 q.push(i);
297 }
298
299 size_t index = 0;
300 for (ArrayQueue<int, 4>::const_iterator cit = q.cbegin();
301 cit != q.cend(); ++cit) {
302 EXPECT_EQ(q[index++], *cit);
303 }
304
305 index = 0;
306 ArrayQueue<int, 4>::const_iterator cit = q.cbegin();
307 while (cit != q.cend()) {
308 EXPECT_EQ(q[index++], *cit++);
309 }
310
311 for (size_t i = 0; i < 3; ++i) {
312 q.pop();
313 q.push(i + 3);
314 }
315
316 index = 0;
317 cit = q.cbegin();
318 while (cit != q.cend()) {
319 EXPECT_EQ(q[index++], *cit++);
320 }
321 }
322
TEST(ArrayQueueTest,Full)323 TEST(ArrayQueueTest, Full) {
324 ArrayQueue<size_t, 4> q;
325 for (size_t i = 0; i < 4; i++) {
326 EXPECT_FALSE(q.full());
327 q.push(i);
328 }
329
330 EXPECT_TRUE(q.full());
331 }
332