blob: 63f5846491f54048452948be6ad0556c8f100716 [file] [log] [blame]
Alex Clarke3cf9cd8e2019-01-08 08:40:001// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/traits_bag.h"
6
7#include "testing/gmock/include/gmock/gmock.h"
8
9namespace base {
10namespace trait_helpers {
11namespace {
12
13struct ExampleTrait {};
14
15enum class EnumTraitA { A, B, C };
16
17enum class EnumTraitB { ONE, TWO };
18
19struct TestTraits {
20 // List of traits that are valid inputs for the constructor below.
21 struct ValidTrait {
22 ValidTrait(ExampleTrait);
23 ValidTrait(EnumTraitA);
24 ValidTrait(EnumTraitB);
25 };
26
27 template <class... ArgTypes,
28 class CheckArgumentsAreValid = std::enable_if_t<
29 trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value>>
30 TestTraits(ArgTypes... args)
31 : has_example_trait(trait_helpers::HasTrait<ExampleTrait>(args...)),
32 enum_trait_a(
33 trait_helpers::GetEnum<EnumTraitA, EnumTraitA::A>(args...)),
34 enum_trait_b(
35 trait_helpers::GetEnum<EnumTraitB, EnumTraitB::ONE>(args...)) {}
36
37 const bool has_example_trait;
38 const EnumTraitA enum_trait_a;
39 const EnumTraitB enum_trait_b;
40};
41
42struct RequiredEnumTestTraits {
43 // List of traits that are valid inputs for the constructor below.
44 struct ValidTrait {
45 ValidTrait(EnumTraitA);
46 };
47
48 // We require EnumTraitA to be specified.
49 template <class... ArgTypes,
50 class CheckArgumentsAreValid = std::enable_if_t<
51 trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value>>
52 RequiredEnumTestTraits(ArgTypes... args)
53 : enum_trait_a(trait_helpers::GetEnum<EnumTraitA>(args...)) {}
54
55 const EnumTraitA enum_trait_a;
56};
57} // namespace
58
59TEST(TraitsBagTest, DefaultConstructor) {
60 TestTraits trait_test_class;
61
62 EXPECT_FALSE(trait_test_class.has_example_trait);
63}
64
65TEST(TraitsBagTest, HasTrait) {
66 TestTraits with_trait(ExampleTrait{});
67 TestTraits without_trait;
68
69 EXPECT_TRUE(with_trait.has_example_trait);
70 EXPECT_FALSE(without_trait.has_example_trait);
71}
72
73TEST(TraitsBagTest, GetEnumWithDefault) {
74 TestTraits defaults;
75
76 EXPECT_EQ(defaults.enum_trait_a, EnumTraitA::A);
77 EXPECT_EQ(defaults.enum_trait_b, EnumTraitB::ONE);
78
79 TestTraits a(EnumTraitA::A);
80 TestTraits b(EnumTraitA::B);
81 TestTraits c(EnumTraitA::C);
82
83 EXPECT_EQ(a.enum_trait_a, EnumTraitA::A);
84 EXPECT_EQ(a.enum_trait_b, EnumTraitB::ONE);
85
86 EXPECT_EQ(b.enum_trait_a, EnumTraitA::B);
87 EXPECT_EQ(b.enum_trait_b, EnumTraitB::ONE);
88
89 EXPECT_EQ(c.enum_trait_a, EnumTraitA::C);
90 EXPECT_EQ(c.enum_trait_b, EnumTraitB::ONE);
91
92 TestTraits a_one(EnumTraitA::A, EnumTraitB::ONE);
93 TestTraits b_one(EnumTraitA::B, EnumTraitB::ONE);
94 TestTraits c_one(EnumTraitA::C, EnumTraitB::ONE);
95
96 EXPECT_EQ(a_one.enum_trait_a, EnumTraitA::A);
97 EXPECT_EQ(a_one.enum_trait_b, EnumTraitB::ONE);
98
99 EXPECT_EQ(b_one.enum_trait_a, EnumTraitA::B);
100 EXPECT_EQ(b_one.enum_trait_b, EnumTraitB::ONE);
101
102 EXPECT_EQ(c_one.enum_trait_a, EnumTraitA::C);
103 EXPECT_EQ(c_one.enum_trait_b, EnumTraitB::ONE);
104
105 TestTraits a_two(EnumTraitA::A, EnumTraitB::TWO);
106 TestTraits b_two(EnumTraitA::B, EnumTraitB::TWO);
107 TestTraits c_two(EnumTraitA::C, EnumTraitB::TWO);
108
109 EXPECT_EQ(a_two.enum_trait_a, EnumTraitA::A);
110 EXPECT_EQ(a_two.enum_trait_b, EnumTraitB::TWO);
111
112 EXPECT_EQ(b_two.enum_trait_a, EnumTraitA::B);
113 EXPECT_EQ(b_two.enum_trait_b, EnumTraitB::TWO);
114
115 EXPECT_EQ(c_two.enum_trait_a, EnumTraitA::C);
116 EXPECT_EQ(c_two.enum_trait_b, EnumTraitB::TWO);
117}
118
119TEST(TraitsBagTest, RequiredEnum) {
120 RequiredEnumTestTraits a(EnumTraitA::A);
121 RequiredEnumTestTraits b(EnumTraitA::B);
122 RequiredEnumTestTraits c(EnumTraitA::C);
123
124 EXPECT_EQ(a.enum_trait_a, EnumTraitA::A);
125 EXPECT_EQ(b.enum_trait_a, EnumTraitA::B);
126 EXPECT_EQ(c.enum_trait_a, EnumTraitA::C);
127}
128
Alex Clarkef1415b52019-01-08 15:02:31129TEST(TraitsBagTest, ValidTraitInheritance) {
130 struct ValidTraitsA {
131 ValidTraitsA(EnumTraitA);
132 };
133
134 struct ValidTraitsB {
135 ValidTraitsB(ValidTraitsA);
136 ValidTraitsB(EnumTraitB);
137 };
138
139 static_assert(AreValidTraits<ValidTraitsA, EnumTraitA>(), "");
140 static_assert(AreValidTraits<ValidTraitsB, EnumTraitA, EnumTraitB>(), "");
141}
142
Alex Clarke3cf9cd8e2019-01-08 08:40:00143} // namespace trait_helpers
144} // namespace base