xref: /aosp_15_r20/external/angle/src/common/CircularBuffer_unittest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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