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