xref: /aosp_15_r20/external/cronet/base/stl_util_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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/stl_util.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <array>
8*6777b538SAndroid Build Coastguard Worker #include <deque>
9*6777b538SAndroid Build Coastguard Worker #include <forward_list>
10*6777b538SAndroid Build Coastguard Worker #include <functional>
11*6777b538SAndroid Build Coastguard Worker #include <initializer_list>
12*6777b538SAndroid Build Coastguard Worker #include <iterator>
13*6777b538SAndroid Build Coastguard Worker #include <list>
14*6777b538SAndroid Build Coastguard Worker #include <optional>
15*6777b538SAndroid Build Coastguard Worker #include <queue>
16*6777b538SAndroid Build Coastguard Worker #include <set>
17*6777b538SAndroid Build Coastguard Worker #include <stack>
18*6777b538SAndroid Build Coastguard Worker #include <string>
19*6777b538SAndroid Build Coastguard Worker #include <type_traits>
20*6777b538SAndroid Build Coastguard Worker #include <unordered_set>
21*6777b538SAndroid Build Coastguard Worker #include <vector>
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker #include "base/containers/queue.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
25*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker namespace base {
28*6777b538SAndroid Build Coastguard Worker namespace {
29*6777b538SAndroid Build Coastguard Worker 
TEST(STLUtilTest,GetUnderlyingContainer)30*6777b538SAndroid Build Coastguard Worker TEST(STLUtilTest, GetUnderlyingContainer) {
31*6777b538SAndroid Build Coastguard Worker   {
32*6777b538SAndroid Build Coastguard Worker     std::queue<int> queue({1, 2, 3, 4, 5});
33*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(GetUnderlyingContainer(queue)),
34*6777b538SAndroid Build Coastguard Worker                                  const std::deque<int>&>,
35*6777b538SAndroid Build Coastguard Worker                   "GetUnderlyingContainer(queue) should be of type deque");
36*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(GetUnderlyingContainer(queue),
37*6777b538SAndroid Build Coastguard Worker                 testing::ElementsAre(1, 2, 3, 4, 5));
38*6777b538SAndroid Build Coastguard Worker   }
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   {
41*6777b538SAndroid Build Coastguard Worker     std::queue<int> queue;
42*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(GetUnderlyingContainer(queue), testing::ElementsAre());
43*6777b538SAndroid Build Coastguard Worker   }
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   {
46*6777b538SAndroid Build Coastguard Worker     base::queue<int> queue({1, 2, 3, 4, 5});
47*6777b538SAndroid Build Coastguard Worker     static_assert(
48*6777b538SAndroid Build Coastguard Worker         std::is_same_v<decltype(GetUnderlyingContainer(queue)),
49*6777b538SAndroid Build Coastguard Worker                        const base::circular_deque<int>&>,
50*6777b538SAndroid Build Coastguard Worker         "GetUnderlyingContainer(queue) should be of type circular_deque");
51*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(GetUnderlyingContainer(queue),
52*6777b538SAndroid Build Coastguard Worker                 testing::ElementsAre(1, 2, 3, 4, 5));
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   {
56*6777b538SAndroid Build Coastguard Worker     std::vector<int> values = {1, 2, 3, 4, 5};
57*6777b538SAndroid Build Coastguard Worker     std::priority_queue<int> queue(values.begin(), values.end());
58*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(GetUnderlyingContainer(queue)),
59*6777b538SAndroid Build Coastguard Worker                                  const std::vector<int>&>,
60*6777b538SAndroid Build Coastguard Worker                   "GetUnderlyingContainer(queue) should be of type vector");
61*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(GetUnderlyingContainer(queue),
62*6777b538SAndroid Build Coastguard Worker                 testing::UnorderedElementsAre(1, 2, 3, 4, 5));
63*6777b538SAndroid Build Coastguard Worker   }
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   {
66*6777b538SAndroid Build Coastguard Worker     std::stack<int> stack({1, 2, 3, 4, 5});
67*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<decltype(GetUnderlyingContainer(stack)),
68*6777b538SAndroid Build Coastguard Worker                                  const std::deque<int>&>,
69*6777b538SAndroid Build Coastguard Worker                   "GetUnderlyingContainer(stack) should be of type deque");
70*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(GetUnderlyingContainer(stack),
71*6777b538SAndroid Build Coastguard Worker                 testing::ElementsAre(1, 2, 3, 4, 5));
72*6777b538SAndroid Build Coastguard Worker   }
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker 
TEST(STLUtilTest,STLSetDifference)75*6777b538SAndroid Build Coastguard Worker TEST(STLUtilTest, STLSetDifference) {
76*6777b538SAndroid Build Coastguard Worker   std::set<int> a1;
77*6777b538SAndroid Build Coastguard Worker   a1.insert(1);
78*6777b538SAndroid Build Coastguard Worker   a1.insert(2);
79*6777b538SAndroid Build Coastguard Worker   a1.insert(3);
80*6777b538SAndroid Build Coastguard Worker   a1.insert(4);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   std::set<int> a2;
83*6777b538SAndroid Build Coastguard Worker   a2.insert(3);
84*6777b538SAndroid Build Coastguard Worker   a2.insert(4);
85*6777b538SAndroid Build Coastguard Worker   a2.insert(5);
86*6777b538SAndroid Build Coastguard Worker   a2.insert(6);
87*6777b538SAndroid Build Coastguard Worker   a2.insert(7);
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker   {
90*6777b538SAndroid Build Coastguard Worker     std::set<int> difference;
91*6777b538SAndroid Build Coastguard Worker     difference.insert(1);
92*6777b538SAndroid Build Coastguard Worker     difference.insert(2);
93*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a1, a2));
94*6777b538SAndroid Build Coastguard Worker   }
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   {
97*6777b538SAndroid Build Coastguard Worker     std::set<int> difference;
98*6777b538SAndroid Build Coastguard Worker     difference.insert(5);
99*6777b538SAndroid Build Coastguard Worker     difference.insert(6);
100*6777b538SAndroid Build Coastguard Worker     difference.insert(7);
101*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a2, a1));
102*6777b538SAndroid Build Coastguard Worker   }
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   {
105*6777b538SAndroid Build Coastguard Worker     std::vector<int> difference;
106*6777b538SAndroid Build Coastguard Worker     difference.push_back(1);
107*6777b538SAndroid Build Coastguard Worker     difference.push_back(2);
108*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a1, a2));
109*6777b538SAndroid Build Coastguard Worker   }
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   {
112*6777b538SAndroid Build Coastguard Worker     std::vector<int> difference;
113*6777b538SAndroid Build Coastguard Worker     difference.push_back(5);
114*6777b538SAndroid Build Coastguard Worker     difference.push_back(6);
115*6777b538SAndroid Build Coastguard Worker     difference.push_back(7);
116*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a2, a1));
117*6777b538SAndroid Build Coastguard Worker   }
118*6777b538SAndroid Build Coastguard Worker }
119*6777b538SAndroid Build Coastguard Worker 
TEST(STLUtilTest,STLSetUnion)120*6777b538SAndroid Build Coastguard Worker TEST(STLUtilTest, STLSetUnion) {
121*6777b538SAndroid Build Coastguard Worker   std::set<int> a1;
122*6777b538SAndroid Build Coastguard Worker   a1.insert(1);
123*6777b538SAndroid Build Coastguard Worker   a1.insert(2);
124*6777b538SAndroid Build Coastguard Worker   a1.insert(3);
125*6777b538SAndroid Build Coastguard Worker   a1.insert(4);
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   std::set<int> a2;
128*6777b538SAndroid Build Coastguard Worker   a2.insert(3);
129*6777b538SAndroid Build Coastguard Worker   a2.insert(4);
130*6777b538SAndroid Build Coastguard Worker   a2.insert(5);
131*6777b538SAndroid Build Coastguard Worker   a2.insert(6);
132*6777b538SAndroid Build Coastguard Worker   a2.insert(7);
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   {
135*6777b538SAndroid Build Coastguard Worker     std::set<int> result;
136*6777b538SAndroid Build Coastguard Worker     result.insert(1);
137*6777b538SAndroid Build Coastguard Worker     result.insert(2);
138*6777b538SAndroid Build Coastguard Worker     result.insert(3);
139*6777b538SAndroid Build Coastguard Worker     result.insert(4);
140*6777b538SAndroid Build Coastguard Worker     result.insert(5);
141*6777b538SAndroid Build Coastguard Worker     result.insert(6);
142*6777b538SAndroid Build Coastguard Worker     result.insert(7);
143*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetUnion<std::set<int> >(a1, a2));
144*6777b538SAndroid Build Coastguard Worker   }
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker   {
147*6777b538SAndroid Build Coastguard Worker     std::set<int> result;
148*6777b538SAndroid Build Coastguard Worker     result.insert(1);
149*6777b538SAndroid Build Coastguard Worker     result.insert(2);
150*6777b538SAndroid Build Coastguard Worker     result.insert(3);
151*6777b538SAndroid Build Coastguard Worker     result.insert(4);
152*6777b538SAndroid Build Coastguard Worker     result.insert(5);
153*6777b538SAndroid Build Coastguard Worker     result.insert(6);
154*6777b538SAndroid Build Coastguard Worker     result.insert(7);
155*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetUnion<std::set<int> >(a2, a1));
156*6777b538SAndroid Build Coastguard Worker   }
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker   {
159*6777b538SAndroid Build Coastguard Worker     std::vector<int> result;
160*6777b538SAndroid Build Coastguard Worker     result.push_back(1);
161*6777b538SAndroid Build Coastguard Worker     result.push_back(2);
162*6777b538SAndroid Build Coastguard Worker     result.push_back(3);
163*6777b538SAndroid Build Coastguard Worker     result.push_back(4);
164*6777b538SAndroid Build Coastguard Worker     result.push_back(5);
165*6777b538SAndroid Build Coastguard Worker     result.push_back(6);
166*6777b538SAndroid Build Coastguard Worker     result.push_back(7);
167*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a1, a2));
168*6777b538SAndroid Build Coastguard Worker   }
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker   {
171*6777b538SAndroid Build Coastguard Worker     std::vector<int> result;
172*6777b538SAndroid Build Coastguard Worker     result.push_back(1);
173*6777b538SAndroid Build Coastguard Worker     result.push_back(2);
174*6777b538SAndroid Build Coastguard Worker     result.push_back(3);
175*6777b538SAndroid Build Coastguard Worker     result.push_back(4);
176*6777b538SAndroid Build Coastguard Worker     result.push_back(5);
177*6777b538SAndroid Build Coastguard Worker     result.push_back(6);
178*6777b538SAndroid Build Coastguard Worker     result.push_back(7);
179*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a2, a1));
180*6777b538SAndroid Build Coastguard Worker   }
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker 
TEST(STLUtilTest,STLSetIntersection)183*6777b538SAndroid Build Coastguard Worker TEST(STLUtilTest, STLSetIntersection) {
184*6777b538SAndroid Build Coastguard Worker   std::set<int> a1;
185*6777b538SAndroid Build Coastguard Worker   a1.insert(1);
186*6777b538SAndroid Build Coastguard Worker   a1.insert(2);
187*6777b538SAndroid Build Coastguard Worker   a1.insert(3);
188*6777b538SAndroid Build Coastguard Worker   a1.insert(4);
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker   std::set<int> a2;
191*6777b538SAndroid Build Coastguard Worker   a2.insert(3);
192*6777b538SAndroid Build Coastguard Worker   a2.insert(4);
193*6777b538SAndroid Build Coastguard Worker   a2.insert(5);
194*6777b538SAndroid Build Coastguard Worker   a2.insert(6);
195*6777b538SAndroid Build Coastguard Worker   a2.insert(7);
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   {
198*6777b538SAndroid Build Coastguard Worker     std::set<int> result;
199*6777b538SAndroid Build Coastguard Worker     result.insert(3);
200*6777b538SAndroid Build Coastguard Worker     result.insert(4);
201*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a1, a2));
202*6777b538SAndroid Build Coastguard Worker   }
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   {
205*6777b538SAndroid Build Coastguard Worker     std::set<int> result;
206*6777b538SAndroid Build Coastguard Worker     result.insert(3);
207*6777b538SAndroid Build Coastguard Worker     result.insert(4);
208*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a2, a1));
209*6777b538SAndroid Build Coastguard Worker   }
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker   {
212*6777b538SAndroid Build Coastguard Worker     std::vector<int> result;
213*6777b538SAndroid Build Coastguard Worker     result.push_back(3);
214*6777b538SAndroid Build Coastguard Worker     result.push_back(4);
215*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a1, a2));
216*6777b538SAndroid Build Coastguard Worker   }
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker   {
219*6777b538SAndroid Build Coastguard Worker     std::vector<int> result;
220*6777b538SAndroid Build Coastguard Worker     result.push_back(3);
221*6777b538SAndroid Build Coastguard Worker     result.push_back(4);
222*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a2, a1));
223*6777b538SAndroid Build Coastguard Worker   }
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker 
TEST(Erase,IsNotIn)226*6777b538SAndroid Build Coastguard Worker TEST(Erase, IsNotIn) {
227*6777b538SAndroid Build Coastguard Worker   // Should keep both '2' but only one '4', like std::set_intersection.
228*6777b538SAndroid Build Coastguard Worker   std::vector<int> lhs = {0, 2, 2, 4, 4, 4, 6, 8, 10};
229*6777b538SAndroid Build Coastguard Worker   std::vector<int> rhs = {1, 2, 2, 4, 5, 6, 7};
230*6777b538SAndroid Build Coastguard Worker   std::vector<int> expected = {2, 2, 4, 6};
231*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(5u, std::erase_if(lhs, IsNotIn<std::vector<int>>(rhs)));
232*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(expected, lhs);
233*6777b538SAndroid Build Coastguard Worker }
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker }  // namespace
236*6777b538SAndroid Build Coastguard Worker }  // namespace base
237