1 // Copyright 2007, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 // Google Mock - a framework for writing C++ mock classes.
31 //
32 // This file tests some commonly used argument matchers.
33
34 #include <cmath>
35 #include <limits>
36 #include <memory>
37 #include <ostream>
38 #include <string>
39
40 #include "gmock/gmock.h"
41 #include "test/gmock-matchers_test.h"
42 #include "gtest/gtest.h"
43
44 // Silence warning C4244: 'initializing': conversion from 'int' to 'short',
45 // possible loss of data and C4100, unreferenced local parameter
46 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244 4100)
47
48 namespace testing {
49 namespace gmock_matchers_test {
50 namespace {
51
52 typedef ::std::tuple<long, int> Tuple2; // NOLINT
53
54 // Tests that Eq() matches a 2-tuple where the first field == the
55 // second field.
TEST(Eq2Test,MatchesEqualArguments)56 TEST(Eq2Test, MatchesEqualArguments) {
57 Matcher<const Tuple2&> m = Eq();
58 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
59 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
60 }
61
62 // Tests that Eq() describes itself properly.
TEST(Eq2Test,CanDescribeSelf)63 TEST(Eq2Test, CanDescribeSelf) {
64 Matcher<const Tuple2&> m = Eq();
65 EXPECT_EQ("are an equal pair", Describe(m));
66 }
67
68 // Tests that Ge() matches a 2-tuple where the first field >= the
69 // second field.
TEST(Ge2Test,MatchesGreaterThanOrEqualArguments)70 TEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
71 Matcher<const Tuple2&> m = Ge();
72 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
73 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
74 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
75 }
76
77 // Tests that Ge() describes itself properly.
TEST(Ge2Test,CanDescribeSelf)78 TEST(Ge2Test, CanDescribeSelf) {
79 Matcher<const Tuple2&> m = Ge();
80 EXPECT_EQ("are a pair where the first >= the second", Describe(m));
81 }
82
83 // Tests that Gt() matches a 2-tuple where the first field > the
84 // second field.
TEST(Gt2Test,MatchesGreaterThanArguments)85 TEST(Gt2Test, MatchesGreaterThanArguments) {
86 Matcher<const Tuple2&> m = Gt();
87 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
88 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
89 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
90 }
91
92 // Tests that Gt() describes itself properly.
TEST(Gt2Test,CanDescribeSelf)93 TEST(Gt2Test, CanDescribeSelf) {
94 Matcher<const Tuple2&> m = Gt();
95 EXPECT_EQ("are a pair where the first > the second", Describe(m));
96 }
97
98 // Tests that Le() matches a 2-tuple where the first field <= the
99 // second field.
TEST(Le2Test,MatchesLessThanOrEqualArguments)100 TEST(Le2Test, MatchesLessThanOrEqualArguments) {
101 Matcher<const Tuple2&> m = Le();
102 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
103 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
104 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
105 }
106
107 // Tests that Le() describes itself properly.
TEST(Le2Test,CanDescribeSelf)108 TEST(Le2Test, CanDescribeSelf) {
109 Matcher<const Tuple2&> m = Le();
110 EXPECT_EQ("are a pair where the first <= the second", Describe(m));
111 }
112
113 // Tests that Lt() matches a 2-tuple where the first field < the
114 // second field.
TEST(Lt2Test,MatchesLessThanArguments)115 TEST(Lt2Test, MatchesLessThanArguments) {
116 Matcher<const Tuple2&> m = Lt();
117 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
118 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
119 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
120 }
121
122 // Tests that Lt() describes itself properly.
TEST(Lt2Test,CanDescribeSelf)123 TEST(Lt2Test, CanDescribeSelf) {
124 Matcher<const Tuple2&> m = Lt();
125 EXPECT_EQ("are a pair where the first < the second", Describe(m));
126 }
127
128 // Tests that Ne() matches a 2-tuple where the first field != the
129 // second field.
TEST(Ne2Test,MatchesUnequalArguments)130 TEST(Ne2Test, MatchesUnequalArguments) {
131 Matcher<const Tuple2&> m = Ne();
132 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
133 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
134 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
135 }
136
137 // Tests that Ne() describes itself properly.
TEST(Ne2Test,CanDescribeSelf)138 TEST(Ne2Test, CanDescribeSelf) {
139 Matcher<const Tuple2&> m = Ne();
140 EXPECT_EQ("are an unequal pair", Describe(m));
141 }
142
TEST(PairMatchBaseTest,WorksWithMoveOnly)143 TEST(PairMatchBaseTest, WorksWithMoveOnly) {
144 using Pointers = std::tuple<std::unique_ptr<int>, std::unique_ptr<int>>;
145 Matcher<Pointers> matcher = Eq();
146 Pointers pointers;
147 // Tested values don't matter; the point is that matcher does not copy the
148 // matched values.
149 EXPECT_TRUE(matcher.Matches(pointers));
150 }
151
152 // Tests that IsNan() matches a NaN, with float.
TEST(IsNan,FloatMatchesNan)153 TEST(IsNan, FloatMatchesNan) {
154 float quiet_nan = std::numeric_limits<float>::quiet_NaN();
155 float other_nan = std::nanf("1");
156 float real_value = 1.0f;
157
158 Matcher<float> m = IsNan();
159 EXPECT_TRUE(m.Matches(quiet_nan));
160 EXPECT_TRUE(m.Matches(other_nan));
161 EXPECT_FALSE(m.Matches(real_value));
162
163 Matcher<float&> m_ref = IsNan();
164 EXPECT_TRUE(m_ref.Matches(quiet_nan));
165 EXPECT_TRUE(m_ref.Matches(other_nan));
166 EXPECT_FALSE(m_ref.Matches(real_value));
167
168 Matcher<const float&> m_cref = IsNan();
169 EXPECT_TRUE(m_cref.Matches(quiet_nan));
170 EXPECT_TRUE(m_cref.Matches(other_nan));
171 EXPECT_FALSE(m_cref.Matches(real_value));
172 }
173
174 // Tests that IsNan() matches a NaN, with double.
TEST(IsNan,DoubleMatchesNan)175 TEST(IsNan, DoubleMatchesNan) {
176 double quiet_nan = std::numeric_limits<double>::quiet_NaN();
177 double other_nan = std::nan("1");
178 double real_value = 1.0;
179
180 Matcher<double> m = IsNan();
181 EXPECT_TRUE(m.Matches(quiet_nan));
182 EXPECT_TRUE(m.Matches(other_nan));
183 EXPECT_FALSE(m.Matches(real_value));
184
185 Matcher<double&> m_ref = IsNan();
186 EXPECT_TRUE(m_ref.Matches(quiet_nan));
187 EXPECT_TRUE(m_ref.Matches(other_nan));
188 EXPECT_FALSE(m_ref.Matches(real_value));
189
190 Matcher<const double&> m_cref = IsNan();
191 EXPECT_TRUE(m_cref.Matches(quiet_nan));
192 EXPECT_TRUE(m_cref.Matches(other_nan));
193 EXPECT_FALSE(m_cref.Matches(real_value));
194 }
195
196 // Tests that IsNan() matches a NaN, with long double.
TEST(IsNan,LongDoubleMatchesNan)197 TEST(IsNan, LongDoubleMatchesNan) {
198 long double quiet_nan = std::numeric_limits<long double>::quiet_NaN();
199 long double other_nan = std::nan("1");
200 long double real_value = 1.0;
201
202 Matcher<long double> m = IsNan();
203 EXPECT_TRUE(m.Matches(quiet_nan));
204 EXPECT_TRUE(m.Matches(other_nan));
205 EXPECT_FALSE(m.Matches(real_value));
206
207 Matcher<long double&> m_ref = IsNan();
208 EXPECT_TRUE(m_ref.Matches(quiet_nan));
209 EXPECT_TRUE(m_ref.Matches(other_nan));
210 EXPECT_FALSE(m_ref.Matches(real_value));
211
212 Matcher<const long double&> m_cref = IsNan();
213 EXPECT_TRUE(m_cref.Matches(quiet_nan));
214 EXPECT_TRUE(m_cref.Matches(other_nan));
215 EXPECT_FALSE(m_cref.Matches(real_value));
216 }
217
218 // Tests that IsNan() works with Not.
TEST(IsNan,NotMatchesNan)219 TEST(IsNan, NotMatchesNan) {
220 Matcher<float> mf = Not(IsNan());
221 EXPECT_FALSE(mf.Matches(std::numeric_limits<float>::quiet_NaN()));
222 EXPECT_FALSE(mf.Matches(std::nanf("1")));
223 EXPECT_TRUE(mf.Matches(1.0));
224
225 Matcher<double> md = Not(IsNan());
226 EXPECT_FALSE(md.Matches(std::numeric_limits<double>::quiet_NaN()));
227 EXPECT_FALSE(md.Matches(std::nan("1")));
228 EXPECT_TRUE(md.Matches(1.0));
229
230 Matcher<long double> mld = Not(IsNan());
231 EXPECT_FALSE(mld.Matches(std::numeric_limits<long double>::quiet_NaN()));
232 EXPECT_FALSE(mld.Matches(std::nanl("1")));
233 EXPECT_TRUE(mld.Matches(1.0));
234 }
235
236 // Tests that IsNan() can describe itself.
TEST(IsNan,CanDescribeSelf)237 TEST(IsNan, CanDescribeSelf) {
238 Matcher<float> mf = IsNan();
239 EXPECT_EQ("is NaN", Describe(mf));
240
241 Matcher<double> md = IsNan();
242 EXPECT_EQ("is NaN", Describe(md));
243
244 Matcher<long double> mld = IsNan();
245 EXPECT_EQ("is NaN", Describe(mld));
246 }
247
248 // Tests that IsNan() can describe itself with Not.
TEST(IsNan,CanDescribeSelfWithNot)249 TEST(IsNan, CanDescribeSelfWithNot) {
250 Matcher<float> mf = Not(IsNan());
251 EXPECT_EQ("isn't NaN", Describe(mf));
252
253 Matcher<double> md = Not(IsNan());
254 EXPECT_EQ("isn't NaN", Describe(md));
255
256 Matcher<long double> mld = Not(IsNan());
257 EXPECT_EQ("isn't NaN", Describe(mld));
258 }
259
260 // Tests that FloatEq() matches a 2-tuple where
261 // FloatEq(first field) matches the second field.
TEST(FloatEq2Test,MatchesEqualArguments)262 TEST(FloatEq2Test, MatchesEqualArguments) {
263 typedef ::std::tuple<float, float> Tpl;
264 Matcher<const Tpl&> m = FloatEq();
265 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
266 EXPECT_TRUE(m.Matches(Tpl(0.3f, 0.1f + 0.1f + 0.1f)));
267 EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));
268 }
269
270 // Tests that FloatEq() describes itself properly.
TEST(FloatEq2Test,CanDescribeSelf)271 TEST(FloatEq2Test, CanDescribeSelf) {
272 Matcher<const ::std::tuple<float, float>&> m = FloatEq();
273 EXPECT_EQ("are an almost-equal pair", Describe(m));
274 }
275
276 // Tests that NanSensitiveFloatEq() matches a 2-tuple where
277 // NanSensitiveFloatEq(first field) matches the second field.
TEST(NanSensitiveFloatEqTest,MatchesEqualArgumentsWithNaN)278 TEST(NanSensitiveFloatEqTest, MatchesEqualArgumentsWithNaN) {
279 typedef ::std::tuple<float, float> Tpl;
280 Matcher<const Tpl&> m = NanSensitiveFloatEq();
281 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
282 EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(),
283 std::numeric_limits<float>::quiet_NaN())));
284 EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));
285 EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<float>::quiet_NaN())));
286 EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(), 1.0f)));
287 }
288
289 // Tests that NanSensitiveFloatEq() describes itself properly.
TEST(NanSensitiveFloatEqTest,CanDescribeSelfWithNaNs)290 TEST(NanSensitiveFloatEqTest, CanDescribeSelfWithNaNs) {
291 Matcher<const ::std::tuple<float, float>&> m = NanSensitiveFloatEq();
292 EXPECT_EQ("are an almost-equal pair", Describe(m));
293 }
294
295 // Tests that DoubleEq() matches a 2-tuple where
296 // DoubleEq(first field) matches the second field.
TEST(DoubleEq2Test,MatchesEqualArguments)297 TEST(DoubleEq2Test, MatchesEqualArguments) {
298 typedef ::std::tuple<double, double> Tpl;
299 Matcher<const Tpl&> m = DoubleEq();
300 EXPECT_TRUE(m.Matches(Tpl(1.0, 1.0)));
301 EXPECT_TRUE(m.Matches(Tpl(0.3, 0.1 + 0.1 + 0.1)));
302 EXPECT_FALSE(m.Matches(Tpl(1.1, 1.0)));
303 }
304
305 // Tests that DoubleEq() describes itself properly.
TEST(DoubleEq2Test,CanDescribeSelf)306 TEST(DoubleEq2Test, CanDescribeSelf) {
307 Matcher<const ::std::tuple<double, double>&> m = DoubleEq();
308 EXPECT_EQ("are an almost-equal pair", Describe(m));
309 }
310
311 // Tests that NanSensitiveDoubleEq() matches a 2-tuple where
312 // NanSensitiveDoubleEq(first field) matches the second field.
TEST(NanSensitiveDoubleEqTest,MatchesEqualArgumentsWithNaN)313 TEST(NanSensitiveDoubleEqTest, MatchesEqualArgumentsWithNaN) {
314 typedef ::std::tuple<double, double> Tpl;
315 Matcher<const Tpl&> m = NanSensitiveDoubleEq();
316 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
317 EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(),
318 std::numeric_limits<double>::quiet_NaN())));
319 EXPECT_FALSE(m.Matches(Tpl(1.1f, 1.0f)));
320 EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<double>::quiet_NaN())));
321 EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(), 1.0f)));
322 }
323
324 // Tests that DoubleEq() describes itself properly.
TEST(NanSensitiveDoubleEqTest,CanDescribeSelfWithNaNs)325 TEST(NanSensitiveDoubleEqTest, CanDescribeSelfWithNaNs) {
326 Matcher<const ::std::tuple<double, double>&> m = NanSensitiveDoubleEq();
327 EXPECT_EQ("are an almost-equal pair", Describe(m));
328 }
329
330 // Tests that FloatEq() matches a 2-tuple where
331 // FloatNear(first field, max_abs_error) matches the second field.
TEST(FloatNear2Test,MatchesEqualArguments)332 TEST(FloatNear2Test, MatchesEqualArguments) {
333 typedef ::std::tuple<float, float> Tpl;
334 Matcher<const Tpl&> m = FloatNear(0.5f);
335 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
336 EXPECT_TRUE(m.Matches(Tpl(1.3f, 1.0f)));
337 EXPECT_FALSE(m.Matches(Tpl(1.8f, 1.0f)));
338 }
339
340 // Tests that FloatNear() describes itself properly.
TEST(FloatNear2Test,CanDescribeSelf)341 TEST(FloatNear2Test, CanDescribeSelf) {
342 Matcher<const ::std::tuple<float, float>&> m = FloatNear(0.5f);
343 EXPECT_EQ("are an almost-equal pair", Describe(m));
344 }
345
346 // Tests that NanSensitiveFloatNear() matches a 2-tuple where
347 // NanSensitiveFloatNear(first field) matches the second field.
TEST(NanSensitiveFloatNearTest,MatchesNearbyArgumentsWithNaN)348 TEST(NanSensitiveFloatNearTest, MatchesNearbyArgumentsWithNaN) {
349 typedef ::std::tuple<float, float> Tpl;
350 Matcher<const Tpl&> m = NanSensitiveFloatNear(0.5f);
351 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
352 EXPECT_TRUE(m.Matches(Tpl(1.1f, 1.0f)));
353 EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(),
354 std::numeric_limits<float>::quiet_NaN())));
355 EXPECT_FALSE(m.Matches(Tpl(1.6f, 1.0f)));
356 EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<float>::quiet_NaN())));
357 EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<float>::quiet_NaN(), 1.0f)));
358 }
359
360 // Tests that NanSensitiveFloatNear() describes itself properly.
TEST(NanSensitiveFloatNearTest,CanDescribeSelfWithNaNs)361 TEST(NanSensitiveFloatNearTest, CanDescribeSelfWithNaNs) {
362 Matcher<const ::std::tuple<float, float>&> m = NanSensitiveFloatNear(0.5f);
363 EXPECT_EQ("are an almost-equal pair", Describe(m));
364 }
365
366 // Tests that FloatEq() matches a 2-tuple where
367 // DoubleNear(first field, max_abs_error) matches the second field.
TEST(DoubleNear2Test,MatchesEqualArguments)368 TEST(DoubleNear2Test, MatchesEqualArguments) {
369 typedef ::std::tuple<double, double> Tpl;
370 Matcher<const Tpl&> m = DoubleNear(0.5);
371 EXPECT_TRUE(m.Matches(Tpl(1.0, 1.0)));
372 EXPECT_TRUE(m.Matches(Tpl(1.3, 1.0)));
373 EXPECT_FALSE(m.Matches(Tpl(1.8, 1.0)));
374 }
375
376 // Tests that DoubleNear() describes itself properly.
TEST(DoubleNear2Test,CanDescribeSelf)377 TEST(DoubleNear2Test, CanDescribeSelf) {
378 Matcher<const ::std::tuple<double, double>&> m = DoubleNear(0.5);
379 EXPECT_EQ("are an almost-equal pair", Describe(m));
380 }
381
382 // Tests that NanSensitiveDoubleNear() matches a 2-tuple where
383 // NanSensitiveDoubleNear(first field) matches the second field.
TEST(NanSensitiveDoubleNearTest,MatchesNearbyArgumentsWithNaN)384 TEST(NanSensitiveDoubleNearTest, MatchesNearbyArgumentsWithNaN) {
385 typedef ::std::tuple<double, double> Tpl;
386 Matcher<const Tpl&> m = NanSensitiveDoubleNear(0.5f);
387 EXPECT_TRUE(m.Matches(Tpl(1.0f, 1.0f)));
388 EXPECT_TRUE(m.Matches(Tpl(1.1f, 1.0f)));
389 EXPECT_TRUE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(),
390 std::numeric_limits<double>::quiet_NaN())));
391 EXPECT_FALSE(m.Matches(Tpl(1.6f, 1.0f)));
392 EXPECT_FALSE(m.Matches(Tpl(1.0f, std::numeric_limits<double>::quiet_NaN())));
393 EXPECT_FALSE(m.Matches(Tpl(std::numeric_limits<double>::quiet_NaN(), 1.0f)));
394 }
395
396 // Tests that NanSensitiveDoubleNear() describes itself properly.
TEST(NanSensitiveDoubleNearTest,CanDescribeSelfWithNaNs)397 TEST(NanSensitiveDoubleNearTest, CanDescribeSelfWithNaNs) {
398 Matcher<const ::std::tuple<double, double>&> m = NanSensitiveDoubleNear(0.5f);
399 EXPECT_EQ("are an almost-equal pair", Describe(m));
400 }
401
402 // Tests that DistanceFrom() can describe itself properly.
TEST(DistanceFrom,CanDescribeSelf)403 TEST(DistanceFrom, CanDescribeSelf) {
404 Matcher<double> m = DistanceFrom(1.5, Lt(0.1));
405 EXPECT_EQ(Describe(m), "is < 0.1 away from 1.5");
406
407 m = DistanceFrom(2.5, Gt(0.2));
408 EXPECT_EQ(Describe(m), "is > 0.2 away from 2.5");
409 }
410
411 // Tests that DistanceFrom() can explain match failure.
TEST(DistanceFrom,CanExplainMatchFailure)412 TEST(DistanceFrom, CanExplainMatchFailure) {
413 Matcher<double> m = DistanceFrom(1.5, Lt(0.1));
414 EXPECT_EQ(Explain(m, 2.0), "which is 0.5 away from 1.5");
415 }
416
417 // Tests that DistanceFrom() matches a double that is within the given range of
418 // the given value.
TEST(DistanceFrom,MatchesDoubleWithinRange)419 TEST(DistanceFrom, MatchesDoubleWithinRange) {
420 const Matcher<double> m = DistanceFrom(0.5, Le(0.1));
421 EXPECT_TRUE(m.Matches(0.45));
422 EXPECT_TRUE(m.Matches(0.5));
423 EXPECT_TRUE(m.Matches(0.55));
424 EXPECT_FALSE(m.Matches(0.39));
425 EXPECT_FALSE(m.Matches(0.61));
426 }
427
428 // Tests that DistanceFrom() matches a double reference that is within the given
429 // range of the given value.
TEST(DistanceFrom,MatchesDoubleRefWithinRange)430 TEST(DistanceFrom, MatchesDoubleRefWithinRange) {
431 const Matcher<const double&> m = DistanceFrom(0.5, Le(0.1));
432 EXPECT_TRUE(m.Matches(0.45));
433 EXPECT_TRUE(m.Matches(0.5));
434 EXPECT_TRUE(m.Matches(0.55));
435 EXPECT_FALSE(m.Matches(0.39));
436 EXPECT_FALSE(m.Matches(0.61));
437 }
438
439 // Tests that DistanceFrom() can be implicitly converted to a matcher depending
440 // on the type of the argument.
TEST(DistanceFrom,CanBeImplicitlyConvertedToMatcher)441 TEST(DistanceFrom, CanBeImplicitlyConvertedToMatcher) {
442 EXPECT_THAT(0.58, DistanceFrom(0.5, Le(0.1)));
443 EXPECT_THAT(0.2, Not(DistanceFrom(0.5, Le(0.1))));
444
445 EXPECT_THAT(0.58f, DistanceFrom(0.5f, Le(0.1f)));
446 EXPECT_THAT(0.7f, Not(DistanceFrom(0.5f, Le(0.1f))));
447 }
448
449 // Tests that DistanceFrom() can be used on compatible types (i.e. not
450 // everything has to be of the same type).
TEST(DistanceFrom,CanBeUsedOnCompatibleTypes)451 TEST(DistanceFrom, CanBeUsedOnCompatibleTypes) {
452 EXPECT_THAT(0.58, DistanceFrom(0.5, Le(0.1f)));
453 EXPECT_THAT(0.2, Not(DistanceFrom(0.5, Le(0.1f))));
454
455 EXPECT_THAT(0.58, DistanceFrom(0.5f, Le(0.1)));
456 EXPECT_THAT(0.2, Not(DistanceFrom(0.5f, Le(0.1))));
457
458 EXPECT_THAT(0.58, DistanceFrom(0.5f, Le(0.1f)));
459 EXPECT_THAT(0.2, Not(DistanceFrom(0.5f, Le(0.1f))));
460
461 EXPECT_THAT(0.58f, DistanceFrom(0.5, Le(0.1)));
462 EXPECT_THAT(0.2f, Not(DistanceFrom(0.5, Le(0.1))));
463
464 EXPECT_THAT(0.58f, DistanceFrom(0.5, Le(0.1f)));
465 EXPECT_THAT(0.2f, Not(DistanceFrom(0.5, Le(0.1f))));
466
467 EXPECT_THAT(0.58f, DistanceFrom(0.5f, Le(0.1)));
468 EXPECT_THAT(0.2f, Not(DistanceFrom(0.5f, Le(0.1))));
469 }
470
471 // A 2-dimensional point. For testing using DistanceFrom() with a custom type
472 // that doesn't have a built-in distance function.
473 class Point {
474 public:
Point(double x,double y)475 Point(double x, double y) : x_(x), y_(y) {}
x() const476 double x() const { return x_; }
y() const477 double y() const { return y_; }
478
479 private:
480 double x_;
481 double y_;
482 };
483
484 // Returns the distance between two points.
PointDistance(const Point & lhs,const Point & rhs)485 double PointDistance(const Point& lhs, const Point& rhs) {
486 return std::sqrt(std::pow(lhs.x() - rhs.x(), 2) +
487 std::pow(lhs.y() - rhs.y(), 2));
488 }
489
490 // Tests that DistanceFrom() can be used on a type with a custom distance
491 // function.
TEST(DistanceFrom,CanBeUsedOnTypeWithCustomDistanceFunction)492 TEST(DistanceFrom, CanBeUsedOnTypeWithCustomDistanceFunction) {
493 const Matcher<Point> m =
494 DistanceFrom(Point(0.5, 0.5), PointDistance, Le(0.1));
495 EXPECT_THAT(Point(0.45, 0.45), m);
496 EXPECT_THAT(Point(0.2, 0.45), Not(m));
497 }
498
499 // A wrapper around a double value. For testing using DistanceFrom() with a
500 // custom type that has neither a built-in distance function nor a built-in
501 // distance comparator.
502 class Double {
503 public:
Double(double value)504 explicit Double(double value) : value_(value) {}
505 Double(const Double& other) = default;
value() const506 double value() const { return value_; }
507
508 // Defines how to print a Double value. We don't use the AbslStringify API
509 // because googletest doesn't require absl yet.
PrintTo(const Double & value,std::ostream * os)510 friend void PrintTo(const Double& value, std::ostream* os) {
511 *os << "Double(" << value.value() << ")";
512 }
513
514 private:
515 double value_;
516 };
517
518 // Returns the distance between two Double values.
DoubleDistance(Double lhs,Double rhs)519 Double DoubleDistance(Double lhs, Double rhs) {
520 return Double(std::abs(lhs.value() - rhs.value()));
521 }
522
523 MATCHER_P(DoubleLe, rhs, (negation ? "is > " : "is <= ") + PrintToString(rhs)) {
524 return arg.value() <= rhs.value();
525 }
526
527 // Tests that DistanceFrom() can describe itself properly for a type with a
528 // custom printer.
TEST(DistanceFrom,CanDescribeWithCustomPrinter)529 TEST(DistanceFrom, CanDescribeWithCustomPrinter) {
530 const Matcher<Double> m =
531 DistanceFrom(Double(0.5), DoubleDistance, DoubleLe(Double(0.1)));
532 EXPECT_EQ(Describe(m), "is <= Double(0.1) away from Double(0.5)");
533 EXPECT_EQ(DescribeNegation(m), "is > Double(0.1) away from Double(0.5)");
534 }
535
536 // Tests that DistanceFrom() can be used with a custom distance function and
537 // comparator.
TEST(DistanceFrom,CanCustomizeDistanceAndComparator)538 TEST(DistanceFrom, CanCustomizeDistanceAndComparator) {
539 const Matcher<Double> m =
540 DistanceFrom(Double(0.5), DoubleDistance, DoubleLe(Double(0.1)));
541 EXPECT_TRUE(m.Matches(Double(0.45)));
542 EXPECT_TRUE(m.Matches(Double(0.5)));
543 EXPECT_FALSE(m.Matches(Double(0.39)));
544 EXPECT_FALSE(m.Matches(Double(0.61)));
545 }
546
547 // For testing using DistanceFrom() with a type that supports both - and abs.
548 class Float {
549 public:
Float(float value)550 explicit Float(float value) : value_(value) {}
551 Float(const Float& other) = default;
value() const552 float value() const { return value_; }
553
554 private:
555 float value_ = 0.0f;
556 };
557
558 // Returns the difference between two Float values. This must be defined in the
559 // same namespace as Float.
operator -(const Float & lhs,const Float & rhs)560 Float operator-(const Float& lhs, const Float& rhs) {
561 return Float(lhs.value() - rhs.value());
562 }
563
564 // Returns the absolute value of a Float value. This must be defined in the
565 // same namespace as Float.
abs(Float value)566 Float abs(Float value) { return Float(std::abs(value.value())); }
567
568 // Returns true if and only if the first Float value is less than the second
569 // Float value. This must be defined in the same namespace as Float.
operator <(const Float & lhs,const Float & rhs)570 bool operator<(const Float& lhs, const Float& rhs) {
571 return lhs.value() < rhs.value();
572 }
573
574 // Tests that DistanceFrom() can be used with a type that supports both - and
575 // abs.
TEST(DistanceFrom,CanBeUsedWithTypeThatSupportsBothMinusAndAbs)576 TEST(DistanceFrom, CanBeUsedWithTypeThatSupportsBothMinusAndAbs) {
577 const Matcher<Float> m = DistanceFrom(Float(0.5f), Lt(Float(0.1f)));
578 EXPECT_TRUE(m.Matches(Float(0.45f)));
579 EXPECT_TRUE(m.Matches(Float(0.55f)));
580 EXPECT_FALSE(m.Matches(Float(0.39f)));
581 EXPECT_FALSE(m.Matches(Float(0.61f)));
582 }
583
584 // Tests that Not(m) matches any value that doesn't match m.
TEST(NotTest,NegatesMatcher)585 TEST(NotTest, NegatesMatcher) {
586 Matcher<int> m;
587 m = Not(Eq(2));
588 EXPECT_TRUE(m.Matches(3));
589 EXPECT_FALSE(m.Matches(2));
590 }
591
592 // Tests that Not(m) describes itself properly.
TEST(NotTest,CanDescribeSelf)593 TEST(NotTest, CanDescribeSelf) {
594 Matcher<int> m = Not(Eq(5));
595 EXPECT_EQ("isn't equal to 5", Describe(m));
596 }
597
598 // Tests that monomorphic matchers are safely cast by the Not matcher.
TEST(NotTest,NotMatcherSafelyCastsMonomorphicMatchers)599 TEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
600 // greater_than_5 is a monomorphic matcher.
601 Matcher<int> greater_than_5 = Gt(5);
602
603 Matcher<const int&> m = Not(greater_than_5);
604 Matcher<int&> m2 = Not(greater_than_5);
605 Matcher<int&> m3 = Not(m);
606 }
607
608 // Helper to allow easy testing of AllOf matchers with num parameters.
AllOfMatches(int num,const Matcher<int> & m)609 void AllOfMatches(int num, const Matcher<int>& m) {
610 SCOPED_TRACE(Describe(m));
611 EXPECT_TRUE(m.Matches(0));
612 for (int i = 1; i <= num; ++i) {
613 EXPECT_FALSE(m.Matches(i));
614 }
615 EXPECT_TRUE(m.Matches(num + 1));
616 }
617
618 INSTANTIATE_GTEST_MATCHER_TEST_P(AllOfTest);
619
620 // Tests that AllOf(m1, ..., mn) matches any value that matches all of
621 // the given matchers.
TEST(AllOfTest,MatchesWhenAllMatch)622 TEST(AllOfTest, MatchesWhenAllMatch) {
623 Matcher<int> m;
624 m = AllOf(Le(2), Ge(1));
625 EXPECT_TRUE(m.Matches(1));
626 EXPECT_TRUE(m.Matches(2));
627 EXPECT_FALSE(m.Matches(0));
628 EXPECT_FALSE(m.Matches(3));
629
630 m = AllOf(Gt(0), Ne(1), Ne(2));
631 EXPECT_TRUE(m.Matches(3));
632 EXPECT_FALSE(m.Matches(2));
633 EXPECT_FALSE(m.Matches(1));
634 EXPECT_FALSE(m.Matches(0));
635
636 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
637 EXPECT_TRUE(m.Matches(4));
638 EXPECT_FALSE(m.Matches(3));
639 EXPECT_FALSE(m.Matches(2));
640 EXPECT_FALSE(m.Matches(1));
641 EXPECT_FALSE(m.Matches(0));
642
643 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
644 EXPECT_TRUE(m.Matches(0));
645 EXPECT_TRUE(m.Matches(1));
646 EXPECT_FALSE(m.Matches(3));
647
648 // The following tests for varying number of sub-matchers. Due to the way
649 // the sub-matchers are handled it is enough to test every sub-matcher once
650 // with sub-matchers using the same matcher type. Varying matcher types are
651 // checked for above.
652 AllOfMatches(2, AllOf(Ne(1), Ne(2)));
653 AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));
654 AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));
655 AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));
656 AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));
657 AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));
658 AllOfMatches(8,
659 AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8)));
660 AllOfMatches(
661 9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), Ne(9)));
662 AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
663 Ne(9), Ne(10)));
664 AllOfMatches(
665 50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), Ne(9),
666 Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15), Ne(16), Ne(17),
667 Ne(18), Ne(19), Ne(20), Ne(21), Ne(22), Ne(23), Ne(24), Ne(25),
668 Ne(26), Ne(27), Ne(28), Ne(29), Ne(30), Ne(31), Ne(32), Ne(33),
669 Ne(34), Ne(35), Ne(36), Ne(37), Ne(38), Ne(39), Ne(40), Ne(41),
670 Ne(42), Ne(43), Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),
671 Ne(50)));
672 }
673
674 // Tests that AllOf(m1, ..., mn) describes itself properly.
TEST(AllOfTest,CanDescribeSelf)675 TEST(AllOfTest, CanDescribeSelf) {
676 Matcher<int> m;
677 m = AllOf(Le(2), Ge(1));
678 EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
679
680 m = AllOf(Gt(0), Ne(1), Ne(2));
681 std::string expected_descr1 =
682 "(is > 0) and (isn't equal to 1) and (isn't equal to 2)";
683 EXPECT_EQ(expected_descr1, Describe(m));
684
685 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
686 std::string expected_descr2 =
687 "(is > 0) and (isn't equal to 1) and (isn't equal to 2) and (isn't equal "
688 "to 3)";
689 EXPECT_EQ(expected_descr2, Describe(m));
690
691 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
692 std::string expected_descr3 =
693 "(is >= 0) and (is < 10) and (isn't equal to 3) and (isn't equal to 5) "
694 "and (isn't equal to 7)";
695 EXPECT_EQ(expected_descr3, Describe(m));
696 }
697
698 // Tests that AllOf(m1, ..., mn) describes its negation properly.
TEST(AllOfTest,CanDescribeNegation)699 TEST(AllOfTest, CanDescribeNegation) {
700 Matcher<int> m;
701 m = AllOf(Le(2), Ge(1));
702 std::string expected_descr4 = "(isn't <= 2) or (isn't >= 1)";
703 EXPECT_EQ(expected_descr4, DescribeNegation(m));
704
705 m = AllOf(Gt(0), Ne(1), Ne(2));
706 std::string expected_descr5 =
707 "(isn't > 0) or (is equal to 1) or (is equal to 2)";
708 EXPECT_EQ(expected_descr5, DescribeNegation(m));
709
710 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
711 std::string expected_descr6 =
712 "(isn't > 0) or (is equal to 1) or (is equal to 2) or (is equal to 3)";
713 EXPECT_EQ(expected_descr6, DescribeNegation(m));
714
715 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
716 std::string expected_desr7 =
717 "(isn't >= 0) or (isn't < 10) or (is equal to 3) or (is equal to 5) or "
718 "(is equal to 7)";
719 EXPECT_EQ(expected_desr7, DescribeNegation(m));
720
721 m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), Ne(9),
722 Ne(10), Ne(11));
723 AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
724 EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11)"));
725 AllOfMatches(11, m);
726 }
727
728 // Tests that monomorphic matchers are safely cast by the AllOf matcher.
TEST(AllOfTest,AllOfMatcherSafelyCastsMonomorphicMatchers)729 TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
730 // greater_than_5 and less_than_10 are monomorphic matchers.
731 Matcher<int> greater_than_5 = Gt(5);
732 Matcher<int> less_than_10 = Lt(10);
733
734 Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
735 Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
736 Matcher<int&> m3 = AllOf(greater_than_5, m2);
737
738 // Tests that BothOf works when composing itself.
739 Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
740 Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
741 }
742
TEST_P(AllOfTestP,ExplainsResult)743 TEST_P(AllOfTestP, ExplainsResult) {
744 Matcher<int> m;
745
746 // Successful match. Both matchers need to explain. The second
747 // matcher doesn't give an explanation, so the matcher description is used.
748 m = AllOf(GreaterThan(10), Lt(30));
749 EXPECT_EQ("which is 15 more than 10, and is < 30", Explain(m, 25));
750
751 // Successful match. Both matchers need to explain.
752 m = AllOf(GreaterThan(10), GreaterThan(20));
753 EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
754 Explain(m, 30));
755
756 // Successful match. All matchers need to explain. The second
757 // matcher doesn't given an explanation.
758 m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
759 EXPECT_EQ(
760 "which is 15 more than 10, and is < 30, and which is 5 more than 20",
761 Explain(m, 25));
762
763 // Successful match. All matchers need to explain.
764 m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
765 EXPECT_EQ(
766 "which is 30 more than 10, and which is 20 more than 20, "
767 "and which is 10 more than 30",
768 Explain(m, 40));
769
770 // Failed match. The first matcher, which failed, needs to
771 // explain.
772 m = AllOf(GreaterThan(10), GreaterThan(20));
773 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
774
775 // Failed match. The second matcher, which failed, needs to
776 // explain. Since it doesn't given an explanation, the matcher text is
777 // printed.
778 m = AllOf(GreaterThan(10), Lt(30));
779 EXPECT_EQ("which doesn't match (is < 30)", Explain(m, 40));
780
781 // Failed match. The second matcher, which failed, needs to
782 // explain.
783 m = AllOf(GreaterThan(10), GreaterThan(20));
784 EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
785 }
786
787 // Helper to allow easy testing of AnyOf matchers with num parameters.
AnyOfMatches(int num,const Matcher<int> & m)788 static void AnyOfMatches(int num, const Matcher<int>& m) {
789 SCOPED_TRACE(Describe(m));
790 EXPECT_FALSE(m.Matches(0));
791 for (int i = 1; i <= num; ++i) {
792 EXPECT_TRUE(m.Matches(i));
793 }
794 EXPECT_FALSE(m.Matches(num + 1));
795 }
796
AnyOfStringMatches(int num,const Matcher<std::string> & m)797 static void AnyOfStringMatches(int num, const Matcher<std::string>& m) {
798 SCOPED_TRACE(Describe(m));
799 EXPECT_FALSE(m.Matches(std::to_string(0)));
800
801 for (int i = 1; i <= num; ++i) {
802 EXPECT_TRUE(m.Matches(std::to_string(i)));
803 }
804 EXPECT_FALSE(m.Matches(std::to_string(num + 1)));
805 }
806
807 INSTANTIATE_GTEST_MATCHER_TEST_P(AnyOfTest);
808
809 // Tests that AnyOf(m1, ..., mn) matches any value that matches at
810 // least one of the given matchers.
TEST(AnyOfTest,MatchesWhenAnyMatches)811 TEST(AnyOfTest, MatchesWhenAnyMatches) {
812 Matcher<int> m;
813 m = AnyOf(Le(1), Ge(3));
814 EXPECT_TRUE(m.Matches(1));
815 EXPECT_TRUE(m.Matches(4));
816 EXPECT_FALSE(m.Matches(2));
817
818 m = AnyOf(Lt(0), Eq(1), Eq(2));
819 EXPECT_TRUE(m.Matches(-1));
820 EXPECT_TRUE(m.Matches(1));
821 EXPECT_TRUE(m.Matches(2));
822 EXPECT_FALSE(m.Matches(0));
823
824 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
825 EXPECT_TRUE(m.Matches(-1));
826 EXPECT_TRUE(m.Matches(1));
827 EXPECT_TRUE(m.Matches(2));
828 EXPECT_TRUE(m.Matches(3));
829 EXPECT_FALSE(m.Matches(0));
830
831 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
832 EXPECT_TRUE(m.Matches(0));
833 EXPECT_TRUE(m.Matches(11));
834 EXPECT_TRUE(m.Matches(3));
835 EXPECT_FALSE(m.Matches(2));
836
837 // The following tests for varying number of sub-matchers. Due to the way
838 // the sub-matchers are handled it is enough to test every sub-matcher once
839 // with sub-matchers using the same matcher type. Varying matcher types are
840 // checked for above.
841 AnyOfMatches(2, AnyOf(1, 2));
842 AnyOfMatches(3, AnyOf(1, 2, 3));
843 AnyOfMatches(4, AnyOf(1, 2, 3, 4));
844 AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));
845 AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));
846 AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));
847 AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));
848 AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));
849 AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
850 }
851
852 // Tests the variadic version of the AnyOfMatcher.
TEST(AnyOfTest,VariadicMatchesWhenAnyMatches)853 TEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
854 // Also make sure AnyOf is defined in the right namespace and does not depend
855 // on ADL.
856 Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
857
858 EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11)"));
859 AnyOfMatches(11, m);
860 AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
861 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
862 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
863 45, 46, 47, 48, 49, 50));
864 AnyOfStringMatches(
865 50, AnyOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
866 "13", "14", "15", "16", "17", "18", "19", "20", "21", "22",
867 "23", "24", "25", "26", "27", "28", "29", "30", "31", "32",
868 "33", "34", "35", "36", "37", "38", "39", "40", "41", "42",
869 "43", "44", "45", "46", "47", "48", "49", "50"));
870 }
871
TEST(ConditionalTest,MatchesFirstIfCondition)872 TEST(ConditionalTest, MatchesFirstIfCondition) {
873 Matcher<std::string> eq_red = Eq("red");
874 Matcher<std::string> ne_red = Ne("red");
875 Matcher<std::string> m = Conditional(true, eq_red, ne_red);
876 EXPECT_TRUE(m.Matches("red"));
877 EXPECT_FALSE(m.Matches("green"));
878
879 StringMatchResultListener listener;
880 StringMatchResultListener expected;
881 EXPECT_FALSE(m.MatchAndExplain("green", &listener));
882 EXPECT_FALSE(eq_red.MatchAndExplain("green", &expected));
883 EXPECT_THAT(listener.str(), Eq(expected.str()));
884 }
885
TEST(ConditionalTest,MatchesSecondIfCondition)886 TEST(ConditionalTest, MatchesSecondIfCondition) {
887 Matcher<std::string> eq_red = Eq("red");
888 Matcher<std::string> ne_red = Ne("red");
889 Matcher<std::string> m = Conditional(false, eq_red, ne_red);
890 EXPECT_FALSE(m.Matches("red"));
891 EXPECT_TRUE(m.Matches("green"));
892
893 StringMatchResultListener listener;
894 StringMatchResultListener expected;
895 EXPECT_FALSE(m.MatchAndExplain("red", &listener));
896 EXPECT_FALSE(ne_red.MatchAndExplain("red", &expected));
897 EXPECT_THAT(listener.str(), Eq(expected.str()));
898 }
899
900 // Tests that AnyOf(m1, ..., mn) describes itself properly.
TEST(AnyOfTest,CanDescribeSelf)901 TEST(AnyOfTest, CanDescribeSelf) {
902 Matcher<int> m;
903 m = AnyOf(Le(1), Ge(3));
904
905 EXPECT_EQ("(is <= 1) or (is >= 3)", Describe(m));
906
907 m = AnyOf(Lt(0), Eq(1), Eq(2));
908 EXPECT_EQ("(is < 0) or (is equal to 1) or (is equal to 2)", Describe(m));
909
910 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
911 EXPECT_EQ("(is < 0) or (is equal to 1) or (is equal to 2) or (is equal to 3)",
912 Describe(m));
913
914 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
915 EXPECT_EQ(
916 "(is <= 0) or (is > 10) or (is equal to 3) or (is equal to 5) or (is "
917 "equal to 7)",
918 Describe(m));
919 }
920
921 // Tests that AnyOf(m1, ..., mn) describes its negation properly.
TEST(AnyOfTest,CanDescribeNegation)922 TEST(AnyOfTest, CanDescribeNegation) {
923 Matcher<int> m;
924 m = AnyOf(Le(1), Ge(3));
925 EXPECT_EQ("(isn't <= 1) and (isn't >= 3)", DescribeNegation(m));
926
927 m = AnyOf(Lt(0), Eq(1), Eq(2));
928 EXPECT_EQ("(isn't < 0) and (isn't equal to 1) and (isn't equal to 2)",
929 DescribeNegation(m));
930
931 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
932 EXPECT_EQ(
933 "(isn't < 0) and (isn't equal to 1) and (isn't equal to 2) and (isn't "
934 "equal to 3)",
935 DescribeNegation(m));
936
937 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
938 EXPECT_EQ(
939 "(isn't <= 0) and (isn't > 10) and (isn't equal to 3) and (isn't equal "
940 "to 5) and (isn't equal to 7)",
941 DescribeNegation(m));
942 }
943
944 // Tests that monomorphic matchers are safely cast by the AnyOf matcher.
TEST(AnyOfTest,AnyOfMatcherSafelyCastsMonomorphicMatchers)945 TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
946 // greater_than_5 and less_than_10 are monomorphic matchers.
947 Matcher<int> greater_than_5 = Gt(5);
948 Matcher<int> less_than_10 = Lt(10);
949
950 Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
951 Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
952 Matcher<int&> m3 = AnyOf(greater_than_5, m2);
953
954 // Tests that EitherOf works when composing itself.
955 Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
956 Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
957 }
958
TEST_P(AnyOfTestP,ExplainsResult)959 TEST_P(AnyOfTestP, ExplainsResult) {
960 Matcher<int> m;
961
962 // Failed match. The second matcher have no explanation (description is used).
963 m = AnyOf(GreaterThan(10), Lt(0));
964 EXPECT_EQ("which is 5 less than 10, and isn't < 0", Explain(m, 5));
965
966 // Failed match. Both matchers have explanations.
967 m = AnyOf(GreaterThan(10), GreaterThan(20));
968 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
969 Explain(m, 5));
970
971 // Failed match. The middle matcher have no explanation.
972 m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
973 EXPECT_EQ(
974 "which is 5 less than 10, and isn't > 20, and which is 25 less than 30",
975 Explain(m, 5));
976
977 // Failed match. All three matchers have explanations.
978 m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
979 EXPECT_EQ(
980 "which is 5 less than 10, and which is 15 less than 20, "
981 "and which is 25 less than 30",
982 Explain(m, 5));
983
984 // Successful match. The first macher succeeded and has explanation.
985 m = AnyOf(GreaterThan(10), GreaterThan(20));
986 EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
987
988 // Successful match. The second matcher succeeded and has explanation.
989 m = AnyOf(GreaterThan(30), GreaterThan(20));
990 EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
991
992 // Successful match. The first matcher succeeded and has no explanation.
993 m = AnyOf(Gt(10), Lt(20));
994 EXPECT_EQ("which matches (is > 10)", Explain(m, 15));
995
996 // Successful match. The second matcher succeeded and has no explanation.
997 m = AnyOf(Gt(30), Gt(20));
998 EXPECT_EQ("which matches (is > 20)", Explain(m, 25));
999 }
1000
1001 // The following predicate function and predicate functor are for
1002 // testing the Truly(predicate) matcher.
1003
1004 // Returns non-zero if the input is positive. Note that the return
1005 // type of this function is not bool. It's OK as Truly() accepts any
1006 // unary function or functor whose return type can be implicitly
1007 // converted to bool.
IsPositive(double x)1008 int IsPositive(double x) { return x > 0 ? 1 : 0; }
1009
1010 // This functor returns true if the input is greater than the given
1011 // number.
1012 class IsGreaterThan {
1013 public:
IsGreaterThan(int threshold)1014 explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
1015
operator ()(int n) const1016 bool operator()(int n) const { return n > threshold_; }
1017
1018 private:
1019 int threshold_;
1020 };
1021
1022 // For testing Truly().
1023 const int foo = 0;
1024
1025 // This predicate returns true if and only if the argument references foo and
1026 // has a zero value.
ReferencesFooAndIsZero(const int & n)1027 bool ReferencesFooAndIsZero(const int& n) { return (&n == &foo) && (n == 0); }
1028
1029 // Tests that Truly(predicate) matches what satisfies the given
1030 // predicate.
TEST(TrulyTest,MatchesWhatSatisfiesThePredicate)1031 TEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
1032 Matcher<double> m = Truly(IsPositive);
1033 EXPECT_TRUE(m.Matches(2.0));
1034 EXPECT_FALSE(m.Matches(-1.5));
1035 }
1036
1037 // Tests that Truly(predicate_functor) works too.
TEST(TrulyTest,CanBeUsedWithFunctor)1038 TEST(TrulyTest, CanBeUsedWithFunctor) {
1039 Matcher<int> m = Truly(IsGreaterThan(5));
1040 EXPECT_TRUE(m.Matches(6));
1041 EXPECT_FALSE(m.Matches(4));
1042 }
1043
1044 // A class that can be implicitly converted to bool.
1045 class ConvertibleToBool {
1046 public:
ConvertibleToBool(int number)1047 explicit ConvertibleToBool(int number) : number_(number) {}
operator bool() const1048 operator bool() const { return number_ != 0; }
1049
1050 private:
1051 int number_;
1052 };
1053
IsNotZero(int number)1054 ConvertibleToBool IsNotZero(int number) { return ConvertibleToBool(number); }
1055
1056 // Tests that the predicate used in Truly() may return a class that's
1057 // implicitly convertible to bool, even when the class has no
1058 // operator!().
TEST(TrulyTest,PredicateCanReturnAClassConvertibleToBool)1059 TEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
1060 Matcher<int> m = Truly(IsNotZero);
1061 EXPECT_TRUE(m.Matches(1));
1062 EXPECT_FALSE(m.Matches(0));
1063 }
1064
1065 // Tests that Truly(predicate) can describe itself properly.
TEST(TrulyTest,CanDescribeSelf)1066 TEST(TrulyTest, CanDescribeSelf) {
1067 Matcher<double> m = Truly(IsPositive);
1068 EXPECT_EQ("satisfies the given predicate", Describe(m));
1069 }
1070
1071 // Tests that Truly(predicate) works when the matcher takes its
1072 // argument by reference.
TEST(TrulyTest,WorksForByRefArguments)1073 TEST(TrulyTest, WorksForByRefArguments) {
1074 Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
1075 EXPECT_TRUE(m.Matches(foo));
1076 int n = 0;
1077 EXPECT_FALSE(m.Matches(n));
1078 }
1079
1080 // Tests that Truly(predicate) provides a helpful reason when it fails.
TEST(TrulyTest,ExplainsFailures)1081 TEST(TrulyTest, ExplainsFailures) {
1082 StringMatchResultListener listener;
1083 EXPECT_FALSE(ExplainMatchResult(Truly(IsPositive), -1, &listener));
1084 EXPECT_EQ(listener.str(), "didn't satisfy the given predicate");
1085 }
1086
1087 // Tests that Matches(m) is a predicate satisfied by whatever that
1088 // matches matcher m.
TEST(MatchesTest,IsSatisfiedByWhatMatchesTheMatcher)1089 TEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
1090 EXPECT_TRUE(Matches(Ge(0))(1));
1091 EXPECT_FALSE(Matches(Eq('a'))('b'));
1092 }
1093
1094 // Tests that Matches(m) works when the matcher takes its argument by
1095 // reference.
TEST(MatchesTest,WorksOnByRefArguments)1096 TEST(MatchesTest, WorksOnByRefArguments) {
1097 int m = 0, n = 0;
1098 EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
1099 EXPECT_FALSE(Matches(Ref(m))(n));
1100 }
1101
1102 // Tests that a Matcher on non-reference type can be used in
1103 // Matches().
TEST(MatchesTest,WorksWithMatcherOnNonRefType)1104 TEST(MatchesTest, WorksWithMatcherOnNonRefType) {
1105 Matcher<int> eq5 = Eq(5);
1106 EXPECT_TRUE(Matches(eq5)(5));
1107 EXPECT_FALSE(Matches(eq5)(2));
1108 }
1109
1110 // Tests Value(value, matcher). Since Value() is a simple wrapper for
1111 // Matches(), which has been tested already, we don't spend a lot of
1112 // effort on testing Value().
TEST(ValueTest,WorksWithPolymorphicMatcher)1113 TEST(ValueTest, WorksWithPolymorphicMatcher) {
1114 EXPECT_TRUE(Value("hi", StartsWith("h")));
1115 EXPECT_FALSE(Value(5, Gt(10)));
1116 }
1117
TEST(ValueTest,WorksWithMonomorphicMatcher)1118 TEST(ValueTest, WorksWithMonomorphicMatcher) {
1119 const Matcher<int> is_zero = Eq(0);
1120 EXPECT_TRUE(Value(0, is_zero));
1121 EXPECT_FALSE(Value('a', is_zero));
1122
1123 int n = 0;
1124 const Matcher<const int&> ref_n = Ref(n);
1125 EXPECT_TRUE(Value(n, ref_n));
1126 EXPECT_FALSE(Value(1, ref_n));
1127 }
1128
TEST(AllArgsTest,WorksForTuple)1129 TEST(AllArgsTest, WorksForTuple) {
1130 EXPECT_THAT(std::make_tuple(1, 2L), AllArgs(Lt()));
1131 EXPECT_THAT(std::make_tuple(2L, 1), Not(AllArgs(Lt())));
1132 }
1133
TEST(AllArgsTest,WorksForNonTuple)1134 TEST(AllArgsTest, WorksForNonTuple) {
1135 EXPECT_THAT(42, AllArgs(Gt(0)));
1136 EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
1137 }
1138
1139 class AllArgsHelper {
1140 public:
1141 AllArgsHelper() = default;
1142
1143 MOCK_METHOD2(Helper, int(char x, int y));
1144
1145 private:
1146 AllArgsHelper(const AllArgsHelper&) = delete;
1147 AllArgsHelper& operator=(const AllArgsHelper&) = delete;
1148 };
1149
TEST(AllArgsTest,WorksInWithClause)1150 TEST(AllArgsTest, WorksInWithClause) {
1151 AllArgsHelper helper;
1152 ON_CALL(helper, Helper(_, _)).With(AllArgs(Lt())).WillByDefault(Return(1));
1153 EXPECT_CALL(helper, Helper(_, _));
1154 EXPECT_CALL(helper, Helper(_, _)).With(AllArgs(Gt())).WillOnce(Return(2));
1155
1156 EXPECT_EQ(1, helper.Helper('\1', 2));
1157 EXPECT_EQ(2, helper.Helper('a', 1));
1158 }
1159
1160 class OptionalMatchersHelper {
1161 public:
1162 OptionalMatchersHelper() = default;
1163
1164 MOCK_METHOD0(NoArgs, int());
1165
1166 MOCK_METHOD1(OneArg, int(int y));
1167
1168 MOCK_METHOD2(TwoArgs, int(char x, int y));
1169
1170 MOCK_METHOD1(Overloaded, int(char x));
1171 MOCK_METHOD2(Overloaded, int(char x, int y));
1172
1173 private:
1174 OptionalMatchersHelper(const OptionalMatchersHelper&) = delete;
1175 OptionalMatchersHelper& operator=(const OptionalMatchersHelper&) = delete;
1176 };
1177
TEST(AllArgsTest,WorksWithoutMatchers)1178 TEST(AllArgsTest, WorksWithoutMatchers) {
1179 OptionalMatchersHelper helper;
1180
1181 ON_CALL(helper, NoArgs).WillByDefault(Return(10));
1182 ON_CALL(helper, OneArg).WillByDefault(Return(20));
1183 ON_CALL(helper, TwoArgs).WillByDefault(Return(30));
1184
1185 EXPECT_EQ(10, helper.NoArgs());
1186 EXPECT_EQ(20, helper.OneArg(1));
1187 EXPECT_EQ(30, helper.TwoArgs('\1', 2));
1188
1189 EXPECT_CALL(helper, NoArgs).Times(1);
1190 EXPECT_CALL(helper, OneArg).WillOnce(Return(100));
1191 EXPECT_CALL(helper, OneArg(17)).WillOnce(Return(200));
1192 EXPECT_CALL(helper, TwoArgs).Times(0);
1193
1194 EXPECT_EQ(10, helper.NoArgs());
1195 EXPECT_EQ(100, helper.OneArg(1));
1196 EXPECT_EQ(200, helper.OneArg(17));
1197 }
1198
1199 // Tests floating-point matchers.
1200 template <typename RawType>
1201 class FloatingPointTest : public testing::Test {
1202 protected:
1203 typedef testing::internal::FloatingPoint<RawType> Floating;
1204 typedef typename Floating::Bits Bits;
1205
FloatingPointTest()1206 FloatingPointTest()
1207 : max_ulps_(Floating::kMaxUlps),
1208 zero_bits_(Floating(0).bits()),
1209 one_bits_(Floating(1).bits()),
1210 infinity_bits_(Floating(Floating::Infinity()).bits()),
1211 close_to_positive_zero_(
1212 Floating::ReinterpretBits(zero_bits_ + max_ulps_ / 2)),
1213 close_to_negative_zero_(
1214 -Floating::ReinterpretBits(zero_bits_ + max_ulps_ - max_ulps_ / 2)),
1215 further_from_negative_zero_(-Floating::ReinterpretBits(
1216 zero_bits_ + max_ulps_ + 1 - max_ulps_ / 2)),
1217 close_to_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_)),
1218 further_from_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_ + 1)),
1219 infinity_(Floating::Infinity()),
1220 close_to_infinity_(
1221 Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),
1222 further_from_infinity_(
1223 Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),
1224 max_(std::numeric_limits<RawType>::max()),
1225 nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),
1226 nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {}
1227
TestSize()1228 void TestSize() { EXPECT_EQ(sizeof(RawType), sizeof(Bits)); }
1229
1230 // A battery of tests for FloatingEqMatcher::Matches.
1231 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
TestMatches(testing::internal::FloatingEqMatcher<RawType> (* matcher_maker)(RawType))1232 void TestMatches(
1233 testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
1234 Matcher<RawType> m1 = matcher_maker(0.0);
1235 EXPECT_TRUE(m1.Matches(-0.0));
1236 EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
1237 EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
1238 EXPECT_FALSE(m1.Matches(1.0));
1239
1240 Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
1241 EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
1242
1243 Matcher<RawType> m3 = matcher_maker(1.0);
1244 EXPECT_TRUE(m3.Matches(close_to_one_));
1245 EXPECT_FALSE(m3.Matches(further_from_one_));
1246
1247 // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
1248 EXPECT_FALSE(m3.Matches(0.0));
1249
1250 Matcher<RawType> m4 = matcher_maker(-infinity_);
1251 EXPECT_TRUE(m4.Matches(-close_to_infinity_));
1252
1253 Matcher<RawType> m5 = matcher_maker(infinity_);
1254 EXPECT_TRUE(m5.Matches(close_to_infinity_));
1255
1256 // This is interesting as the representations of infinity_ and nan1_
1257 // are only 1 DLP apart.
1258 EXPECT_FALSE(m5.Matches(nan1_));
1259
1260 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
1261 // some cases.
1262 Matcher<const RawType&> m6 = matcher_maker(0.0);
1263 EXPECT_TRUE(m6.Matches(-0.0));
1264 EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
1265 EXPECT_FALSE(m6.Matches(1.0));
1266
1267 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
1268 // cases.
1269 Matcher<RawType&> m7 = matcher_maker(0.0);
1270 RawType x = 0.0;
1271 EXPECT_TRUE(m7.Matches(x));
1272 x = 0.01f;
1273 EXPECT_FALSE(m7.Matches(x));
1274 }
1275
1276 // Pre-calculated numbers to be used by the tests.
1277
1278 const Bits max_ulps_;
1279
1280 const Bits zero_bits_; // The bits that represent 0.0.
1281 const Bits one_bits_; // The bits that represent 1.0.
1282 const Bits infinity_bits_; // The bits that represent +infinity.
1283
1284 // Some numbers close to 0.0.
1285 const RawType close_to_positive_zero_;
1286 const RawType close_to_negative_zero_;
1287 const RawType further_from_negative_zero_;
1288
1289 // Some numbers close to 1.0.
1290 const RawType close_to_one_;
1291 const RawType further_from_one_;
1292
1293 // Some numbers close to +infinity.
1294 const RawType infinity_;
1295 const RawType close_to_infinity_;
1296 const RawType further_from_infinity_;
1297
1298 // Maximum representable value that's not infinity.
1299 const RawType max_;
1300
1301 // Some NaNs.
1302 const RawType nan1_;
1303 const RawType nan2_;
1304 };
1305
1306 // Tests floating-point matchers with fixed epsilons.
1307 template <typename RawType>
1308 class FloatingPointNearTest : public FloatingPointTest<RawType> {
1309 protected:
1310 typedef FloatingPointTest<RawType> ParentType;
1311
1312 // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.
1313 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
TestNearMatches(testing::internal::FloatingEqMatcher<RawType> (* matcher_maker)(RawType,RawType))1314 void TestNearMatches(testing::internal::FloatingEqMatcher<RawType> (
1315 *matcher_maker)(RawType, RawType)) {
1316 Matcher<RawType> m1 = matcher_maker(0.0, 0.0);
1317 EXPECT_TRUE(m1.Matches(0.0));
1318 EXPECT_TRUE(m1.Matches(-0.0));
1319 EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));
1320 EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));
1321 EXPECT_FALSE(m1.Matches(1.0));
1322
1323 Matcher<RawType> m2 = matcher_maker(0.0, 1.0);
1324 EXPECT_TRUE(m2.Matches(0.0));
1325 EXPECT_TRUE(m2.Matches(-0.0));
1326 EXPECT_TRUE(m2.Matches(1.0));
1327 EXPECT_TRUE(m2.Matches(-1.0));
1328 EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));
1329 EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));
1330
1331 // Check that inf matches inf, regardless of the of the specified max
1332 // absolute error.
1333 Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);
1334 EXPECT_TRUE(m3.Matches(ParentType::infinity_));
1335 EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));
1336 EXPECT_FALSE(m3.Matches(-ParentType::infinity_));
1337
1338 Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);
1339 EXPECT_TRUE(m4.Matches(-ParentType::infinity_));
1340 EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));
1341 EXPECT_FALSE(m4.Matches(ParentType::infinity_));
1342
1343 // Test various overflow scenarios.
1344 Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);
1345 EXPECT_TRUE(m5.Matches(ParentType::max_));
1346 EXPECT_FALSE(m5.Matches(-ParentType::max_));
1347
1348 Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);
1349 EXPECT_FALSE(m6.Matches(ParentType::max_));
1350 EXPECT_TRUE(m6.Matches(-ParentType::max_));
1351
1352 Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);
1353 EXPECT_TRUE(m7.Matches(ParentType::max_));
1354 EXPECT_FALSE(m7.Matches(-ParentType::max_));
1355
1356 Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);
1357 EXPECT_FALSE(m8.Matches(ParentType::max_));
1358 EXPECT_TRUE(m8.Matches(-ParentType::max_));
1359
1360 // The difference between max() and -max() normally overflows to infinity,
1361 // but it should still match if the max_abs_error is also infinity.
1362 Matcher<RawType> m9 =
1363 matcher_maker(ParentType::max_, ParentType::infinity_);
1364 EXPECT_TRUE(m8.Matches(-ParentType::max_));
1365
1366 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
1367 // some cases.
1368 Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);
1369 EXPECT_TRUE(m10.Matches(-0.0));
1370 EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));
1371 EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));
1372
1373 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
1374 // cases.
1375 Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);
1376 RawType x = 0.0;
1377 EXPECT_TRUE(m11.Matches(x));
1378 x = 1.0f;
1379 EXPECT_TRUE(m11.Matches(x));
1380 x = -1.0f;
1381 EXPECT_TRUE(m11.Matches(x));
1382 x = 1.1f;
1383 EXPECT_FALSE(m11.Matches(x));
1384 x = -1.1f;
1385 EXPECT_FALSE(m11.Matches(x));
1386 }
1387 };
1388
1389 // Instantiate FloatingPointTest for testing floats.
1390 typedef FloatingPointTest<float> FloatTest;
1391
TEST_F(FloatTest,FloatEqApproximatelyMatchesFloats)1392 TEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) { TestMatches(&FloatEq); }
1393
TEST_F(FloatTest,NanSensitiveFloatEqApproximatelyMatchesFloats)1394 TEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
1395 TestMatches(&NanSensitiveFloatEq);
1396 }
1397
TEST_F(FloatTest,FloatEqCannotMatchNaN)1398 TEST_F(FloatTest, FloatEqCannotMatchNaN) {
1399 // FloatEq never matches NaN.
1400 Matcher<float> m = FloatEq(nan1_);
1401 EXPECT_FALSE(m.Matches(nan1_));
1402 EXPECT_FALSE(m.Matches(nan2_));
1403 EXPECT_FALSE(m.Matches(1.0));
1404 }
1405
TEST_F(FloatTest,NanSensitiveFloatEqCanMatchNaN)1406 TEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
1407 // NanSensitiveFloatEq will match NaN.
1408 Matcher<float> m = NanSensitiveFloatEq(nan1_);
1409 EXPECT_TRUE(m.Matches(nan1_));
1410 EXPECT_TRUE(m.Matches(nan2_));
1411 EXPECT_FALSE(m.Matches(1.0));
1412 }
1413
TEST_F(FloatTest,FloatEqCanDescribeSelf)1414 TEST_F(FloatTest, FloatEqCanDescribeSelf) {
1415 Matcher<float> m1 = FloatEq(2.0f);
1416 EXPECT_EQ("is approximately 2", Describe(m1));
1417 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
1418
1419 Matcher<float> m2 = FloatEq(0.5f);
1420 EXPECT_EQ("is approximately 0.5", Describe(m2));
1421 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
1422
1423 Matcher<float> m3 = FloatEq(nan1_);
1424 EXPECT_EQ("never matches", Describe(m3));
1425 EXPECT_EQ("is anything", DescribeNegation(m3));
1426 }
1427
TEST_F(FloatTest,NanSensitiveFloatEqCanDescribeSelf)1428 TEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
1429 Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
1430 EXPECT_EQ("is approximately 2", Describe(m1));
1431 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
1432
1433 Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
1434 EXPECT_EQ("is approximately 0.5", Describe(m2));
1435 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
1436
1437 Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
1438 EXPECT_EQ("is NaN", Describe(m3));
1439 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
1440 }
1441
1442 // Instantiate FloatingPointTest for testing floats with a user-specified
1443 // max absolute error.
1444 typedef FloatingPointNearTest<float> FloatNearTest;
1445
TEST_F(FloatNearTest,FloatNearMatches)1446 TEST_F(FloatNearTest, FloatNearMatches) { TestNearMatches(&FloatNear); }
1447
TEST_F(FloatNearTest,NanSensitiveFloatNearApproximatelyMatchesFloats)1448 TEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {
1449 TestNearMatches(&NanSensitiveFloatNear);
1450 }
1451
TEST_F(FloatNearTest,FloatNearCanDescribeSelf)1452 TEST_F(FloatNearTest, FloatNearCanDescribeSelf) {
1453 Matcher<float> m1 = FloatNear(2.0f, 0.5f);
1454 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
1455 EXPECT_EQ("isn't approximately 2 (absolute error > 0.5)",
1456 DescribeNegation(m1));
1457
1458 Matcher<float> m2 = FloatNear(0.5f, 0.5f);
1459 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
1460 EXPECT_EQ("isn't approximately 0.5 (absolute error > 0.5)",
1461 DescribeNegation(m2));
1462
1463 Matcher<float> m3 = FloatNear(nan1_, 0.0);
1464 EXPECT_EQ("never matches", Describe(m3));
1465 EXPECT_EQ("is anything", DescribeNegation(m3));
1466 }
1467
TEST_F(FloatNearTest,NanSensitiveFloatNearCanDescribeSelf)1468 TEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {
1469 Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);
1470 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
1471 EXPECT_EQ("isn't approximately 2 (absolute error > 0.5)",
1472 DescribeNegation(m1));
1473
1474 Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);
1475 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
1476 EXPECT_EQ("isn't approximately 0.5 (absolute error > 0.5)",
1477 DescribeNegation(m2));
1478
1479 Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);
1480 EXPECT_EQ("is NaN", Describe(m3));
1481 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
1482 }
1483
TEST_F(FloatNearTest,FloatNearCannotMatchNaN)1484 TEST_F(FloatNearTest, FloatNearCannotMatchNaN) {
1485 // FloatNear never matches NaN.
1486 Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);
1487 EXPECT_FALSE(m.Matches(nan1_));
1488 EXPECT_FALSE(m.Matches(nan2_));
1489 EXPECT_FALSE(m.Matches(1.0));
1490 }
1491
TEST_F(FloatNearTest,NanSensitiveFloatNearCanMatchNaN)1492 TEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {
1493 // NanSensitiveFloatNear will match NaN.
1494 Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);
1495 EXPECT_TRUE(m.Matches(nan1_));
1496 EXPECT_TRUE(m.Matches(nan2_));
1497 EXPECT_FALSE(m.Matches(1.0));
1498 }
1499
1500 // Instantiate FloatingPointTest for testing doubles.
1501 typedef FloatingPointTest<double> DoubleTest;
1502
TEST_F(DoubleTest,DoubleEqApproximatelyMatchesDoubles)1503 TEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
1504 TestMatches(&DoubleEq);
1505 }
1506
TEST_F(DoubleTest,NanSensitiveDoubleEqApproximatelyMatchesDoubles)1507 TEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
1508 TestMatches(&NanSensitiveDoubleEq);
1509 }
1510
TEST_F(DoubleTest,DoubleEqCannotMatchNaN)1511 TEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
1512 // DoubleEq never matches NaN.
1513 Matcher<double> m = DoubleEq(nan1_);
1514 EXPECT_FALSE(m.Matches(nan1_));
1515 EXPECT_FALSE(m.Matches(nan2_));
1516 EXPECT_FALSE(m.Matches(1.0));
1517 }
1518
TEST_F(DoubleTest,NanSensitiveDoubleEqCanMatchNaN)1519 TEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
1520 // NanSensitiveDoubleEq will match NaN.
1521 Matcher<double> m = NanSensitiveDoubleEq(nan1_);
1522 EXPECT_TRUE(m.Matches(nan1_));
1523 EXPECT_TRUE(m.Matches(nan2_));
1524 EXPECT_FALSE(m.Matches(1.0));
1525 }
1526
TEST_F(DoubleTest,DoubleEqCanDescribeSelf)1527 TEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
1528 Matcher<double> m1 = DoubleEq(2.0);
1529 EXPECT_EQ("is approximately 2", Describe(m1));
1530 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
1531
1532 Matcher<double> m2 = DoubleEq(0.5);
1533 EXPECT_EQ("is approximately 0.5", Describe(m2));
1534 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
1535
1536 Matcher<double> m3 = DoubleEq(nan1_);
1537 EXPECT_EQ("never matches", Describe(m3));
1538 EXPECT_EQ("is anything", DescribeNegation(m3));
1539 }
1540
TEST_F(DoubleTest,NanSensitiveDoubleEqCanDescribeSelf)1541 TEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
1542 Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
1543 EXPECT_EQ("is approximately 2", Describe(m1));
1544 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
1545
1546 Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
1547 EXPECT_EQ("is approximately 0.5", Describe(m2));
1548 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
1549
1550 Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
1551 EXPECT_EQ("is NaN", Describe(m3));
1552 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
1553 }
1554
1555 // Instantiate FloatingPointTest for testing floats with a user-specified
1556 // max absolute error.
1557 typedef FloatingPointNearTest<double> DoubleNearTest;
1558
TEST_F(DoubleNearTest,DoubleNearMatches)1559 TEST_F(DoubleNearTest, DoubleNearMatches) { TestNearMatches(&DoubleNear); }
1560
TEST_F(DoubleNearTest,NanSensitiveDoubleNearApproximatelyMatchesDoubles)1561 TEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {
1562 TestNearMatches(&NanSensitiveDoubleNear);
1563 }
1564
TEST_F(DoubleNearTest,DoubleNearCanDescribeSelf)1565 TEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {
1566 Matcher<double> m1 = DoubleNear(2.0, 0.5);
1567 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
1568 EXPECT_EQ("isn't approximately 2 (absolute error > 0.5)",
1569 DescribeNegation(m1));
1570
1571 Matcher<double> m2 = DoubleNear(0.5, 0.5);
1572 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
1573 EXPECT_EQ("isn't approximately 0.5 (absolute error > 0.5)",
1574 DescribeNegation(m2));
1575
1576 Matcher<double> m3 = DoubleNear(nan1_, 0.0);
1577 EXPECT_EQ("never matches", Describe(m3));
1578 EXPECT_EQ("is anything", DescribeNegation(m3));
1579 }
1580
TEST_F(DoubleNearTest,ExplainsResultWhenMatchFails)1581 TEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) {
1582 EXPECT_EQ("", Explain(DoubleNear(2.0, 0.1), 2.05));
1583 EXPECT_EQ("which is 0.2 from 2", Explain(DoubleNear(2.0, 0.1), 2.2));
1584 EXPECT_EQ("which is -0.3 from 2", Explain(DoubleNear(2.0, 0.1), 1.7));
1585
1586 const std::string explanation =
1587 Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10);
1588 // Different C++ implementations may print floating-point numbers
1589 // slightly differently.
1590 EXPECT_TRUE(explanation == "which is 1.2e-10 from 2.1" || // GCC
1591 explanation == "which is 1.2e-010 from 2.1") // MSVC
1592 << " where explanation is \"" << explanation << "\".";
1593 }
1594
TEST_F(DoubleNearTest,NanSensitiveDoubleNearCanDescribeSelf)1595 TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {
1596 Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);
1597 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
1598 EXPECT_EQ("isn't approximately 2 (absolute error > 0.5)",
1599 DescribeNegation(m1));
1600
1601 Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);
1602 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
1603 EXPECT_EQ("isn't approximately 0.5 (absolute error > 0.5)",
1604 DescribeNegation(m2));
1605
1606 Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);
1607 EXPECT_EQ("is NaN", Describe(m3));
1608 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
1609 }
1610
TEST_F(DoubleNearTest,DoubleNearCannotMatchNaN)1611 TEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {
1612 // DoubleNear never matches NaN.
1613 Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);
1614 EXPECT_FALSE(m.Matches(nan1_));
1615 EXPECT_FALSE(m.Matches(nan2_));
1616 EXPECT_FALSE(m.Matches(1.0));
1617 }
1618
TEST_F(DoubleNearTest,NanSensitiveDoubleNearCanMatchNaN)1619 TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {
1620 // NanSensitiveDoubleNear will match NaN.
1621 Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);
1622 EXPECT_TRUE(m.Matches(nan1_));
1623 EXPECT_TRUE(m.Matches(nan2_));
1624 EXPECT_FALSE(m.Matches(1.0));
1625 }
1626
TEST(NotTest,WorksOnMoveOnlyType)1627 TEST(NotTest, WorksOnMoveOnlyType) {
1628 std::unique_ptr<int> p(new int(3));
1629 EXPECT_THAT(p, Pointee(Eq(3)));
1630 EXPECT_THAT(p, Not(Pointee(Eq(2))));
1631 }
1632
TEST(AllOfTest,HugeMatcher)1633 TEST(AllOfTest, HugeMatcher) {
1634 // Verify that using AllOf with many arguments doesn't cause
1635 // the compiler to exceed template instantiation depth limit.
1636 EXPECT_THAT(0, testing::AllOf(_, _, _, _, _, _, _, _, _,
1637 testing::AllOf(_, _, _, _, _, _, _, _, _, _)));
1638 }
1639
TEST(AnyOfTest,HugeMatcher)1640 TEST(AnyOfTest, HugeMatcher) {
1641 // Verify that using AnyOf with many arguments doesn't cause
1642 // the compiler to exceed template instantiation depth limit.
1643 EXPECT_THAT(0, testing::AnyOf(_, _, _, _, _, _, _, _, _,
1644 testing::AnyOf(_, _, _, _, _, _, _, _, _, _)));
1645 }
1646
1647 namespace adl_test {
1648
1649 // Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf
1650 // don't issue unqualified recursive calls. If they do, the argument dependent
1651 // name lookup will cause AllOf/AnyOf in the 'adl_test' namespace to be found
1652 // as a candidate and the compilation will break due to an ambiguous overload.
1653
1654 // The matcher must be in the same namespace as AllOf/AnyOf to make argument
1655 // dependent lookup find those.
1656 MATCHER(M, "") {
1657 (void)arg;
1658 return true;
1659 }
1660
1661 template <typename T1, typename T2>
AllOf(const T1 &,const T2 &)1662 bool AllOf(const T1& /*t1*/, const T2& /*t2*/) {
1663 return true;
1664 }
1665
TEST(AllOfTest,DoesNotCallAllOfUnqualified)1666 TEST(AllOfTest, DoesNotCallAllOfUnqualified) {
1667 EXPECT_THAT(42,
1668 testing::AllOf(M(), M(), M(), M(), M(), M(), M(), M(), M(), M()));
1669 }
1670
1671 template <typename T1, typename T2>
AnyOf(const T1 &,const T2 &)1672 bool AnyOf(const T1&, const T2&) {
1673 return true;
1674 }
1675
TEST(AnyOfTest,DoesNotCallAnyOfUnqualified)1676 TEST(AnyOfTest, DoesNotCallAnyOfUnqualified) {
1677 EXPECT_THAT(42,
1678 testing::AnyOf(M(), M(), M(), M(), M(), M(), M(), M(), M(), M()));
1679 }
1680
1681 } // namespace adl_test
1682
TEST(AllOfTest,WorksOnMoveOnlyType)1683 TEST(AllOfTest, WorksOnMoveOnlyType) {
1684 std::unique_ptr<int> p(new int(3));
1685 EXPECT_THAT(p, AllOf(Pointee(Eq(3)), Pointee(Gt(0)), Pointee(Lt(5))));
1686 EXPECT_THAT(p, Not(AllOf(Pointee(Eq(3)), Pointee(Gt(0)), Pointee(Lt(3)))));
1687 }
1688
TEST(AnyOfTest,WorksOnMoveOnlyType)1689 TEST(AnyOfTest, WorksOnMoveOnlyType) {
1690 std::unique_ptr<int> p(new int(3));
1691 EXPECT_THAT(p, AnyOf(Pointee(Eq(5)), Pointee(Lt(0)), Pointee(Lt(5))));
1692 EXPECT_THAT(p, Not(AnyOf(Pointee(Eq(5)), Pointee(Lt(0)), Pointee(Gt(5)))));
1693 }
1694
1695 } // namespace
1696 } // namespace gmock_matchers_test
1697 } // namespace testing
1698
1699 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4244 4100
1700