xref: /aosp_15_r20/external/cronet/base/traits_bag_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 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/traits_bag.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker namespace base {
12*6777b538SAndroid Build Coastguard Worker namespace trait_helpers {
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker struct ExampleTrait {};
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker struct ExampleTrait2 {};
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker enum class EnumTraitA { A, B, C };
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker enum class EnumTraitB { ONE, TWO };
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker struct TestTraits {
24*6777b538SAndroid Build Coastguard Worker   // List of traits that are valid inputs for the constructor below.
25*6777b538SAndroid Build Coastguard Worker   struct ValidTrait {
26*6777b538SAndroid Build Coastguard Worker     ValidTrait(ExampleTrait);
27*6777b538SAndroid Build Coastguard Worker     ValidTrait(EnumTraitA);
28*6777b538SAndroid Build Coastguard Worker     ValidTrait(EnumTraitB);
29*6777b538SAndroid Build Coastguard Worker   };
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   template <class... ArgTypes>
32*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>
TestTraitsbase::trait_helpers::__anonffaff87e0111::TestTraits33*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits(ArgTypes... args)
34*6777b538SAndroid Build Coastguard Worker       : has_example_trait(trait_helpers::HasTrait<ExampleTrait, ArgTypes...>()),
35*6777b538SAndroid Build Coastguard Worker         enum_trait_a(
36*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<EnumTraitA, EnumTraitA::A>(args...)),
37*6777b538SAndroid Build Coastguard Worker         enum_trait_b(
38*6777b538SAndroid Build Coastguard Worker             trait_helpers::GetEnum<EnumTraitB, EnumTraitB::ONE>(args...)) {}
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   const bool has_example_trait;
41*6777b538SAndroid Build Coastguard Worker   const EnumTraitA enum_trait_a;
42*6777b538SAndroid Build Coastguard Worker   const EnumTraitB enum_trait_b;
43*6777b538SAndroid Build Coastguard Worker };
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker // Like TestTraits, except ExampleTrait is filtered away.
46*6777b538SAndroid Build Coastguard Worker struct FilteredTestTraits : public TestTraits {
47*6777b538SAndroid Build Coastguard Worker   template <class... ArgTypes>
48*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>
FilteredTestTraitsbase::trait_helpers::__anonffaff87e0111::FilteredTestTraits49*6777b538SAndroid Build Coastguard Worker   constexpr FilteredTestTraits(ArgTypes... args)
50*6777b538SAndroid Build Coastguard Worker       : TestTraits(Exclude<ExampleTrait>::Filter(args)...) {}
51*6777b538SAndroid Build Coastguard Worker };
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker struct RequiredEnumTestTraits {
54*6777b538SAndroid Build Coastguard Worker   // List of traits that are required inputs for the constructor below.
55*6777b538SAndroid Build Coastguard Worker   struct ValidTrait {
56*6777b538SAndroid Build Coastguard Worker     ValidTrait(EnumTraitA);
57*6777b538SAndroid Build Coastguard Worker   };
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // We require EnumTraitA to be specified.
60*6777b538SAndroid Build Coastguard Worker   template <class... ArgTypes>
61*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>
RequiredEnumTestTraitsbase::trait_helpers::__anonffaff87e0111::RequiredEnumTestTraits62*6777b538SAndroid Build Coastguard Worker   constexpr RequiredEnumTestTraits(ArgTypes... args)
63*6777b538SAndroid Build Coastguard Worker       : enum_trait_a(trait_helpers::GetEnum<EnumTraitA>(args...)) {}
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   const EnumTraitA enum_trait_a;
66*6777b538SAndroid Build Coastguard Worker };
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker struct OptionalEnumTestTraits {
69*6777b538SAndroid Build Coastguard Worker   // List of traits that are optional inputs for the constructor below.
70*6777b538SAndroid Build Coastguard Worker   struct ValidTrait {
71*6777b538SAndroid Build Coastguard Worker     ValidTrait(EnumTraitA);
72*6777b538SAndroid Build Coastguard Worker   };
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   // EnumTraitA can optionally be specified.
75*6777b538SAndroid Build Coastguard Worker   template <class... ArgTypes>
76*6777b538SAndroid Build Coastguard Worker     requires trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>
OptionalEnumTestTraitsbase::trait_helpers::__anonffaff87e0111::OptionalEnumTestTraits77*6777b538SAndroid Build Coastguard Worker   constexpr OptionalEnumTestTraits(ArgTypes... args)
78*6777b538SAndroid Build Coastguard Worker       : enum_trait_a(trait_helpers::GetOptionalEnum<EnumTraitA>(args...)) {}
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   const std::optional<EnumTraitA> enum_trait_a;
81*6777b538SAndroid Build Coastguard Worker };
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker }  // namespace
84*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,DefaultConstructor)85*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, DefaultConstructor) {
86*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits trait_test_class;
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(trait_test_class.has_example_trait);
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,HasTrait)91*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, HasTrait) {
92*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits with_trait(ExampleTrait{});
93*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits without_trait;
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(with_trait.has_example_trait);
96*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(without_trait.has_example_trait);
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,GetEnumWithDefault)99*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, GetEnumWithDefault) {
100*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits defaults;
101*6777b538SAndroid Build Coastguard Worker 
102*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(defaults.enum_trait_a, EnumTraitA::A);
103*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(defaults.enum_trait_b, EnumTraitB::ONE);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits a(EnumTraitA::A);
106*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits b(EnumTraitA::B);
107*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits c(EnumTraitA::C);
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a.enum_trait_a, EnumTraitA::A);
110*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a.enum_trait_b, EnumTraitB::ONE);
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b.enum_trait_a, EnumTraitA::B);
113*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b.enum_trait_b, EnumTraitB::ONE);
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c.enum_trait_a, EnumTraitA::C);
116*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c.enum_trait_b, EnumTraitB::ONE);
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits a_one(EnumTraitA::A, EnumTraitB::ONE);
119*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits b_one(EnumTraitA::B, EnumTraitB::ONE);
120*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits c_one(EnumTraitA::C, EnumTraitB::ONE);
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a_one.enum_trait_a, EnumTraitA::A);
123*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a_one.enum_trait_b, EnumTraitB::ONE);
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b_one.enum_trait_a, EnumTraitA::B);
126*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b_one.enum_trait_b, EnumTraitB::ONE);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c_one.enum_trait_a, EnumTraitA::C);
129*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c_one.enum_trait_b, EnumTraitB::ONE);
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits a_two(EnumTraitA::A, EnumTraitB::TWO);
132*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits b_two(EnumTraitA::B, EnumTraitB::TWO);
133*6777b538SAndroid Build Coastguard Worker   constexpr TestTraits c_two(EnumTraitA::C, EnumTraitB::TWO);
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a_two.enum_trait_a, EnumTraitA::A);
136*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a_two.enum_trait_b, EnumTraitB::TWO);
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b_two.enum_trait_a, EnumTraitA::B);
139*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b_two.enum_trait_b, EnumTraitB::TWO);
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c_two.enum_trait_a, EnumTraitA::C);
142*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c_two.enum_trait_b, EnumTraitB::TWO);
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,RequiredEnum)145*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, RequiredEnum) {
146*6777b538SAndroid Build Coastguard Worker   constexpr RequiredEnumTestTraits a(EnumTraitA::A);
147*6777b538SAndroid Build Coastguard Worker   constexpr RequiredEnumTestTraits b(EnumTraitA::B);
148*6777b538SAndroid Build Coastguard Worker   constexpr RequiredEnumTestTraits c(EnumTraitA::C);
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(a.enum_trait_a, EnumTraitA::A);
151*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(b.enum_trait_a, EnumTraitA::B);
152*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c.enum_trait_a, EnumTraitA::C);
153*6777b538SAndroid Build Coastguard Worker }
154*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,OptionalEnum)155*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, OptionalEnum) {
156*6777b538SAndroid Build Coastguard Worker   constexpr OptionalEnumTestTraits not_set;
157*6777b538SAndroid Build Coastguard Worker   constexpr OptionalEnumTestTraits set(EnumTraitA::B);
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(not_set.enum_trait_a.has_value());
160*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(set.enum_trait_a.has_value());
161*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(*set.enum_trait_a, EnumTraitA::B);
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,ValidTraitInheritance)164*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, ValidTraitInheritance) {
165*6777b538SAndroid Build Coastguard Worker   struct ValidTraitsA {
166*6777b538SAndroid Build Coastguard Worker     ValidTraitsA(EnumTraitA);
167*6777b538SAndroid Build Coastguard Worker   };
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker   struct ValidTraitsB {
170*6777b538SAndroid Build Coastguard Worker     ValidTraitsB(ValidTraitsA);
171*6777b538SAndroid Build Coastguard Worker     ValidTraitsB(EnumTraitB);
172*6777b538SAndroid Build Coastguard Worker   };
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   static_assert(AreValidTraits<ValidTraitsA, EnumTraitA>, "");
175*6777b538SAndroid Build Coastguard Worker   static_assert(AreValidTraits<ValidTraitsB, EnumTraitA, EnumTraitB>, "");
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,Filtering)178*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, Filtering) {
179*6777b538SAndroid Build Coastguard Worker   using Predicate = Exclude<ExampleTrait, EnumTraitA>;
180*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<ExampleTrait2,
181*6777b538SAndroid Build Coastguard Worker                                decltype(Predicate::Filter(ExampleTrait2{}))>,
182*6777b538SAndroid Build Coastguard Worker                 "ExampleTrait2 should not be filtered");
183*6777b538SAndroid Build Coastguard Worker 
184*6777b538SAndroid Build Coastguard Worker   static_assert(
185*6777b538SAndroid Build Coastguard Worker       std::is_same_v<EmptyTrait, decltype(Predicate::Filter(ExampleTrait{}))>,
186*6777b538SAndroid Build Coastguard Worker       "ExampleTrait should be filtered");
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker   static_assert(
189*6777b538SAndroid Build Coastguard Worker       std::is_same_v<EmptyTrait, decltype(Predicate::Filter(EnumTraitA::A))>,
190*6777b538SAndroid Build Coastguard Worker       "EnumTraitA should be filtered");
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   static_assert(
193*6777b538SAndroid Build Coastguard Worker       std::is_same_v<EnumTraitB, decltype(Predicate::Filter(EnumTraitB::TWO))>,
194*6777b538SAndroid Build Coastguard Worker       "EnumTraitB should not be filtered");
195*6777b538SAndroid Build Coastguard Worker 
196*6777b538SAndroid Build Coastguard Worker   static_assert(
197*6777b538SAndroid Build Coastguard Worker       std::is_same_v<EmptyTrait, decltype(Predicate::Filter(EmptyTrait{}))>,
198*6777b538SAndroid Build Coastguard Worker       "EmptyTrait should not be filtered");
199*6777b538SAndroid Build Coastguard Worker }
200*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,FilteredTestTraits)201*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, FilteredTestTraits) {
202*6777b538SAndroid Build Coastguard Worker   FilteredTestTraits filtered(ExampleTrait(), EnumTraitA::C, EnumTraitB::TWO);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   // ExampleTrait should have been filtered away.
205*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(filtered.has_example_trait);
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker   // The other traits should have been set however.
208*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(filtered.enum_trait_a, EnumTraitA::C);
209*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(filtered.enum_trait_b, EnumTraitB::TWO);
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker 
TEST(TraitsBagTest,EmptyTraitIsValid)212*6777b538SAndroid Build Coastguard Worker TEST(TraitsBagTest, EmptyTraitIsValid) {
213*6777b538SAndroid Build Coastguard Worker   static_assert(IsValidTrait<TestTraits::ValidTrait, EmptyTrait>, "");
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker }  // namespace trait_helpers
217*6777b538SAndroid Build Coastguard Worker }  // namespace base
218