xref: /aosp_15_r20/external/cronet/base/containers/extend_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/containers/extend.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <initializer_list>
8*6777b538SAndroid Build Coastguard Worker #include <type_traits>
9*6777b538SAndroid Build Coastguard Worker #include <utility>
10*6777b538SAndroid Build Coastguard Worker #include <vector>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace base {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker using testing::ElementsAre;
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker struct NonCopyable {
23*6777b538SAndroid Build Coastguard Worker   char c_;
NonCopyablebase::__anon0d5ff9ab0111::NonCopyable24*6777b538SAndroid Build Coastguard Worker   explicit NonCopyable(char c) : c_(c) {}
25*6777b538SAndroid Build Coastguard Worker   NonCopyable(NonCopyable&&) = default;
26*6777b538SAndroid Build Coastguard Worker   NonCopyable& operator=(NonCopyable&& other) = default;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   NonCopyable(const NonCopyable&) = delete;
29*6777b538SAndroid Build Coastguard Worker   NonCopyable& operator=(const NonCopyable&) = delete;
30*6777b538SAndroid Build Coastguard Worker };
31*6777b538SAndroid Build Coastguard Worker 
operator ==(const NonCopyable & a,const NonCopyable & b)32*6777b538SAndroid Build Coastguard Worker bool operator==(const NonCopyable& a, const NonCopyable& b) {
33*6777b538SAndroid Build Coastguard Worker   return a.c_ == b.c_;
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker static_assert(std::is_move_constructible_v<NonCopyable>, "");
37*6777b538SAndroid Build Coastguard Worker static_assert(!std::is_copy_constructible_v<NonCopyable>, "");
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker struct CopyableMovable {
40*6777b538SAndroid Build Coastguard Worker   bool copied_;
41*6777b538SAndroid Build Coastguard Worker   char c_;
CopyableMovablebase::__anon0d5ff9ab0111::CopyableMovable42*6777b538SAndroid Build Coastguard Worker   explicit CopyableMovable(char c) : copied_(false), c_(c) {}
CopyableMovablebase::__anon0d5ff9ab0111::CopyableMovable43*6777b538SAndroid Build Coastguard Worker   CopyableMovable(const CopyableMovable& other) : copied_(true), c_(other.c_) {}
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   CopyableMovable& operator=(const CopyableMovable&) = default;
46*6777b538SAndroid Build Coastguard Worker   CopyableMovable(CopyableMovable&&) = default;
47*6777b538SAndroid Build Coastguard Worker   CopyableMovable& operator=(CopyableMovable&& other) = default;
48*6777b538SAndroid Build Coastguard Worker };
49*6777b538SAndroid Build Coastguard Worker 
operator ==(const CopyableMovable & a,const CopyableMovable & b)50*6777b538SAndroid Build Coastguard Worker bool operator==(const CopyableMovable& a, const CopyableMovable& b) {
51*6777b538SAndroid Build Coastguard Worker   return a.c_ == b.c_;
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker }  // namespace
55*6777b538SAndroid Build Coastguard Worker 
TEST(ExtendTest,ExtendWithMove)56*6777b538SAndroid Build Coastguard Worker TEST(ExtendTest, ExtendWithMove) {
57*6777b538SAndroid Build Coastguard Worker   std::vector<NonCopyable> dst;
58*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd'})
59*6777b538SAndroid Build Coastguard Worker     dst.emplace_back(c);
60*6777b538SAndroid Build Coastguard Worker   std::vector<NonCopyable> src;
61*6777b538SAndroid Build Coastguard Worker   for (char c : {'e', 'f', 'g'})
62*6777b538SAndroid Build Coastguard Worker     src.emplace_back(c);
63*6777b538SAndroid Build Coastguard Worker   std::vector<NonCopyable> expected;
64*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd', 'e', 'f', 'g'})
65*6777b538SAndroid Build Coastguard Worker     expected.emplace_back(c);
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   Extend(dst, std::move(src));
68*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dst, expected);
69*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(src.empty());
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker 
TEST(ExtendTest,ExtendCopyableWithMove)72*6777b538SAndroid Build Coastguard Worker TEST(ExtendTest, ExtendCopyableWithMove) {
73*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> dst;
74*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd'})
75*6777b538SAndroid Build Coastguard Worker     dst.emplace_back(c);
76*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> src;
77*6777b538SAndroid Build Coastguard Worker   for (char c : {'e', 'f', 'g'})
78*6777b538SAndroid Build Coastguard Worker     src.emplace_back(c);
79*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> expected;
80*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd', 'e', 'f', 'g'})
81*6777b538SAndroid Build Coastguard Worker     expected.emplace_back(c);
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   Extend(dst, std::move(src));
84*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dst, expected);
85*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(src.empty());
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
TEST(ExtendTest,ExtendWithCopy)88*6777b538SAndroid Build Coastguard Worker TEST(ExtendTest, ExtendWithCopy) {
89*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> dst;
90*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd'})
91*6777b538SAndroid Build Coastguard Worker     dst.emplace_back(c);
92*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> src;
93*6777b538SAndroid Build Coastguard Worker   for (char c : {'e', 'f', 'g'})
94*6777b538SAndroid Build Coastguard Worker     src.emplace_back(c);
95*6777b538SAndroid Build Coastguard Worker   std::vector<CopyableMovable> expected;
96*6777b538SAndroid Build Coastguard Worker   for (char c : {'a', 'b', 'c', 'd', 'e', 'f', 'g'})
97*6777b538SAndroid Build Coastguard Worker     expected.emplace_back(c);
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dst[0].copied_);
100*6777b538SAndroid Build Coastguard Worker   Extend(dst, src);
101*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(dst, expected);
102*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(dst[0].copied_);
103*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(dst[dst.size() - 1].copied_);
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
TEST(ExtendTest,ExtendWithSpan)106*6777b538SAndroid Build Coastguard Worker TEST(ExtendTest, ExtendWithSpan) {
107*6777b538SAndroid Build Coastguard Worker   static constexpr uint8_t kRawArray[] = {3, 4, 5};
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   static constexpr auto kVectorGenerator = []() -> std::vector<uint8_t> {
110*6777b538SAndroid Build Coastguard Worker     return {9, 10, 11};
111*6777b538SAndroid Build Coastguard Worker   };
112*6777b538SAndroid Build Coastguard Worker 
113*6777b538SAndroid Build Coastguard Worker   static const std::vector<uint8_t> kConstVector = kVectorGenerator();
114*6777b538SAndroid Build Coastguard Worker   static std::vector<uint8_t> kMutVector = kVectorGenerator();
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   std::vector<uint8_t> dst;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Selects overload for span<const uint8_t, 3>.
119*6777b538SAndroid Build Coastguard Worker   Extend(dst, span(kRawArray));
120*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dst, ElementsAre(3, 4, 5));
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   // Selects overload for span<uint8_t, 3>.
123*6777b538SAndroid Build Coastguard Worker   static std::array<uint8_t, 3> kArray = {6, 7, 8};
124*6777b538SAndroid Build Coastguard Worker   Extend(dst, span(kArray));
125*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dst, ElementsAre(3, 4, 5, 6, 7, 8));
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   // Selects overload for span<const uint8_t, dynamic_extent>.
128*6777b538SAndroid Build Coastguard Worker   Extend(dst, span(kConstVector));
129*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dst, ElementsAre(3, 4, 5, 6, 7, 8, 9, 10, 11));
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   // Selects overload for span<uint8_t, dynamic_extent>.
132*6777b538SAndroid Build Coastguard Worker   Extend(dst, span(kMutVector));
133*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(dst, ElementsAre(3, 4, 5, 6, 7, 8, 9, 10, 11, 9, 10, 11));
134*6777b538SAndroid Build Coastguard Worker }
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker }  // namespace base
137