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