blob: 8a6ef4c21bc2a2f4d1fed09163972c7bda32f120 [file] [log] [blame]
Philip Quinn9b8926e2023-01-31 14:50:02 -08001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <algorithm>
18#include <iterator>
19#include <memory>
20#include <vector>
21
22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
24#include <input/RingBuffer.h>
25
26namespace android {
27namespace {
28
29using ::testing::ElementsAre;
30using ::testing::ElementsAreArray;
31using ::testing::IsEmpty;
32using ::testing::Not;
33using ::testing::SizeIs;
34
35TEST(RingBufferTest, PushPop) {
36 RingBuffer<int> buffer(/*capacity=*/3);
37
38 buffer.pushBack(1);
39 buffer.pushBack(2);
40 buffer.pushBack(3);
41 EXPECT_THAT(buffer, ElementsAre(1, 2, 3));
42
43 buffer.pushBack(4);
44 EXPECT_THAT(buffer, ElementsAre(2, 3, 4));
45
46 buffer.pushFront(1);
47 EXPECT_THAT(buffer, ElementsAre(1, 2, 3));
48
49 EXPECT_EQ(1, buffer.popFront());
50 EXPECT_THAT(buffer, ElementsAre(2, 3));
51
52 buffer.pushBack(4);
53 EXPECT_THAT(buffer, ElementsAre(2, 3, 4));
54
55 buffer.pushBack(5);
56 EXPECT_THAT(buffer, ElementsAre(3, 4, 5));
57
58 EXPECT_EQ(5, buffer.popBack());
59 EXPECT_THAT(buffer, ElementsAre(3, 4));
60
61 EXPECT_EQ(4, buffer.popBack());
62 EXPECT_THAT(buffer, ElementsAre(3));
63
64 EXPECT_EQ(3, buffer.popBack());
65 EXPECT_THAT(buffer, ElementsAre());
66
67 buffer.pushBack(1);
68 EXPECT_THAT(buffer, ElementsAre(1));
69
70 EXPECT_EQ(1, buffer.popFront());
71 EXPECT_THAT(buffer, ElementsAre());
72}
73
74TEST(RingBufferTest, ObjectType) {
75 RingBuffer<std::unique_ptr<int>> buffer(/*capacity=*/2);
76 buffer.pushBack(std::make_unique<int>(1));
77 buffer.pushBack(std::make_unique<int>(2));
78 buffer.pushBack(std::make_unique<int>(3));
79
80 EXPECT_EQ(2, *buffer[0]);
81 EXPECT_EQ(3, *buffer[1]);
82}
83
84TEST(RingBufferTest, ConstructConstantValue) {
85 RingBuffer<int> buffer(/*count=*/3, /*value=*/10);
86 EXPECT_THAT(buffer, ElementsAre(10, 10, 10));
87 EXPECT_EQ(3u, buffer.capacity());
88}
89
90TEST(RingBufferTest, Assignment) {
91 RingBuffer<int> a(/*capacity=*/2);
92 a.pushBack(1);
93 a.pushBack(2);
94
95 RingBuffer<int> b(/*capacity=*/3);
96 b.pushBack(10);
97 b.pushBack(20);
98 b.pushBack(30);
99
100 std::swap(a, b);
101 EXPECT_THAT(a, ElementsAre(10, 20, 30));
102 EXPECT_THAT(b, ElementsAre(1, 2));
103
104 a = b;
105 EXPECT_THAT(a, ElementsAreArray(b));
106
107 RingBuffer<int> c(b);
108 EXPECT_THAT(c, ElementsAreArray(b));
109
110 RingBuffer<int> d(std::move(b));
111 EXPECT_EQ(0u, b.capacity());
112 EXPECT_THAT(b, ElementsAre());
113 EXPECT_THAT(d, ElementsAre(1, 2));
114
115 b = std::move(d);
116 EXPECT_THAT(b, ElementsAre(1, 2));
117 EXPECT_THAT(d, ElementsAre());
118 EXPECT_EQ(0u, d.capacity());
119}
120
121TEST(RingBufferTest, Subscripting) {
122 RingBuffer<int> buffer(/*capacity=*/2);
123 buffer.pushBack(1);
124 EXPECT_EQ(1, buffer[0]);
125
126 buffer.pushFront(0);
127 EXPECT_EQ(0, buffer[0]);
128 EXPECT_EQ(1, buffer[1]);
129
130 buffer.pushFront(-1);
131 EXPECT_EQ(-1, buffer[0]);
132 EXPECT_EQ(0, buffer[1]);
133}
134
135TEST(RingBufferTest, Iterator) {
136 RingBuffer<int> buffer(/*capacity=*/3);
137 buffer.pushFront(2);
138 buffer.pushBack(3);
139
140 auto begin = buffer.begin();
141 auto end = buffer.end();
142
143 EXPECT_NE(begin, end);
144 EXPECT_LE(begin, end);
145 EXPECT_GT(end, begin);
146 EXPECT_EQ(end, begin + 2);
147 EXPECT_EQ(begin, end - 2);
148
149 EXPECT_EQ(2, end - begin);
150 EXPECT_EQ(1, end - (begin + 1));
151
152 EXPECT_EQ(2, *begin);
153 ++begin;
154 EXPECT_EQ(3, *begin);
155 --begin;
156 EXPECT_EQ(2, *begin);
157 begin += 1;
158 EXPECT_EQ(3, *begin);
159 begin += -1;
160 EXPECT_EQ(2, *begin);
161 begin -= -1;
162 EXPECT_EQ(3, *begin);
163}
164
165TEST(RingBufferTest, Clear) {
166 RingBuffer<int> buffer(/*capacity=*/2);
167 EXPECT_THAT(buffer, ElementsAre());
168
169 buffer.pushBack(1);
170 EXPECT_THAT(buffer, ElementsAre(1));
171
172 buffer.clear();
173 EXPECT_THAT(buffer, ElementsAre());
174 EXPECT_THAT(buffer, SizeIs(0));
175 EXPECT_THAT(buffer, IsEmpty());
176
177 buffer.pushFront(1);
178 EXPECT_THAT(buffer, ElementsAre(1));
179}
180
181TEST(RingBufferTest, SizeAndIsEmpty) {
182 RingBuffer<int> buffer(/*capacity=*/2);
183 EXPECT_THAT(buffer, SizeIs(0));
184 EXPECT_THAT(buffer, IsEmpty());
185
186 buffer.pushBack(1);
187 EXPECT_THAT(buffer, SizeIs(1));
188 EXPECT_THAT(buffer, Not(IsEmpty()));
189
190 buffer.pushBack(2);
191 EXPECT_THAT(buffer, SizeIs(2));
192 EXPECT_THAT(buffer, Not(IsEmpty()));
193
194 buffer.pushBack(3);
195 EXPECT_THAT(buffer, SizeIs(2));
196 EXPECT_THAT(buffer, Not(IsEmpty()));
197
198 buffer.popFront();
199 EXPECT_THAT(buffer, SizeIs(1));
200 EXPECT_THAT(buffer, Not(IsEmpty()));
201
202 buffer.popBack();
203 EXPECT_THAT(buffer, SizeIs(0));
204 EXPECT_THAT(buffer, IsEmpty());
205}
206
207} // namespace
208} // namespace android