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