28namespace ArrayBaseTestsHelpers
33 TriviallyCopyableType() =
default;
35 TriviallyCopyableType (
int v)
39 TriviallyCopyableType (
float v)
43 bool operator== (
const TriviallyCopyableType& other)
const
45 return getValue() == other.getValue();
48 int getValue()
const {
return value; }
57 NonTriviallyCopyableType() =
default;
59 NonTriviallyCopyableType (
int v)
63 NonTriviallyCopyableType (
float v)
67 NonTriviallyCopyableType (
const NonTriviallyCopyableType& other)
71 NonTriviallyCopyableType& operator= (
const NonTriviallyCopyableType& other)
77 bool operator== (
const NonTriviallyCopyableType& other)
const
79 return getValue() == other.getValue();
82 int getValue()
const {
return *ptr; }
90bool operator== (
const ArrayBaseTestsHelpers::TriviallyCopyableType& tct,
91 const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct)
93 return tct.getValue() == ntct.getValue();
96bool operator== (
const ArrayBaseTestsHelpers::NonTriviallyCopyableType& ntct,
97 const ArrayBaseTestsHelpers::TriviallyCopyableType& tct)
102class ArrayBaseTests :
public UnitTest
104 using CopyableType = ArrayBaseTestsHelpers::TriviallyCopyableType;
105 using NoncopyableType = ArrayBaseTestsHelpers::NonTriviallyCopyableType;
107 #if ! (defined(__GNUC__) && __GNUC__ < 5 && ! defined(__clang__))
108 static_assert (std::is_trivially_copyable<CopyableType>::value,
109 "Test TriviallyCopyableType is not trivially copyable");
110 static_assert (! std::is_trivially_copyable<NoncopyableType>::value,
111 "Test NonTriviallyCopyableType is trivially copyable");
116 : UnitTest (
"ArrayBase", UnitTestCategories::containers)
119 void runTest()
override
121 beginTest (
"grow capacity");
148 beginTest (
"shrink capacity");
178 beginTest (
"equality");
204 beginTest (
"accessors");
242 beginTest (
"add moved");
248 for (
int i = 0; i < 5; ++i)
261 beginTest (
"add multiple");
267 for (
int i = 4; i < 7; ++i)
276 beginTest (
"add array from a pointer");
290 beginTest (
"add array from a pointer of a different type");
296 std::vector<float>
floatData = { 1.4f, 2.5f, 3.6f };
307 beginTest (
"add array from initializer_list");
313 std::initializer_list<CopyableType>
ilct { { 3 }, { 4 }, { 5 } };
314 std::initializer_list<NoncopyableType>
ilnct { { 3 }, { 4 }, { 5 } };
325 beginTest (
"add array from containers");
377 beginTest (
"insert");
391 for (
int i = 0; i < 3; ++i)
399 for (
int i = 0; i < 50; ++i)
406 beginTest (
"insert array");
411 std::vector<CopyableType>
copyableData = { 3, 4, 5, 6, 7, 8 };
432 beginTest (
"remove");
440 for (
int i = 0; i < 4; ++i)
452 for (
int i = 0; i < 4; ++i)
454 for (
int j = 0;
j < blockSize; ++
j)
490 if (p.second > p.first)
506 beginTest (
"After converting move construction, ownership is transferred");
515 expectEquals (
base.capacity(), 5);
516 expectEquals (
base.size(), 1);
517 expect (
base.getFirst() == &
obj);
518 expectEquals (
derived.capacity(), 0);
519 expectEquals (
derived.size(), 0);
520 expect (
derived.data() ==
nullptr);
523 beginTest (
"After converting move assignment, ownership is transferred");
533 expectEquals (
base.capacity(), 5);
534 expectEquals (
base.size(), 1);
535 expect (
base.getFirst() == &
obj);
536 expectEquals (
derived.capacity(), 0);
537 expectEquals (
derived.size(), 0);
538 expect (
derived.data() ==
nullptr);
545 virtual ~Base() =
default;
565 template<
typename A,
typename B>
569 expectEquals ((
int)
a.size(), (
int)
b.size());
571 for (
int i = 0; i < (
int)
a.size(); ++i)
572 expect (
a[i] ==
b[i]);
575 template<
typename A,
typename B>
579 expectEquals ((
int)
a.size(), (
int)
b.size());
581 for (
int i = 0; i < (
int)
a.size(); ++i)
582 expect (
a[i] ==
b[(
size_t) i]);
585 template<
typename A,
typename B,
typename C>
596static ArrayBaseTests arrayBaseTests;
ElementType getFirst() const noexcept
ElementType getLast() const noexcept