xref: /aosp_15_r20/external/cronet/base/containers/flat_set_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 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/flat_set.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/test/move_only_int.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker // A flat_set is basically a interface to flat_tree. So several basic
15*6777b538SAndroid Build Coastguard Worker // operations are tested to make sure things are set up properly, but the bulk
16*6777b538SAndroid Build Coastguard Worker // of the tests are in flat_tree_unittests.cc.
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker class ImplicitInt {
25*6777b538SAndroid Build Coastguard Worker  public:
26*6777b538SAndroid Build Coastguard Worker   // NOLINTNEXTLINE(google-explicit-constructor)
ImplicitInt(int data)27*6777b538SAndroid Build Coastguard Worker   ImplicitInt(int data) : data_(data) {}
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker  private:
operator <(const ImplicitInt & lhs,const ImplicitInt & rhs)30*6777b538SAndroid Build Coastguard Worker   friend bool operator<(const ImplicitInt& lhs, const ImplicitInt& rhs) {
31*6777b538SAndroid Build Coastguard Worker     return lhs.data_ < rhs.data_;
32*6777b538SAndroid Build Coastguard Worker   }
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   int data_;
35*6777b538SAndroid Build Coastguard Worker };
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker }  // namespace
38*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,IncompleteType)39*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, IncompleteType) {
40*6777b538SAndroid Build Coastguard Worker   struct A {
41*6777b538SAndroid Build Coastguard Worker     using Set = flat_set<A>;
42*6777b538SAndroid Build Coastguard Worker     int data;
43*6777b538SAndroid Build Coastguard Worker     Set set_with_incomplete_type;
44*6777b538SAndroid Build Coastguard Worker     Set::iterator it;
45*6777b538SAndroid Build Coastguard Worker     Set::const_iterator cit;
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker     // We do not declare operator< because clang complains that it's unused.
48*6777b538SAndroid Build Coastguard Worker   };
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   A a;
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,RangeConstructor)53*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, RangeConstructor) {
54*6777b538SAndroid Build Coastguard Worker   flat_set<int>::value_type input_vals[] = {1, 1, 1, 2, 2, 2, 3, 3, 3};
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   flat_set<int> cont(std::begin(input_vals), std::end(input_vals));
57*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(cont, ElementsAre(1, 2, 3));
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,MoveConstructor)60*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, MoveConstructor) {
61*6777b538SAndroid Build Coastguard Worker   int input_range[] = {1, 2, 3, 4};
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   flat_set<MoveOnlyInt> original(std::begin(input_range),
64*6777b538SAndroid Build Coastguard Worker                                  std::end(input_range));
65*6777b538SAndroid Build Coastguard Worker   flat_set<MoveOnlyInt> moved(std::move(original));
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
68*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
69*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
70*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,InitializerListConstructor)73*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, InitializerListConstructor) {
74*6777b538SAndroid Build Coastguard Worker   flat_set<int> cont({1, 2, 3, 4, 5, 6, 10, 8});
75*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,InsertFindSize)78*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, InsertFindSize) {
79*6777b538SAndroid Build Coastguard Worker   base::flat_set<int> s;
80*6777b538SAndroid Build Coastguard Worker   s.insert(1);
81*6777b538SAndroid Build Coastguard Worker   s.insert(1);
82*6777b538SAndroid Build Coastguard Worker   s.insert(2);
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2u, s.size());
85*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(1, *s.find(1));
86*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2, *s.find(2));
87*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.end(), s.find(7));
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,CopySwap)90*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, CopySwap) {
91*6777b538SAndroid Build Coastguard Worker   base::flat_set<int> original;
92*6777b538SAndroid Build Coastguard Worker   original.insert(1);
93*6777b538SAndroid Build Coastguard Worker   original.insert(2);
94*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(original, ElementsAre(1, 2));
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   base::flat_set<int> copy(original);
97*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(copy, ElementsAre(1, 2));
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   copy.erase(copy.begin());
100*6777b538SAndroid Build Coastguard Worker   copy.insert(10);
101*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(copy, ElementsAre(2, 10));
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   original.swap(copy);
104*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(original, ElementsAre(2, 10));
105*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(copy, ElementsAre(1, 2));
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,UsingTransparentCompare)108*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, UsingTransparentCompare) {
109*6777b538SAndroid Build Coastguard Worker   using ExplicitInt = base::MoveOnlyInt;
110*6777b538SAndroid Build Coastguard Worker   base::flat_set<ExplicitInt> s;
111*6777b538SAndroid Build Coastguard Worker   const auto& s1 = s;
112*6777b538SAndroid Build Coastguard Worker   int x = 0;
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   // Check if we can use lookup functions without converting to key_type.
115*6777b538SAndroid Build Coastguard Worker   // Correctness is checked in flat_tree tests.
116*6777b538SAndroid Build Coastguard Worker   s.count(x);
117*6777b538SAndroid Build Coastguard Worker   s1.count(x);
118*6777b538SAndroid Build Coastguard Worker   s.find(x);
119*6777b538SAndroid Build Coastguard Worker   s1.find(x);
120*6777b538SAndroid Build Coastguard Worker   s.contains(x);
121*6777b538SAndroid Build Coastguard Worker   s1.contains(x);
122*6777b538SAndroid Build Coastguard Worker   s.equal_range(x);
123*6777b538SAndroid Build Coastguard Worker   s1.equal_range(x);
124*6777b538SAndroid Build Coastguard Worker   s.lower_bound(x);
125*6777b538SAndroid Build Coastguard Worker   s1.lower_bound(x);
126*6777b538SAndroid Build Coastguard Worker   s.upper_bound(x);
127*6777b538SAndroid Build Coastguard Worker   s1.upper_bound(x);
128*6777b538SAndroid Build Coastguard Worker   s.erase(x);
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   // Check if we broke overload resolution.
131*6777b538SAndroid Build Coastguard Worker   s.emplace(0);
132*6777b538SAndroid Build Coastguard Worker   s.emplace(1);
133*6777b538SAndroid Build Coastguard Worker   s.erase(s.begin());
134*6777b538SAndroid Build Coastguard Worker   s.erase(s.cbegin());
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker 
TEST(FlatSet,UsingInitializerList)137*6777b538SAndroid Build Coastguard Worker TEST(FlatSet, UsingInitializerList) {
138*6777b538SAndroid Build Coastguard Worker   base::flat_set<ImplicitInt> s;
139*6777b538SAndroid Build Coastguard Worker   const auto& s1 = s;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   // Check if the calls can be resolved. Correctness is checked in flat_tree
142*6777b538SAndroid Build Coastguard Worker   // tests.
143*6777b538SAndroid Build Coastguard Worker   s.count({1});
144*6777b538SAndroid Build Coastguard Worker   s1.count({2});
145*6777b538SAndroid Build Coastguard Worker   s.find({3});
146*6777b538SAndroid Build Coastguard Worker   s1.find({4});
147*6777b538SAndroid Build Coastguard Worker   s.contains({5});
148*6777b538SAndroid Build Coastguard Worker   s1.contains({6});
149*6777b538SAndroid Build Coastguard Worker   s.equal_range({7});
150*6777b538SAndroid Build Coastguard Worker   s1.equal_range({8});
151*6777b538SAndroid Build Coastguard Worker   s.lower_bound({9});
152*6777b538SAndroid Build Coastguard Worker   s1.lower_bound({10});
153*6777b538SAndroid Build Coastguard Worker   s.upper_bound({11});
154*6777b538SAndroid Build Coastguard Worker   s1.upper_bound({12});
155*6777b538SAndroid Build Coastguard Worker   s.erase({13});
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker }  // namespace base
159