1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CircularBuffer_unittest:
7*8975f5c5SAndroid Build Coastguard Worker // Tests of the CircularBuffer class
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "common/CircularBuffer.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker namespace angle
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker // Make sure the various constructors compile and do basic checks
TEST(CircularBuffer,Constructors)17*8975f5c5SAndroid Build Coastguard Worker TEST(CircularBuffer, Constructors)
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 5> defaultContructor;
20*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(5u, defaultContructor.size());
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 5> valueConstructor(3);
23*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(5u, valueConstructor.size());
24*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(3, valueConstructor.front());
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 5> copy(valueConstructor);
27*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(5u, copy.size());
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 5> copyRValue(std::move(valueConstructor));
30*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(5u, copyRValue.size());
31*8975f5c5SAndroid Build Coastguard Worker }
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker // Make sure the destructor destroys all elements.
TEST(CircularBuffer,Destructor)34*8975f5c5SAndroid Build Coastguard Worker TEST(CircularBuffer, Destructor)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker struct s
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker s() {}
39*8975f5c5SAndroid Build Coastguard Worker s(int *c) : counter(c) {}
40*8975f5c5SAndroid Build Coastguard Worker ~s()
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker if (counter)
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker ++*counter;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker s(const s &) = default;
49*8975f5c5SAndroid Build Coastguard Worker s &operator=(const s &) = default;
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker int *counter;
52*8975f5c5SAndroid Build Coastguard Worker };
53*8975f5c5SAndroid Build Coastguard Worker
54*8975f5c5SAndroid Build Coastguard Worker int destructorCount = 0;
55*8975f5c5SAndroid Build Coastguard Worker
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<s, 11> buf((s(&destructorCount)));
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker // Destructor called once for the temporary above.
60*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(destructorCount, 1);
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker // Change front index to be non-zero.
63*8975f5c5SAndroid Build Coastguard Worker buf.next();
64*8975f5c5SAndroid Build Coastguard Worker buf.next();
65*8975f5c5SAndroid Build Coastguard Worker buf.next();
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker // Destructor should be called 11 more times, once for each element.
69*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(destructorCount, 12);
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker // Test circulating behavior.
TEST(CircularBuffer,Circulate)73*8975f5c5SAndroid Build Coastguard Worker TEST(CircularBuffer, Circulate)
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 7> buf(128);
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 7; ++i)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker int &value = buf.front();
80*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(value, 128);
81*8975f5c5SAndroid Build Coastguard Worker
82*8975f5c5SAndroid Build Coastguard Worker value = i + 10;
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker buf.next();
85*8975f5c5SAndroid Build Coastguard Worker }
86*8975f5c5SAndroid Build Coastguard Worker
87*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 93; ++i)
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(buf.front(), i % 7 + 10);
90*8975f5c5SAndroid Build Coastguard Worker buf.next();
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker
94*8975f5c5SAndroid Build Coastguard Worker // Test iteration.
TEST(CircularBuffer,Iterate)95*8975f5c5SAndroid Build Coastguard Worker TEST(CircularBuffer, Iterate)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<int, 3> buf(12);
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 3; ++i)
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker int &value = buf.front();
102*8975f5c5SAndroid Build Coastguard Worker buf.next();
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(value, 12);
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker value = i;
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker // Check that iteration returns all the values (with unknown order) regardless of where the
110*8975f5c5SAndroid Build Coastguard Worker // front is pointing.
111*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker uint32_t valuesSeen = 0;
114*8975f5c5SAndroid Build Coastguard Worker for (int value : buf)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker valuesSeen |= 1 << value;
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(valuesSeen, 0x7u);
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker // Make sure iteration hasn't affected the front index.
121*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(buf.front(), i % 3);
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker buf.next();
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker // Tests buffer operations with a non copyable type.
TEST(CircularBuffer,NonCopyable)128*8975f5c5SAndroid Build Coastguard Worker TEST(CircularBuffer, NonCopyable)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker struct s : angle::NonCopyable
131*8975f5c5SAndroid Build Coastguard Worker {
132*8975f5c5SAndroid Build Coastguard Worker s() : x(0) {}
133*8975f5c5SAndroid Build Coastguard Worker s(s &&other) : x(other.x) {}
134*8975f5c5SAndroid Build Coastguard Worker s &operator=(s &&other)
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker x = other.x;
137*8975f5c5SAndroid Build Coastguard Worker return *this;
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker int x;
140*8975f5c5SAndroid Build Coastguard Worker };
141*8975f5c5SAndroid Build Coastguard Worker
142*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<s, 4> buf;
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
145*8975f5c5SAndroid Build Coastguard Worker {
146*8975f5c5SAndroid Build Coastguard Worker s &value = buf.front();
147*8975f5c5SAndroid Build Coastguard Worker value.x = i;
148*8975f5c5SAndroid Build Coastguard Worker
149*8975f5c5SAndroid Build Coastguard Worker buf.next();
150*8975f5c5SAndroid Build Coastguard Worker }
151*8975f5c5SAndroid Build Coastguard Worker
152*8975f5c5SAndroid Build Coastguard Worker // Make the front index non-zero.
153*8975f5c5SAndroid Build Coastguard Worker buf.next();
154*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(buf.front().x, 1);
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker CircularBuffer<s, 4> copy = std::move(buf);
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i)
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(copy.front().x, (i + 1) % 4);
161*8975f5c5SAndroid Build Coastguard Worker copy.next();
162*8975f5c5SAndroid Build Coastguard Worker }
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
165