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