xref: /aosp_15_r20/external/pigweed/pw_containers/vector_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/vector.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include "pw_compilation_testing/negative_compilation.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_containers_private/test_helpers.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
22*61c4878aSAndroid Build Coastguard Worker 
23*61c4878aSAndroid Build Coastguard Worker namespace pw {
24*61c4878aSAndroid Build Coastguard Worker namespace {
25*61c4878aSAndroid Build Coastguard Worker 
26*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::string_view_literals;
27*61c4878aSAndroid Build Coastguard Worker using containers::test::CopyOnly;
28*61c4878aSAndroid Build Coastguard Worker using containers::test::Counter;
29*61c4878aSAndroid Build Coastguard Worker using containers::test::MoveOnly;
30*61c4878aSAndroid Build Coastguard Worker 
31*61c4878aSAndroid Build Coastguard Worker // Since pw::Vector<T, N> downcasts to a pw::Vector<T, 0>, ensure that the
32*61c4878aSAndroid Build Coastguard Worker // alignment doesn't change.
33*61c4878aSAndroid Build Coastguard Worker static_assert(alignof(Vector<std::max_align_t, 0>) ==
34*61c4878aSAndroid Build Coastguard Worker               alignof(Vector<std::max_align_t, 1>));
35*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_NoArg)36*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_NoArg) {
37*61c4878aSAndroid Build Coastguard Worker   Vector<int, 3> vector;
38*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(vector.empty());
39*61c4878aSAndroid Build Coastguard Worker }
40*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_MultipleCopies)41*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_MultipleCopies) {
42*61c4878aSAndroid Build Coastguard Worker   Vector<int, 3> vector(3, 123);
43*61c4878aSAndroid Build Coastguard Worker 
44*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 3u);
45*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[0], 123);
46*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[1], 123);
47*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[2], 123);
48*61c4878aSAndroid Build Coastguard Worker }
49*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_DefaultSize)50*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_DefaultSize) {
51*61c4878aSAndroid Build Coastguard Worker   Vector<int, 3> vector(3);
52*61c4878aSAndroid Build Coastguard Worker 
53*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 3u);
54*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[0], 0);
55*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[1], 0);
56*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[2], 0);
57*61c4878aSAndroid Build Coastguard Worker }
58*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_Iterators)59*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_Iterators) {
60*61c4878aSAndroid Build Coastguard Worker   std::array array{1, 2, 3, 4, 5};
61*61c4878aSAndroid Build Coastguard Worker 
62*61c4878aSAndroid Build Coastguard Worker   Vector<int, 64> vector(array.begin(), array.end());
63*61c4878aSAndroid Build Coastguard Worker 
64*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), array.size());
65*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < array.size(); ++i) {
66*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], array[i]);
67*61c4878aSAndroid Build Coastguard Worker   }
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_Copy)70*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_Copy) {
71*61c4878aSAndroid Build Coastguard Worker   CopyOnly origin(5);
72*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 10> origin_vector(3, origin);
73*61c4878aSAndroid Build Coastguard Worker 
74*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 100> vector(origin_vector);
75*61c4878aSAndroid Build Coastguard Worker 
76*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3u, vector.size());
77*61c4878aSAndroid Build Coastguard Worker 
78*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
79*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, origin.value);
80*61c4878aSAndroid Build Coastguard Worker   }
81*61c4878aSAndroid Build Coastguard Worker }
82*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_Move)83*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_Move) {
84*61c4878aSAndroid Build Coastguard Worker   Vector<MoveOnly, 10> origin_vector;
85*61c4878aSAndroid Build Coastguard Worker 
86*61c4878aSAndroid Build Coastguard Worker   for (int i = 0; i < 5; ++i) {
87*61c4878aSAndroid Build Coastguard Worker     origin_vector.emplace_back(421);
88*61c4878aSAndroid Build Coastguard Worker   }
89*61c4878aSAndroid Build Coastguard Worker 
90*61c4878aSAndroid Build Coastguard Worker   Vector<MoveOnly, 100> vector(std::move(origin_vector));
91*61c4878aSAndroid Build Coastguard Worker 
92*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
93*61c4878aSAndroid Build Coastguard Worker 
94*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
95*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, 421);
96*61c4878aSAndroid Build Coastguard Worker   }
97*61c4878aSAndroid Build Coastguard Worker 
98*61c4878aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE(bugprone-use-after-move)
99*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < origin_vector.size(); ++i) {
100*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(origin_vector[i].value, MoveOnly::kDeleted);
101*61c4878aSAndroid Build Coastguard Worker   }
102*61c4878aSAndroid Build Coastguard Worker }
103*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_InitializerList)104*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_InitializerList) {
105*61c4878aSAndroid Build Coastguard Worker   Vector<int, 3> vector{100, 200};
106*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
107*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[0], 100);
108*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[1], 200);
109*61c4878aSAndroid Build Coastguard Worker }
110*61c4878aSAndroid Build Coastguard Worker 
111*61c4878aSAndroid Build Coastguard Worker struct Aggregate {
112*61c4878aSAndroid Build Coastguard Worker   int integer;
113*61c4878aSAndroid Build Coastguard Worker   Vector<char, 8> vector;
114*61c4878aSAndroid Build Coastguard Worker };
115*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_String)116*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_String) {
117*61c4878aSAndroid Build Coastguard Worker   const auto vector = Vector<char, 8>{"Hello"};
118*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
119*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
120*61c4878aSAndroid Build Coastguard Worker }
121*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_StringTruncates)122*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_StringTruncates) {
123*61c4878aSAndroid Build Coastguard Worker   const auto vector = Vector<char, 8>{"Hello from a long string"};
124*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(8u, vector.size());
125*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello fr"sv, std::string_view(vector.data(), vector.size()));
126*61c4878aSAndroid Build Coastguard Worker }
127*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_AssignFromString)128*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_AssignFromString) {
129*61c4878aSAndroid Build Coastguard Worker   Vector<char, 8> vector = "Hello";
130*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
131*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
132*61c4878aSAndroid Build Coastguard Worker }
133*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_AggregateString)134*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_AggregateString) {
135*61c4878aSAndroid Build Coastguard Worker   Aggregate aggregate = {.integer = 42, .vector = "Hello"};
136*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, aggregate.vector.size());
137*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv,
138*61c4878aSAndroid Build Coastguard Worker             std::string_view(aggregate.vector.data(), aggregate.vector.size()));
139*61c4878aSAndroid Build Coastguard Worker }
140*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_StringView)141*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_StringView) {
142*61c4878aSAndroid Build Coastguard Worker   const auto vector = Vector<char, 8>{"Hello"sv};
143*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
144*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
145*61c4878aSAndroid Build Coastguard Worker }
146*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_StringViewTruncates)147*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_StringViewTruncates) {
148*61c4878aSAndroid Build Coastguard Worker   const auto vector = Vector<char, 8>{"Hello from a long string"sv};
149*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(8u, vector.size());
150*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello fr"sv, std::string_view(vector.data(), vector.size()));
151*61c4878aSAndroid Build Coastguard Worker }
152*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_AssignFromStringView)153*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_AssignFromStringView) {
154*61c4878aSAndroid Build Coastguard Worker   Vector<char, 8> vector = "Hello"sv;
155*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
156*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
157*61c4878aSAndroid Build Coastguard Worker }
158*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Construct_AggregateStringView)159*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Construct_AggregateStringView) {
160*61c4878aSAndroid Build Coastguard Worker   Aggregate aggregate = {.integer = 42, .vector = "Hello"sv};
161*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, aggregate.vector.size());
162*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Hello"sv,
163*61c4878aSAndroid Build Coastguard Worker             std::string_view(aggregate.vector.data(), aggregate.vector.size()));
164*61c4878aSAndroid Build Coastguard Worker }
165*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Destruct_ZeroLength)166*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Destruct_ZeroLength) {
167*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
168*61c4878aSAndroid Build Coastguard Worker 
169*61c4878aSAndroid Build Coastguard Worker   {
170*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 0> destroyed;
171*61c4878aSAndroid Build Coastguard Worker   }
172*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 0);
173*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 0);
174*61c4878aSAndroid Build Coastguard Worker }
175*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Destruct_Empty)176*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Destruct_Empty) {
177*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
178*61c4878aSAndroid Build Coastguard Worker 
179*61c4878aSAndroid Build Coastguard Worker   {
180*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 128> destroyed;
181*61c4878aSAndroid Build Coastguard Worker   }
182*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 0);
183*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 0);
184*61c4878aSAndroid Build Coastguard Worker }
185*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Destruct_MultpileEntries)186*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Destruct_MultpileEntries) {
187*61c4878aSAndroid Build Coastguard Worker   Counter value;
188*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
189*61c4878aSAndroid Build Coastguard Worker 
190*61c4878aSAndroid Build Coastguard Worker   {
191*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 128> destroyed(100, value);
192*61c4878aSAndroid Build Coastguard Worker   }
193*61c4878aSAndroid Build Coastguard Worker 
194*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 100);
195*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 100);
196*61c4878aSAndroid Build Coastguard Worker }
197*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_Copy_SmallerToLarger)198*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_Copy_SmallerToLarger) {
199*61c4878aSAndroid Build Coastguard Worker   CopyOnly origin(5);
200*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 3> origin_vector(3, origin);
201*61c4878aSAndroid Build Coastguard Worker 
202*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 2> vector;
203*61c4878aSAndroid Build Coastguard Worker   vector = origin_vector;
204*61c4878aSAndroid Build Coastguard Worker 
205*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(2u, vector.size());
206*61c4878aSAndroid Build Coastguard Worker 
207*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
208*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, origin.value);
209*61c4878aSAndroid Build Coastguard Worker   }
210*61c4878aSAndroid Build Coastguard Worker }
211*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_DifferentMaxSize_Copy)212*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_DifferentMaxSize_Copy) {
213*61c4878aSAndroid Build Coastguard Worker   const Vector<int, 10> origin_vector = {1, 1, 2, 3};
214*61c4878aSAndroid Build Coastguard Worker 
215*61c4878aSAndroid Build Coastguard Worker   Vector<int, 100> vector;
216*61c4878aSAndroid Build Coastguard Worker   vector = origin_vector;
217*61c4878aSAndroid Build Coastguard Worker 
218*61c4878aSAndroid Build Coastguard Worker   ASSERT_EQ(4u, vector.size());
219*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[0]);
220*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[1]);
221*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(2, vector[2]);
222*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, vector[3]);
223*61c4878aSAndroid Build Coastguard Worker }
224*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_SameMaxSize_Copy)225*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_SameMaxSize_Copy) {
226*61c4878aSAndroid Build Coastguard Worker   const Vector<int, 10> origin_vector = {1, 1, 2, 3};
227*61c4878aSAndroid Build Coastguard Worker 
228*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector;
229*61c4878aSAndroid Build Coastguard Worker   vector = origin_vector;
230*61c4878aSAndroid Build Coastguard Worker 
231*61c4878aSAndroid Build Coastguard Worker   ASSERT_EQ(4u, vector.size());
232*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[0]);
233*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[1]);
234*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(2, vector[2]);
235*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, vector[3]);
236*61c4878aSAndroid Build Coastguard Worker }
237*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_Generic_Copy)238*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_Generic_Copy) {
239*61c4878aSAndroid Build Coastguard Worker   const Vector<int, 10> origin_vector = {1, 1, 2, 3};
240*61c4878aSAndroid Build Coastguard Worker 
241*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector;
242*61c4878aSAndroid Build Coastguard Worker   Vector<int>& ref = vector;
243*61c4878aSAndroid Build Coastguard Worker   ref = static_cast<const Vector<int>&>(origin_vector);
244*61c4878aSAndroid Build Coastguard Worker 
245*61c4878aSAndroid Build Coastguard Worker   ASSERT_EQ(4u, vector.size());
246*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[0]);
247*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[1]);
248*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(2, vector[2]);
249*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, vector[3]);
250*61c4878aSAndroid Build Coastguard Worker }
251*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_Move)252*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_Move) {
253*61c4878aSAndroid Build Coastguard Worker   Vector<MoveOnly, 10> origin_vector;
254*61c4878aSAndroid Build Coastguard Worker 
255*61c4878aSAndroid Build Coastguard Worker   for (int i = 0; i < 5; ++i) {
256*61c4878aSAndroid Build Coastguard Worker     origin_vector.emplace_back(421);
257*61c4878aSAndroid Build Coastguard Worker   }
258*61c4878aSAndroid Build Coastguard Worker 
259*61c4878aSAndroid Build Coastguard Worker   Vector<MoveOnly, 10> vector;
260*61c4878aSAndroid Build Coastguard Worker   vector = std::move(origin_vector);
261*61c4878aSAndroid Build Coastguard Worker 
262*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, vector.size());
263*61c4878aSAndroid Build Coastguard Worker 
264*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
265*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, 421);
266*61c4878aSAndroid Build Coastguard Worker   }
267*61c4878aSAndroid Build Coastguard Worker 
268*61c4878aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE(bugprone-use-after-move)
269*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < origin_vector.size(); ++i) {
270*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(origin_vector[i].value, MoveOnly::kDeleted);
271*61c4878aSAndroid Build Coastguard Worker   }
272*61c4878aSAndroid Build Coastguard Worker }
273*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Assign_InitializerList)274*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Assign_InitializerList) {
275*61c4878aSAndroid Build Coastguard Worker   Vector<int, 4> vector;
276*61c4878aSAndroid Build Coastguard Worker   vector = {1, 3, 5, 7, 9};
277*61c4878aSAndroid Build Coastguard Worker 
278*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(4u, vector.size());
279*61c4878aSAndroid Build Coastguard Worker 
280*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(1, vector[0]);
281*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, vector[1]);
282*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5, vector[2]);
283*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(7, vector[3]);
284*61c4878aSAndroid Build Coastguard Worker }
285*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Access_ZeroLength)286*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Access_ZeroLength) {
287*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 0> vector;
288*61c4878aSAndroid Build Coastguard Worker 
289*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(0u, vector.size());
290*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(0u, vector.max_size());
291*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(vector.empty());
292*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(vector.full());
293*61c4878aSAndroid Build Coastguard Worker 
294*61c4878aSAndroid Build Coastguard Worker   for (auto& item : vector) {
295*61c4878aSAndroid Build Coastguard Worker     (void)item;
296*61c4878aSAndroid Build Coastguard Worker     FAIL();
297*61c4878aSAndroid Build Coastguard Worker   }
298*61c4878aSAndroid Build Coastguard Worker }
299*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Access_Data_ArrayLocationIsIndependentOfMaxSize)300*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Access_Data_ArrayLocationIsIndependentOfMaxSize) {
301*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector;
302*61c4878aSAndroid Build Coastguard Worker   Vector<int>& base = static_cast<Vector<int>&>(vector);
303*61c4878aSAndroid Build Coastguard Worker 
304*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), base.data());
305*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), (static_cast<Vector<int, 0>&>(base).data()));
306*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.data(), (static_cast<Vector<int, 1>&>(base).data()));
307*61c4878aSAndroid Build Coastguard Worker }
308*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Clear)309*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Clear) {
310*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
311*61c4878aSAndroid Build Coastguard Worker 
312*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 100> vector;
313*61c4878aSAndroid Build Coastguard Worker   vector.emplace_back();
314*61c4878aSAndroid Build Coastguard Worker   vector.emplace_back();
315*61c4878aSAndroid Build Coastguard Worker   vector.emplace_back();
316*61c4878aSAndroid Build Coastguard Worker 
317*61c4878aSAndroid Build Coastguard Worker   vector.clear();
318*61c4878aSAndroid Build Coastguard Worker 
319*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, Counter::created);
320*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3, Counter::destroyed);
321*61c4878aSAndroid Build Coastguard Worker }
322*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_PushBack_Copy)323*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_PushBack_Copy) {
324*61c4878aSAndroid Build Coastguard Worker   Counter value(99);
325*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
326*61c4878aSAndroid Build Coastguard Worker 
327*61c4878aSAndroid Build Coastguard Worker   {
328*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 10> vector;
329*61c4878aSAndroid Build Coastguard Worker     vector.push_back(value);
330*61c4878aSAndroid Build Coastguard Worker 
331*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.size(), 1u);
332*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.front().value, 99);
333*61c4878aSAndroid Build Coastguard Worker   }
334*61c4878aSAndroid Build Coastguard Worker 
335*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 1);
336*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 1);
337*61c4878aSAndroid Build Coastguard Worker }
338*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_PushBack_Move)339*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_PushBack_Move) {
340*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
341*61c4878aSAndroid Build Coastguard Worker 
342*61c4878aSAndroid Build Coastguard Worker   {
343*61c4878aSAndroid Build Coastguard Worker     Counter value(99);
344*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 10> vector;
345*61c4878aSAndroid Build Coastguard Worker     vector.push_back(std::move(value));
346*61c4878aSAndroid Build Coastguard Worker 
347*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.size(), 1u);
348*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.front().value, 99);
349*61c4878aSAndroid Build Coastguard Worker     // NOLINTNEXTLINE(bugprone-use-after-move)
350*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(value.value, 0);
351*61c4878aSAndroid Build Coastguard Worker   }
352*61c4878aSAndroid Build Coastguard Worker 
353*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 1);
354*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 2);
355*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 1);
356*61c4878aSAndroid Build Coastguard Worker }
357*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_EmplaceBack)358*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_EmplaceBack) {
359*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
360*61c4878aSAndroid Build Coastguard Worker 
361*61c4878aSAndroid Build Coastguard Worker   {
362*61c4878aSAndroid Build Coastguard Worker     Vector<Counter, 10> vector;
363*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(314);
364*61c4878aSAndroid Build Coastguard Worker 
365*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.size(), 1u);
366*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector.front().value, 314);
367*61c4878aSAndroid Build Coastguard Worker   }
368*61c4878aSAndroid Build Coastguard Worker 
369*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 1);
370*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 1);
371*61c4878aSAndroid Build Coastguard Worker }
372*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Resize_Larger)373*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Resize_Larger) {
374*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 10> vector(1, CopyOnly(123));
375*61c4878aSAndroid Build Coastguard Worker   vector.resize(3, CopyOnly(123));
376*61c4878aSAndroid Build Coastguard Worker 
377*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 3u);
378*61c4878aSAndroid Build Coastguard Worker   for (auto& i : vector) {
379*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(i.value, 123);
380*61c4878aSAndroid Build Coastguard Worker   }
381*61c4878aSAndroid Build Coastguard Worker }
382*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Resize_LargerThanMax)383*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Resize_LargerThanMax) {
384*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 10> vector;
385*61c4878aSAndroid Build Coastguard Worker   vector.resize(1000, CopyOnly(123));
386*61c4878aSAndroid Build Coastguard Worker 
387*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 10u);
388*61c4878aSAndroid Build Coastguard Worker   for (auto& i : vector) {
389*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(i.value, 123);
390*61c4878aSAndroid Build Coastguard Worker   }
391*61c4878aSAndroid Build Coastguard Worker }
392*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Resize_Smaller)393*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Resize_Smaller) {
394*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 10> vector(9, CopyOnly(123));
395*61c4878aSAndroid Build Coastguard Worker   vector.resize(3, CopyOnly(123));
396*61c4878aSAndroid Build Coastguard Worker 
397*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 3u);
398*61c4878aSAndroid Build Coastguard Worker   for (auto& i : vector) {
399*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(i.value, 123);
400*61c4878aSAndroid Build Coastguard Worker   }
401*61c4878aSAndroid Build Coastguard Worker }
402*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_PopBack)403*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_PopBack) {
404*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector({Counter(1), Counter(2), Counter(3)});
405*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
406*61c4878aSAndroid Build Coastguard Worker 
407*61c4878aSAndroid Build Coastguard Worker   vector.pop_back();
408*61c4878aSAndroid Build Coastguard Worker 
409*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
410*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[0].value, 1);
411*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector[1].value, 2);
412*61c4878aSAndroid Build Coastguard Worker 
413*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 0);
414*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 1);
415*61c4878aSAndroid Build Coastguard Worker }
416*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Resize_Zero)417*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Resize_Zero) {
418*61c4878aSAndroid Build Coastguard Worker   Vector<CopyOnly, 10> vector(10, CopyOnly(123));
419*61c4878aSAndroid Build Coastguard Worker   vector.resize(0, CopyOnly(123));
420*61c4878aSAndroid Build Coastguard Worker 
421*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 0u);
422*61c4878aSAndroid Build Coastguard Worker }
423*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_TrivialRangeBegin)424*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_TrivialRangeBegin) {
425*61c4878aSAndroid Build Coastguard Worker   Vector<size_t, 10> vector;
426*61c4878aSAndroid Build Coastguard Worker 
427*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
428*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(i);
429*61c4878aSAndroid Build Coastguard Worker   }
430*61c4878aSAndroid Build Coastguard Worker 
431*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin() + 2, vector.end());
432*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
433*61c4878aSAndroid Build Coastguard Worker 
434*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
435*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], i);
436*61c4878aSAndroid Build Coastguard Worker   }
437*61c4878aSAndroid Build Coastguard Worker }
438*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_TrivialRangeEnd)439*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_TrivialRangeEnd) {
440*61c4878aSAndroid Build Coastguard Worker   Vector<size_t, 10> vector;
441*61c4878aSAndroid Build Coastguard Worker 
442*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
443*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(i);
444*61c4878aSAndroid Build Coastguard Worker   }
445*61c4878aSAndroid Build Coastguard Worker 
446*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin(), vector.end() - 2);
447*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
448*61c4878aSAndroid Build Coastguard Worker 
449*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
450*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], 8u + i);
451*61c4878aSAndroid Build Coastguard Worker   }
452*61c4878aSAndroid Build Coastguard Worker }
453*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_TrivialSingleItem)454*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_TrivialSingleItem) {
455*61c4878aSAndroid Build Coastguard Worker   Vector<size_t, 10> vector;
456*61c4878aSAndroid Build Coastguard Worker 
457*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
458*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(i);
459*61c4878aSAndroid Build Coastguard Worker   }
460*61c4878aSAndroid Build Coastguard Worker 
461*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin() + 9);
462*61c4878aSAndroid Build Coastguard Worker 
463*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 9u);
464*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(8), 8u);
465*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(0), 0u);
466*61c4878aSAndroid Build Coastguard Worker 
467*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin());
468*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 8u);
469*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(0), 1u);
470*61c4878aSAndroid Build Coastguard Worker }
471*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_NonTrivialRangeBegin)472*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_NonTrivialRangeBegin) {
473*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
474*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
475*61c4878aSAndroid Build Coastguard Worker 
476*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
477*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(static_cast<int>(i));
478*61c4878aSAndroid Build Coastguard Worker   }
479*61c4878aSAndroid Build Coastguard Worker 
480*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
481*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, static_cast<int>(i));
482*61c4878aSAndroid Build Coastguard Worker   }
483*61c4878aSAndroid Build Coastguard Worker 
484*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin() + 2, vector.end());
485*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
486*61c4878aSAndroid Build Coastguard Worker 
487*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
488*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, static_cast<int>(i));
489*61c4878aSAndroid Build Coastguard Worker   }
490*61c4878aSAndroid Build Coastguard Worker 
491*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 8);
492*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 0);
493*61c4878aSAndroid Build Coastguard Worker }
494*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_NonTrivialRangeEnd)495*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_NonTrivialRangeEnd) {
496*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
497*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
498*61c4878aSAndroid Build Coastguard Worker 
499*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
500*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(static_cast<int>(i));
501*61c4878aSAndroid Build Coastguard Worker   }
502*61c4878aSAndroid Build Coastguard Worker 
503*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin(), vector.end() - 2);
504*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 2u);
505*61c4878aSAndroid Build Coastguard Worker 
506*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.size(); ++i) {
507*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, static_cast<int>(8u + i));
508*61c4878aSAndroid Build Coastguard Worker   }
509*61c4878aSAndroid Build Coastguard Worker 
510*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 8);
511*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 2);
512*61c4878aSAndroid Build Coastguard Worker }
513*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Erase_None)514*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Erase_None) {
515*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
516*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
517*61c4878aSAndroid Build Coastguard Worker 
518*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < vector.max_size(); ++i) {
519*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(static_cast<int>(i));
520*61c4878aSAndroid Build Coastguard Worker   }
521*61c4878aSAndroid Build Coastguard Worker 
522*61c4878aSAndroid Build Coastguard Worker   vector.erase(vector.begin() + 2, vector.begin() + 2);
523*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 10u);
524*61c4878aSAndroid Build Coastguard Worker 
525*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 0);
526*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 0);
527*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 10);
528*61c4878aSAndroid Build Coastguard Worker }
529*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_End)530*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_End) {
531*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
532*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
533*61c4878aSAndroid Build Coastguard Worker 
534*61c4878aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; ++i) {
535*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(i);
536*61c4878aSAndroid Build Coastguard Worker   }
537*61c4878aSAndroid Build Coastguard Worker 
538*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 8u);
539*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 8);
540*61c4878aSAndroid Build Coastguard Worker 
541*61c4878aSAndroid Build Coastguard Worker   decltype(vector)::iterator it = vector.insert(vector.cend(), 8);
542*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(it->value, 8);
543*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(8).value, 8);
544*61c4878aSAndroid Build Coastguard Worker 
545*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::destroyed, 1);
546*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 1);
547*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 9);
548*61c4878aSAndroid Build Coastguard Worker }
549*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_Begin)550*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_Begin) {
551*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
552*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
553*61c4878aSAndroid Build Coastguard Worker 
554*61c4878aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; ++i) {
555*61c4878aSAndroid Build Coastguard Worker     vector.emplace_back(i);
556*61c4878aSAndroid Build Coastguard Worker   }
557*61c4878aSAndroid Build Coastguard Worker 
558*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 8u);
559*61c4878aSAndroid Build Coastguard Worker 
560*61c4878aSAndroid Build Coastguard Worker   decltype(vector)::iterator it = vector.insert(vector.cbegin(), 123);
561*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(it->value, 123);
562*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(0).value, 123);
563*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(8).value, 7);
564*61c4878aSAndroid Build Coastguard Worker 
565*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 9);
566*61c4878aSAndroid Build Coastguard Worker }
567*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_CountCopies)568*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_CountCopies) {
569*61c4878aSAndroid Build Coastguard Worker   Counter::Reset();
570*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector;
571*61c4878aSAndroid Build Coastguard Worker 
572*61c4878aSAndroid Build Coastguard Worker   vector.emplace_back(123);
573*61c4878aSAndroid Build Coastguard Worker   vector.insert(vector.cbegin() + 1, 8, Counter{421});
574*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.at(0).value, 123);
575*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 9u);
576*61c4878aSAndroid Build Coastguard Worker 
577*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 1; i < vector.size(); ++i) {
578*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, 421);
579*61c4878aSAndroid Build Coastguard Worker   }
580*61c4878aSAndroid Build Coastguard Worker 
581*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::moved, 0);
582*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Counter::created, 10);
583*61c4878aSAndroid Build Coastguard Worker }
584*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_IteratorRange)585*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_IteratorRange) {
586*61c4878aSAndroid Build Coastguard Worker   std::array array_to_insert_first{0, 1, 2, 8, 9};
587*61c4878aSAndroid Build Coastguard Worker   std::array array_to_insert_middle{3, 4, 5, 6, 7};
588*61c4878aSAndroid Build Coastguard Worker 
589*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector(array_to_insert_first.begin(),
590*61c4878aSAndroid Build Coastguard Worker                          array_to_insert_first.end());
591*61c4878aSAndroid Build Coastguard Worker 
592*61c4878aSAndroid Build Coastguard Worker   decltype(vector)::iterator it = vector.insert(vector.cbegin() + 3,
593*61c4878aSAndroid Build Coastguard Worker                                                 array_to_insert_middle.begin(),
594*61c4878aSAndroid Build Coastguard Worker                                                 array_to_insert_middle.end());
595*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(*it, array_to_insert_middle.front());
596*61c4878aSAndroid Build Coastguard Worker 
597*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.max_size(); ++i) {
598*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_cast<int>(i));
599*61c4878aSAndroid Build Coastguard Worker   }
600*61c4878aSAndroid Build Coastguard Worker }
601*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_IteratorEmptyRange)602*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_IteratorEmptyRange) {
603*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> src;
604*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> dst(10, 1);
605*61c4878aSAndroid Build Coastguard Worker   dst.insert(dst.end(), src.begin(), src.end());
606*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(dst.size(), 10U);
607*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(dst.back(), 1);
608*61c4878aSAndroid Build Coastguard Worker }
609*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_InitializerListRange)610*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_InitializerListRange) {
611*61c4878aSAndroid Build Coastguard Worker   std::array array_to_insert_first{0, 1, 2, 8, 9};
612*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector(array_to_insert_first.begin(),
613*61c4878aSAndroid Build Coastguard Worker                          array_to_insert_first.end());
614*61c4878aSAndroid Build Coastguard Worker 
615*61c4878aSAndroid Build Coastguard Worker   decltype(vector)::iterator it =
616*61c4878aSAndroid Build Coastguard Worker       vector.insert(vector.cbegin() + 3, {3, 4, 5, 6, 7});
617*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(*it, 3);
618*61c4878aSAndroid Build Coastguard Worker 
619*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.max_size(); ++i) {
620*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], static_cast<int>(i));
621*61c4878aSAndroid Build Coastguard Worker   }
622*61c4878aSAndroid Build Coastguard Worker }
623*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Modify_Insert_NonTrivial_InitializerListRange)624*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Modify_Insert_NonTrivial_InitializerListRange) {
625*61c4878aSAndroid Build Coastguard Worker   std::array<Counter, 5> array_to_insert_first{0, 1, 2, 8, 9};
626*61c4878aSAndroid Build Coastguard Worker   Vector<Counter, 10> vector(array_to_insert_first.begin(),
627*61c4878aSAndroid Build Coastguard Worker                              array_to_insert_first.end());
628*61c4878aSAndroid Build Coastguard Worker 
629*61c4878aSAndroid Build Coastguard Worker   decltype(vector)::iterator it = vector.insert(
630*61c4878aSAndroid Build Coastguard Worker       vector.cbegin() + 3, std::initializer_list<Counter>{3, 4, 5, 6, 7});
631*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(it->value, 3);
632*61c4878aSAndroid Build Coastguard Worker 
633*61c4878aSAndroid Build Coastguard Worker   for (unsigned short i = 0; i < vector.max_size(); ++i) {
634*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i].value, static_cast<int>(i));
635*61c4878aSAndroid Build Coastguard Worker   }
636*61c4878aSAndroid Build Coastguard Worker }
637*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,Generic)638*61c4878aSAndroid Build Coastguard Worker TEST(Vector, Generic) {
639*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector{1, 2, 3, 4, 5};
640*61c4878aSAndroid Build Coastguard Worker 
641*61c4878aSAndroid Build Coastguard Worker   Vector<int>& generic_vector(vector);
642*61c4878aSAndroid Build Coastguard Worker 
643*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(generic_vector.size(), vector.size());
644*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(generic_vector.max_size(), vector.max_size());
645*61c4878aSAndroid Build Coastguard Worker 
646*61c4878aSAndroid Build Coastguard Worker   unsigned short i = 0;
647*61c4878aSAndroid Build Coastguard Worker   for (int value : vector) {
648*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(value, generic_vector[i]);
649*61c4878aSAndroid Build Coastguard Worker     i += 1;
650*61c4878aSAndroid Build Coastguard Worker   }
651*61c4878aSAndroid Build Coastguard Worker 
652*61c4878aSAndroid Build Coastguard Worker   i = 0;
653*61c4878aSAndroid Build Coastguard Worker   for (int value : generic_vector) {
654*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(vector[i], value);
655*61c4878aSAndroid Build Coastguard Worker     i += 1;
656*61c4878aSAndroid Build Coastguard Worker   }
657*61c4878aSAndroid Build Coastguard Worker }
658*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,ConstexprMaxSize)659*61c4878aSAndroid Build Coastguard Worker TEST(Vector, ConstexprMaxSize) {
660*61c4878aSAndroid Build Coastguard Worker   Vector<int, 10> vector;
661*61c4878aSAndroid Build Coastguard Worker   Vector<int, vector.max_size()> vector2;
662*61c4878aSAndroid Build Coastguard Worker 
663*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.max_size(), vector2.max_size());
664*61c4878aSAndroid Build Coastguard Worker 
665*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(DynamicCapacity_MaxSizeNotConstexpr)
666*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT_CLANG("non-type template argument is not a constant expression");
667*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT_GCC("call to non-'constexpr' function");
668*61c4878aSAndroid Build Coastguard Worker   Vector<int>& generic_vector(vector);
669*61c4878aSAndroid Build Coastguard Worker   Vector<int, generic_vector.max_size()> vector3;
670*61c4878aSAndroid Build Coastguard Worker #endif  // PW_NC_TEST
671*61c4878aSAndroid Build Coastguard Worker }
672*61c4878aSAndroid Build Coastguard Worker 
TEST(Vector,DeleteAndDestructionDisallowedOnDynamicCapacity)673*61c4878aSAndroid Build Coastguard Worker TEST(Vector, DeleteAndDestructionDisallowedOnDynamicCapacity) {
674*61c4878aSAndroid Build Coastguard Worker   std::byte raw_storage[64]{};
675*61c4878aSAndroid Build Coastguard Worker   Vector<int, 4>* vector = new (raw_storage) Vector<int, 4>;
676*61c4878aSAndroid Build Coastguard Worker   [[maybe_unused]] Vector<int>* generic_vector = vector;
677*61c4878aSAndroid Build Coastguard Worker 
678*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(GenericCapacity_DeleteDisallowed)
679*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT(" protected ");
680*61c4878aSAndroid Build Coastguard Worker   delete generic_vector;
681*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(GenericCapacity_ManualDestructionDisallowed)
682*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT(" protected ");
683*61c4878aSAndroid Build Coastguard Worker   generic_vector->~Vector();
684*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(KnownCapacity_ManualDestructionDisallowed)
685*61c4878aSAndroid Build Coastguard Worker   PW_NC_EXPECT(" protected ");
686*61c4878aSAndroid Build Coastguard Worker   vector->~Vector<int>();
687*61c4878aSAndroid Build Coastguard Worker #else
688*61c4878aSAndroid Build Coastguard Worker   vector->~Vector<int, 4>();
689*61c4878aSAndroid Build Coastguard Worker #endif  // PW_NC_TEST
690*61c4878aSAndroid Build Coastguard Worker }
691*61c4878aSAndroid Build Coastguard Worker 
692*61c4878aSAndroid Build Coastguard Worker // Test that Vector<T> is trivially destructible when its type is.
693*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<Vector<int, 4>>);
694*61c4878aSAndroid Build Coastguard Worker 
695*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<MoveOnly>);
696*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<Vector<MoveOnly, 1>>);
697*61c4878aSAndroid Build Coastguard Worker 
698*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<CopyOnly>);
699*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<Vector<CopyOnly, 99>>);
700*61c4878aSAndroid Build Coastguard Worker 
701*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_trivially_destructible_v<Counter>);
702*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_trivially_destructible_v<Vector<Counter, 99>>);
703*61c4878aSAndroid Build Coastguard Worker 
704*61c4878aSAndroid Build Coastguard Worker // Generic-capacity Vectors cannot be constructed or destructed.
705*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_constructible_v<Vector<int>>);
706*61c4878aSAndroid Build Coastguard Worker static_assert(!std::is_destructible_v<Vector<int>>);
707*61c4878aSAndroid Build Coastguard Worker 
708*61c4878aSAndroid Build Coastguard Worker }  // namespace
709*61c4878aSAndroid Build Coastguard Worker }  // namespace pw
710