OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_intrinsic_type.cpp
Go to the documentation of this file.
1
2#include "test_common.hpp"
3
5
6using namespace openvpn;
7
8template <typename BaseT>
10
11// clang-format off
12struct Thing1 : IntrinsicType<Thing1, int> { using IntrinsicType<Thing1, int>::IntrinsicType; };
14// clang-format on
15
16inline auto f(const Thing1 t)
17{
18 return Thing1(t.get() * 2);
19}
20
21inline auto f(const Thing2 t)
22{
23 return Thing2(t * 3);
24}
25
26template <typename ThingT>
27auto g(const ThingT &t)
28{
29 return ThingT(t * 4);
30}
31
33{
34 // EXPECT_EQ(f(2), 4); // fails, no match
35 // EXPECT_EQ(f(int(2)), int(4)); // fails, no match
36 EXPECT_EQ(f(Thing1(2)), Thing1(4));
37 EXPECT_EQ(f(Thing2(2)), Thing2(6));
38}
39
40TEST(IntrinsicType, template_inst)
41{
42 EXPECT_EQ(g(2), 8);
43 EXPECT_EQ(g(Thing1(2)), Thing1(8));
44 EXPECT_EQ(g(Thing2(2)), Thing2(8));
45}
46
47inline auto f(const int t)
48{
49 return t;
50}
51
53{
54 EXPECT_EQ(f(2), 2); // now it's fine
55 EXPECT_EQ(f(f(Thing1(1))), Thing1(4));
56 EXPECT_EQ(f(f(Thing2(1))), Thing2(9));
57}
58
60{
61 auto a = Thing1(1);
62
63 a = ~a;
64
65 EXPECT_TRUE(a == Thing1(~1));
66}
67
68TEST(IntrinsicType, logic_or_0)
69{
70 auto a = Thing1(1);
71 Thing1 b(2);
72
73 EXPECT_FALSE(a == b);
74
75 a |= b;
76
77 EXPECT_TRUE(a == Thing1(3));
78 EXPECT_TRUE(b == Thing1(2));
79}
80
81TEST(IntrinsicType, logic_or_1)
82{
83 auto a = Thing1(1);
84 Thing1 b(2);
85 constexpr Thing1 c(3);
86 Thing1 d(4);
87
88 EXPECT_FALSE(a == b);
89
90 EXPECT_TRUE((std::is_same_v<decltype(a | b), Thing1>));
91
92 EXPECT_TRUE((a | b) == Thing1(3));
93 EXPECT_TRUE((a | b | c) == Thing1(3));
94 EXPECT_TRUE((a | b | c | d) == Thing1(7));
95
96 EXPECT_EQ(f(a | b), Thing1(6));
97}
98
99TEST(IntrinsicType, logic_and_0)
100{
101 auto a = Thing1(1);
102 Thing1 b(2);
103
104 EXPECT_FALSE(a == b);
105
106 a &= b;
107
108 EXPECT_TRUE(a == Thing1(0));
109 EXPECT_TRUE(b == Thing1(2));
110}
111
112TEST(IntrinsicType, logic_and_1)
113{
114 Thing1 a(1);
115 Thing1 b(2);
116 constexpr Thing1 c(3);
117
118 EXPECT_FALSE(a == b);
119
120 EXPECT_TRUE((std::is_same_v<decltype(a & b), Thing1>));
121
122 EXPECT_TRUE((a & b) == Thing1(0));
123 EXPECT_TRUE((a & c) == Thing1(1));
124 EXPECT_TRUE((b & c) == Thing1(2));
125
126 EXPECT_EQ(f(a & c), Thing1(2));
127}
128
129TEST(IntrinsicType, math_add_0)
130{
131 auto a = Thing1(1);
132 Thing1 b(2);
133
134 EXPECT_FALSE(a == b);
135
136 a += b;
137
138 EXPECT_TRUE(a == Thing1(3));
139 EXPECT_TRUE(b == Thing1(2));
140}
141
142TEST(IntrinsicType, math_add_1)
143{
144 Thing1 a(1);
145 Thing1 b(2);
146 constexpr Thing1 c(3);
147 Thing1 d(4);
148
149 EXPECT_FALSE(a == b);
150
151 EXPECT_TRUE((std::is_same_v<decltype(a + b), Thing1>));
152
153 EXPECT_EQ((a + b), Thing1(3));
154 EXPECT_EQ((a + b + c), Thing1(6));
155 EXPECT_EQ((a + b + c + d), Thing1(10));
156
157 EXPECT_EQ(f(a + c), Thing1(8));
158}
159
160TEST(IntrinsicType, math_sub_0)
161{
162 auto a = Thing1(1);
163 Thing1 b(2);
164
165 EXPECT_FALSE(a == b);
166
167 a -= b;
168
169 EXPECT_TRUE(a == Thing1(-1));
170 EXPECT_TRUE(b == Thing1(2));
171}
172
173TEST(IntrinsicType, math_sub_1)
174{
175 Thing1 a(1);
176 Thing1 b(2);
177 constexpr Thing1 c(3);
178 Thing1 d(4);
179
180 EXPECT_FALSE(a == b);
181
182 EXPECT_TRUE((std::is_same_v<decltype(a - b), Thing1>));
183
184 EXPECT_EQ(Thing1(a - b), Thing1(-1));
185 EXPECT_TRUE((a - b - c) == Thing1(-4));
186 EXPECT_TRUE((a - b - c - d) == Thing1(-8));
187
188 EXPECT_EQ(f(a - c), Thing1(-4));
189}
190
191TEST(IntrinsicType, math_mul_0)
192{
193 auto a = Thing1(1);
194 Thing1 b(2);
195
196 EXPECT_FALSE(a == b);
197
198 a *= b;
199
200 EXPECT_EQ(a, Thing1(2));
201 EXPECT_EQ(b, Thing1(2));
202}
203
204TEST(IntrinsicType, math_mul_1)
205{
206 Thing1 a(1);
207 Thing1 b(2);
208 constexpr Thing1 c(3);
209 Thing1 d(4);
210
211 EXPECT_FALSE(a == b);
212
213 EXPECT_TRUE((std::is_same_v<decltype(a * b), Thing1>));
214
215 EXPECT_EQ((a * b), Thing1(2));
216 EXPECT_EQ((a * b * c), Thing1(6));
217 EXPECT_EQ((a * b * c * d), Thing1(24));
218
219 EXPECT_EQ(f(a * c), Thing1(6));
220}
221
222TEST(IntrinsicType, math_div_0)
223{
224 auto a = Thing1(4);
225 Thing1 b(2);
226
227 EXPECT_FALSE(a == b);
228
229 a /= b;
230
231 EXPECT_EQ(a, Thing1(2));
232 EXPECT_EQ(b, Thing1(2));
233}
234
235TEST(IntrinsicType, math_div_1)
236{
237 Thing1 a(120);
238 Thing1 b(2);
239 constexpr Thing1 c(3);
240 Thing1 d(4);
241
242 EXPECT_FALSE(a == b);
243
244 EXPECT_TRUE((std::is_same_v<decltype(a / b), Thing1>));
245
246 EXPECT_EQ((a / b), Thing1(60));
247 EXPECT_EQ((a / b / c), Thing1(20));
248 EXPECT_EQ((a / b / c / d), Thing1(5));
249
250 EXPECT_EQ(f(a / c), Thing1(80));
251}
CRTP type designed to allow creation of strong types based on intrinsics.
constexpr value_type get() const noexcept
Getter for the underlying value.
auto f(const Thing1 t)
TEST(IntrinsicType, overload1)
auto g(const ThingT &t)
IntrinsicType< BaseT, int > IntrinsicInt