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 // The MATCHER* family of macros can be used in a namespace scope to
33*481dde66SAndroid Build Coastguard Worker // define custom matchers easily.
34*481dde66SAndroid Build Coastguard Worker //
35*481dde66SAndroid Build Coastguard Worker // Basic Usage
36*481dde66SAndroid Build Coastguard Worker // ===========
37*481dde66SAndroid Build Coastguard Worker //
38*481dde66SAndroid Build Coastguard Worker // The syntax
39*481dde66SAndroid Build Coastguard Worker //
40*481dde66SAndroid Build Coastguard Worker // MATCHER(name, description_string) { statements; }
41*481dde66SAndroid Build Coastguard Worker //
42*481dde66SAndroid Build Coastguard Worker // defines a matcher with the given name that executes the statements,
43*481dde66SAndroid Build Coastguard Worker // which must return a bool to indicate if the match succeeds. Inside
44*481dde66SAndroid Build Coastguard Worker // the statements, you can refer to the value being matched by 'arg',
45*481dde66SAndroid Build Coastguard Worker // and refer to its type by 'arg_type'.
46*481dde66SAndroid Build Coastguard Worker //
47*481dde66SAndroid Build Coastguard Worker // The description string documents what the matcher does, and is used
48*481dde66SAndroid Build Coastguard Worker // to generate the failure message when the match fails. Since a
49*481dde66SAndroid Build Coastguard Worker // MATCHER() is usually defined in a header file shared by multiple
50*481dde66SAndroid Build Coastguard Worker // C++ source files, we require the description to be a C-string
51*481dde66SAndroid Build Coastguard Worker // literal to avoid possible side effects. It can be empty, in which
52*481dde66SAndroid Build Coastguard Worker // case we'll use the sequence of words in the matcher name as the
53*481dde66SAndroid Build Coastguard Worker // description.
54*481dde66SAndroid Build Coastguard Worker //
55*481dde66SAndroid Build Coastguard Worker // For example:
56*481dde66SAndroid Build Coastguard Worker //
57*481dde66SAndroid Build Coastguard Worker // MATCHER(IsEven, "") { return (arg % 2) == 0; }
58*481dde66SAndroid Build Coastguard Worker //
59*481dde66SAndroid Build Coastguard Worker // allows you to write
60*481dde66SAndroid Build Coastguard Worker //
61*481dde66SAndroid Build Coastguard Worker // // Expects mock_foo.Bar(n) to be called where n is even.
62*481dde66SAndroid Build Coastguard Worker // EXPECT_CALL(mock_foo, Bar(IsEven()));
63*481dde66SAndroid Build Coastguard Worker //
64*481dde66SAndroid Build Coastguard Worker // or,
65*481dde66SAndroid Build Coastguard Worker //
66*481dde66SAndroid Build Coastguard Worker // // Verifies that the value of some_expression is even.
67*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(some_expression, IsEven());
68*481dde66SAndroid Build Coastguard Worker //
69*481dde66SAndroid Build Coastguard Worker // If the above assertion fails, it will print something like:
70*481dde66SAndroid Build Coastguard Worker //
71*481dde66SAndroid Build Coastguard Worker // Value of: some_expression
72*481dde66SAndroid Build Coastguard Worker // Expected: is even
73*481dde66SAndroid Build Coastguard Worker // Actual: 7
74*481dde66SAndroid Build Coastguard Worker //
75*481dde66SAndroid Build Coastguard Worker // where the description "is even" is automatically calculated from the
76*481dde66SAndroid Build Coastguard Worker // matcher name IsEven.
77*481dde66SAndroid Build Coastguard Worker //
78*481dde66SAndroid Build Coastguard Worker // Argument Type
79*481dde66SAndroid Build Coastguard Worker // =============
80*481dde66SAndroid Build Coastguard Worker //
81*481dde66SAndroid Build Coastguard Worker // Note that the type of the value being matched (arg_type) is
82*481dde66SAndroid Build Coastguard Worker // determined by the context in which you use the matcher and is
83*481dde66SAndroid Build Coastguard Worker // supplied to you by the compiler, so you don't need to worry about
84*481dde66SAndroid Build Coastguard Worker // declaring it (nor can you). This allows the matcher to be
85*481dde66SAndroid Build Coastguard Worker // polymorphic. For example, IsEven() can be used to match any type
86*481dde66SAndroid Build Coastguard Worker // where the value of "(arg % 2) == 0" can be implicitly converted to
87*481dde66SAndroid Build Coastguard Worker // a bool. In the "Bar(IsEven())" example above, if method Bar()
88*481dde66SAndroid Build Coastguard Worker // takes an int, 'arg_type' will be int; if it takes an unsigned long,
89*481dde66SAndroid Build Coastguard Worker // 'arg_type' will be unsigned long; and so on.
90*481dde66SAndroid Build Coastguard Worker //
91*481dde66SAndroid Build Coastguard Worker // Parameterizing Matchers
92*481dde66SAndroid Build Coastguard Worker // =======================
93*481dde66SAndroid Build Coastguard Worker //
94*481dde66SAndroid Build Coastguard Worker // Sometimes you'll want to parameterize the matcher. For that you
95*481dde66SAndroid Build Coastguard Worker // can use another macro:
96*481dde66SAndroid Build Coastguard Worker //
97*481dde66SAndroid Build Coastguard Worker // MATCHER_P(name, param_name, description_string) { statements; }
98*481dde66SAndroid Build Coastguard Worker //
99*481dde66SAndroid Build Coastguard Worker // For example:
100*481dde66SAndroid Build Coastguard Worker //
101*481dde66SAndroid Build Coastguard Worker // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
102*481dde66SAndroid Build Coastguard Worker //
103*481dde66SAndroid Build Coastguard Worker // will allow you to write:
104*481dde66SAndroid Build Coastguard Worker //
105*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
106*481dde66SAndroid Build Coastguard Worker //
107*481dde66SAndroid Build Coastguard Worker // which may lead to this message (assuming n is 10):
108*481dde66SAndroid Build Coastguard Worker //
109*481dde66SAndroid Build Coastguard Worker // Value of: Blah("a")
110*481dde66SAndroid Build Coastguard Worker // Expected: has absolute value 10
111*481dde66SAndroid Build Coastguard Worker // Actual: -9
112*481dde66SAndroid Build Coastguard Worker //
113*481dde66SAndroid Build Coastguard Worker // Note that both the matcher description and its parameter are
114*481dde66SAndroid Build Coastguard Worker // printed, making the message human-friendly.
115*481dde66SAndroid Build Coastguard Worker //
116*481dde66SAndroid Build Coastguard Worker // In the matcher definition body, you can write 'foo_type' to
117*481dde66SAndroid Build Coastguard Worker // reference the type of a parameter named 'foo'. For example, in the
118*481dde66SAndroid Build Coastguard Worker // body of MATCHER_P(HasAbsoluteValue, value) above, you can write
119*481dde66SAndroid Build Coastguard Worker // 'value_type' to refer to the type of 'value'.
120*481dde66SAndroid Build Coastguard Worker //
121*481dde66SAndroid Build Coastguard Worker // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to
122*481dde66SAndroid Build Coastguard Worker // support multi-parameter matchers.
123*481dde66SAndroid Build Coastguard Worker //
124*481dde66SAndroid Build Coastguard Worker // Describing Parameterized Matchers
125*481dde66SAndroid Build Coastguard Worker // =================================
126*481dde66SAndroid Build Coastguard Worker //
127*481dde66SAndroid Build Coastguard Worker // The last argument to MATCHER*() is a string-typed expression. The
128*481dde66SAndroid Build Coastguard Worker // expression can reference all of the matcher's parameters and a
129*481dde66SAndroid Build Coastguard Worker // special bool-typed variable named 'negation'. When 'negation' is
130*481dde66SAndroid Build Coastguard Worker // false, the expression should evaluate to the matcher's description;
131*481dde66SAndroid Build Coastguard Worker // otherwise it should evaluate to the description of the negation of
132*481dde66SAndroid Build Coastguard Worker // the matcher. For example,
133*481dde66SAndroid Build Coastguard Worker //
134*481dde66SAndroid Build Coastguard Worker // using testing::PrintToString;
135*481dde66SAndroid Build Coastguard Worker //
136*481dde66SAndroid Build Coastguard Worker // MATCHER_P2(InClosedRange, low, hi,
137*481dde66SAndroid Build Coastguard Worker // std::string(negation ? "is not" : "is") + " in range [" +
138*481dde66SAndroid Build Coastguard Worker // PrintToString(low) + ", " + PrintToString(hi) + "]") {
139*481dde66SAndroid Build Coastguard Worker // return low <= arg && arg <= hi;
140*481dde66SAndroid Build Coastguard Worker // }
141*481dde66SAndroid Build Coastguard Worker // ...
142*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(3, InClosedRange(4, 6));
143*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(3, Not(InClosedRange(2, 4)));
144*481dde66SAndroid Build Coastguard Worker //
145*481dde66SAndroid Build Coastguard Worker // would generate two failures that contain the text:
146*481dde66SAndroid Build Coastguard Worker //
147*481dde66SAndroid Build Coastguard Worker // Expected: is in range [4, 6]
148*481dde66SAndroid Build Coastguard Worker // ...
149*481dde66SAndroid Build Coastguard Worker // Expected: is not in range [2, 4]
150*481dde66SAndroid Build Coastguard Worker //
151*481dde66SAndroid Build Coastguard Worker // If you specify "" as the description, the failure message will
152*481dde66SAndroid Build Coastguard Worker // contain the sequence of words in the matcher name followed by the
153*481dde66SAndroid Build Coastguard Worker // parameter values printed as a tuple. For example,
154*481dde66SAndroid Build Coastguard Worker //
155*481dde66SAndroid Build Coastguard Worker // MATCHER_P2(InClosedRange, low, hi, "") { ... }
156*481dde66SAndroid Build Coastguard Worker // ...
157*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(3, InClosedRange(4, 6));
158*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(3, Not(InClosedRange(2, 4)));
159*481dde66SAndroid Build Coastguard Worker //
160*481dde66SAndroid Build Coastguard Worker // would generate two failures that contain the text:
161*481dde66SAndroid Build Coastguard Worker //
162*481dde66SAndroid Build Coastguard Worker // Expected: in closed range (4, 6)
163*481dde66SAndroid Build Coastguard Worker // ...
164*481dde66SAndroid Build Coastguard Worker // Expected: not (in closed range (2, 4))
165*481dde66SAndroid Build Coastguard Worker //
166*481dde66SAndroid Build Coastguard Worker // Types of Matcher Parameters
167*481dde66SAndroid Build Coastguard Worker // ===========================
168*481dde66SAndroid Build Coastguard Worker //
169*481dde66SAndroid Build Coastguard Worker // For the purpose of typing, you can view
170*481dde66SAndroid Build Coastguard Worker //
171*481dde66SAndroid Build Coastguard Worker // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
172*481dde66SAndroid Build Coastguard Worker //
173*481dde66SAndroid Build Coastguard Worker // as shorthand for
174*481dde66SAndroid Build Coastguard Worker //
175*481dde66SAndroid Build Coastguard Worker // template <typename p1_type, ..., typename pk_type>
176*481dde66SAndroid Build Coastguard Worker // FooMatcherPk<p1_type, ..., pk_type>
177*481dde66SAndroid Build Coastguard Worker // Foo(p1_type p1, ..., pk_type pk) { ... }
178*481dde66SAndroid Build Coastguard Worker //
179*481dde66SAndroid Build Coastguard Worker // When you write Foo(v1, ..., vk), the compiler infers the types of
180*481dde66SAndroid Build Coastguard Worker // the parameters v1, ..., and vk for you. If you are not happy with
181*481dde66SAndroid Build Coastguard Worker // the result of the type inference, you can specify the types by
182*481dde66SAndroid Build Coastguard Worker // explicitly instantiating the template, as in Foo<long, bool>(5,
183*481dde66SAndroid Build Coastguard Worker // false). As said earlier, you don't get to (or need to) specify
184*481dde66SAndroid Build Coastguard Worker // 'arg_type' as that's determined by the context in which the matcher
185*481dde66SAndroid Build Coastguard Worker // is used. You can assign the result of expression Foo(p1, ..., pk)
186*481dde66SAndroid Build Coastguard Worker // to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This
187*481dde66SAndroid Build Coastguard Worker // can be useful when composing matchers.
188*481dde66SAndroid Build Coastguard Worker //
189*481dde66SAndroid Build Coastguard Worker // While you can instantiate a matcher template with reference types,
190*481dde66SAndroid Build Coastguard Worker // passing the parameters by pointer usually makes your code more
191*481dde66SAndroid Build Coastguard Worker // readable. If, however, you still want to pass a parameter by
192*481dde66SAndroid Build Coastguard Worker // reference, be aware that in the failure message generated by the
193*481dde66SAndroid Build Coastguard Worker // matcher you will see the value of the referenced object but not its
194*481dde66SAndroid Build Coastguard Worker // address.
195*481dde66SAndroid Build Coastguard Worker //
196*481dde66SAndroid Build Coastguard Worker // Explaining Match Results
197*481dde66SAndroid Build Coastguard Worker // ========================
198*481dde66SAndroid Build Coastguard Worker //
199*481dde66SAndroid Build Coastguard Worker // Sometimes the matcher description alone isn't enough to explain why
200*481dde66SAndroid Build Coastguard Worker // the match has failed or succeeded. For example, when expecting a
201*481dde66SAndroid Build Coastguard Worker // long string, it can be very helpful to also print the diff between
202*481dde66SAndroid Build Coastguard Worker // the expected string and the actual one. To achieve that, you can
203*481dde66SAndroid Build Coastguard Worker // optionally stream additional information to a special variable
204*481dde66SAndroid Build Coastguard Worker // named result_listener, whose type is a pointer to class
205*481dde66SAndroid Build Coastguard Worker // MatchResultListener:
206*481dde66SAndroid Build Coastguard Worker //
207*481dde66SAndroid Build Coastguard Worker // MATCHER_P(EqualsLongString, str, "") {
208*481dde66SAndroid Build Coastguard Worker // if (arg == str) return true;
209*481dde66SAndroid Build Coastguard Worker //
210*481dde66SAndroid Build Coastguard Worker // *result_listener << "the difference: "
211*481dde66SAndroid Build Coastguard Worker /// << DiffStrings(str, arg);
212*481dde66SAndroid Build Coastguard Worker // return false;
213*481dde66SAndroid Build Coastguard Worker // }
214*481dde66SAndroid Build Coastguard Worker //
215*481dde66SAndroid Build Coastguard Worker // Overloading Matchers
216*481dde66SAndroid Build Coastguard Worker // ====================
217*481dde66SAndroid Build Coastguard Worker //
218*481dde66SAndroid Build Coastguard Worker // You can overload matchers with different numbers of parameters:
219*481dde66SAndroid Build Coastguard Worker //
220*481dde66SAndroid Build Coastguard Worker // MATCHER_P(Blah, a, description_string1) { ... }
221*481dde66SAndroid Build Coastguard Worker // MATCHER_P2(Blah, a, b, description_string2) { ... }
222*481dde66SAndroid Build Coastguard Worker //
223*481dde66SAndroid Build Coastguard Worker // Caveats
224*481dde66SAndroid Build Coastguard Worker // =======
225*481dde66SAndroid Build Coastguard Worker //
226*481dde66SAndroid Build Coastguard Worker // When defining a new matcher, you should also consider implementing
227*481dde66SAndroid Build Coastguard Worker // MatcherInterface or using MakePolymorphicMatcher(). These
228*481dde66SAndroid Build Coastguard Worker // approaches require more work than the MATCHER* macros, but also
229*481dde66SAndroid Build Coastguard Worker // give you more control on the types of the value being matched and
230*481dde66SAndroid Build Coastguard Worker // the matcher parameters, which may leads to better compiler error
231*481dde66SAndroid Build Coastguard Worker // messages when the matcher is used wrong. They also allow
232*481dde66SAndroid Build Coastguard Worker // overloading matchers based on parameter types (as opposed to just
233*481dde66SAndroid Build Coastguard Worker // based on the number of parameters).
234*481dde66SAndroid Build Coastguard Worker //
235*481dde66SAndroid Build Coastguard Worker // MATCHER*() can only be used in a namespace scope as templates cannot be
236*481dde66SAndroid Build Coastguard Worker // declared inside of a local class.
237*481dde66SAndroid Build Coastguard Worker //
238*481dde66SAndroid Build Coastguard Worker // More Information
239*481dde66SAndroid Build Coastguard Worker // ================
240*481dde66SAndroid Build Coastguard Worker //
241*481dde66SAndroid Build Coastguard Worker // To learn more about using these macros, please search for 'MATCHER'
242*481dde66SAndroid Build Coastguard Worker // on
243*481dde66SAndroid Build Coastguard Worker // https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md
244*481dde66SAndroid Build Coastguard Worker //
245*481dde66SAndroid Build Coastguard Worker // This file also implements some commonly used argument matchers. More
246*481dde66SAndroid Build Coastguard Worker // matchers can be defined by the user implementing the
247*481dde66SAndroid Build Coastguard Worker // MatcherInterface<T> interface if necessary.
248*481dde66SAndroid Build Coastguard Worker //
249*481dde66SAndroid Build Coastguard Worker // See googletest/include/gtest/gtest-matchers.h for the definition of class
250*481dde66SAndroid Build Coastguard Worker // Matcher, class MatcherInterface, and others.
251*481dde66SAndroid Build Coastguard Worker
252*481dde66SAndroid Build Coastguard Worker // IWYU pragma: private, include "gmock/gmock.h"
253*481dde66SAndroid Build Coastguard Worker // IWYU pragma: friend gmock/.*
254*481dde66SAndroid Build Coastguard Worker
255*481dde66SAndroid Build Coastguard Worker #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
256*481dde66SAndroid Build Coastguard Worker #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
257*481dde66SAndroid Build Coastguard Worker
258*481dde66SAndroid Build Coastguard Worker #include <algorithm>
259*481dde66SAndroid Build Coastguard Worker #include <cmath>
260*481dde66SAndroid Build Coastguard Worker #include <exception>
261*481dde66SAndroid Build Coastguard Worker #include <functional>
262*481dde66SAndroid Build Coastguard Worker #include <initializer_list>
263*481dde66SAndroid Build Coastguard Worker #include <ios>
264*481dde66SAndroid Build Coastguard Worker #include <iterator>
265*481dde66SAndroid Build Coastguard Worker #include <limits>
266*481dde66SAndroid Build Coastguard Worker #include <memory>
267*481dde66SAndroid Build Coastguard Worker #include <ostream> // NOLINT
268*481dde66SAndroid Build Coastguard Worker #include <sstream>
269*481dde66SAndroid Build Coastguard Worker #include <string>
270*481dde66SAndroid Build Coastguard Worker #include <type_traits>
271*481dde66SAndroid Build Coastguard Worker #include <utility>
272*481dde66SAndroid Build Coastguard Worker #include <vector>
273*481dde66SAndroid Build Coastguard Worker
274*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-internal-utils.h"
275*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-port.h"
276*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-pp.h"
277*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
278*481dde66SAndroid Build Coastguard Worker
279*481dde66SAndroid Build Coastguard Worker // MSVC warning C5046 is new as of VS2017 version 15.8.
280*481dde66SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER >= 1915
281*481dde66SAndroid Build Coastguard Worker #define GMOCK_MAYBE_5046_ 5046
282*481dde66SAndroid Build Coastguard Worker #else
283*481dde66SAndroid Build Coastguard Worker #define GMOCK_MAYBE_5046_
284*481dde66SAndroid Build Coastguard Worker #endif
285*481dde66SAndroid Build Coastguard Worker
286*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_PUSH_(
287*481dde66SAndroid Build Coastguard Worker 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by
288*481dde66SAndroid Build Coastguard Worker clients of class B */
289*481dde66SAndroid Build Coastguard Worker /* Symbol involving type with internal linkage not defined */)
290*481dde66SAndroid Build Coastguard Worker
291*481dde66SAndroid Build Coastguard Worker #pragma GCC system_header
292*481dde66SAndroid Build Coastguard Worker
293*481dde66SAndroid Build Coastguard Worker namespace testing {
294*481dde66SAndroid Build Coastguard Worker
295*481dde66SAndroid Build Coastguard Worker // To implement a matcher Foo for type T, define:
296*481dde66SAndroid Build Coastguard Worker // 1. a class FooMatcherImpl that implements the
297*481dde66SAndroid Build Coastguard Worker // MatcherInterface<T> interface, and
298*481dde66SAndroid Build Coastguard Worker // 2. a factory function that creates a Matcher<T> object from a
299*481dde66SAndroid Build Coastguard Worker // FooMatcherImpl*.
300*481dde66SAndroid Build Coastguard Worker //
301*481dde66SAndroid Build Coastguard Worker // The two-level delegation design makes it possible to allow a user
302*481dde66SAndroid Build Coastguard Worker // to write "v" instead of "Eq(v)" where a Matcher is expected, which
303*481dde66SAndroid Build Coastguard Worker // is impossible if we pass matchers by pointers. It also eases
304*481dde66SAndroid Build Coastguard Worker // ownership management as Matcher objects can now be copied like
305*481dde66SAndroid Build Coastguard Worker // plain values.
306*481dde66SAndroid Build Coastguard Worker
307*481dde66SAndroid Build Coastguard Worker // A match result listener that stores the explanation in a string.
308*481dde66SAndroid Build Coastguard Worker class StringMatchResultListener : public MatchResultListener {
309*481dde66SAndroid Build Coastguard Worker public:
StringMatchResultListener()310*481dde66SAndroid Build Coastguard Worker StringMatchResultListener() : MatchResultListener(&ss_) {}
311*481dde66SAndroid Build Coastguard Worker
312*481dde66SAndroid Build Coastguard Worker // Returns the explanation accumulated so far.
str()313*481dde66SAndroid Build Coastguard Worker std::string str() const { return ss_.str(); }
314*481dde66SAndroid Build Coastguard Worker
315*481dde66SAndroid Build Coastguard Worker // Clears the explanation accumulated so far.
Clear()316*481dde66SAndroid Build Coastguard Worker void Clear() { ss_.str(""); }
317*481dde66SAndroid Build Coastguard Worker
318*481dde66SAndroid Build Coastguard Worker private:
319*481dde66SAndroid Build Coastguard Worker ::std::stringstream ss_;
320*481dde66SAndroid Build Coastguard Worker
321*481dde66SAndroid Build Coastguard Worker StringMatchResultListener(const StringMatchResultListener&) = delete;
322*481dde66SAndroid Build Coastguard Worker StringMatchResultListener& operator=(const StringMatchResultListener&) =
323*481dde66SAndroid Build Coastguard Worker delete;
324*481dde66SAndroid Build Coastguard Worker };
325*481dde66SAndroid Build Coastguard Worker
326*481dde66SAndroid Build Coastguard Worker // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
327*481dde66SAndroid Build Coastguard Worker // and MUST NOT BE USED IN USER CODE!!!
328*481dde66SAndroid Build Coastguard Worker namespace internal {
329*481dde66SAndroid Build Coastguard Worker
330*481dde66SAndroid Build Coastguard Worker // The MatcherCastImpl class template is a helper for implementing
331*481dde66SAndroid Build Coastguard Worker // MatcherCast(). We need this helper in order to partially
332*481dde66SAndroid Build Coastguard Worker // specialize the implementation of MatcherCast() (C++ allows
333*481dde66SAndroid Build Coastguard Worker // class/struct templates to be partially specialized, but not
334*481dde66SAndroid Build Coastguard Worker // function templates.).
335*481dde66SAndroid Build Coastguard Worker
336*481dde66SAndroid Build Coastguard Worker // This general version is used when MatcherCast()'s argument is a
337*481dde66SAndroid Build Coastguard Worker // polymorphic matcher (i.e. something that can be converted to a
338*481dde66SAndroid Build Coastguard Worker // Matcher but is not one yet; for example, Eq(value)) or a value (for
339*481dde66SAndroid Build Coastguard Worker // example, "hello").
340*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
341*481dde66SAndroid Build Coastguard Worker class MatcherCastImpl {
342*481dde66SAndroid Build Coastguard Worker public:
Cast(const M & polymorphic_matcher_or_value)343*481dde66SAndroid Build Coastguard Worker static Matcher<T> Cast(const M& polymorphic_matcher_or_value) {
344*481dde66SAndroid Build Coastguard Worker // M can be a polymorphic matcher, in which case we want to use
345*481dde66SAndroid Build Coastguard Worker // its conversion operator to create Matcher<T>. Or it can be a value
346*481dde66SAndroid Build Coastguard Worker // that should be passed to the Matcher<T>'s constructor.
347*481dde66SAndroid Build Coastguard Worker //
348*481dde66SAndroid Build Coastguard Worker // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
349*481dde66SAndroid Build Coastguard Worker // polymorphic matcher because it'll be ambiguous if T has an implicit
350*481dde66SAndroid Build Coastguard Worker // constructor from M (this usually happens when T has an implicit
351*481dde66SAndroid Build Coastguard Worker // constructor from any type).
352*481dde66SAndroid Build Coastguard Worker //
353*481dde66SAndroid Build Coastguard Worker // It won't work to unconditionally implicit_cast
354*481dde66SAndroid Build Coastguard Worker // polymorphic_matcher_or_value to Matcher<T> because it won't trigger
355*481dde66SAndroid Build Coastguard Worker // a user-defined conversion from M to T if one exists (assuming M is
356*481dde66SAndroid Build Coastguard Worker // a value).
357*481dde66SAndroid Build Coastguard Worker return CastImpl(polymorphic_matcher_or_value,
358*481dde66SAndroid Build Coastguard Worker std::is_convertible<M, Matcher<T>>{},
359*481dde66SAndroid Build Coastguard Worker std::is_convertible<M, T>{});
360*481dde66SAndroid Build Coastguard Worker }
361*481dde66SAndroid Build Coastguard Worker
362*481dde66SAndroid Build Coastguard Worker private:
363*481dde66SAndroid Build Coastguard Worker template <bool Ignore>
CastImpl(const M & polymorphic_matcher_or_value,std::true_type,std::integral_constant<bool,Ignore>)364*481dde66SAndroid Build Coastguard Worker static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,
365*481dde66SAndroid Build Coastguard Worker std::true_type /* convertible_to_matcher */,
366*481dde66SAndroid Build Coastguard Worker std::integral_constant<bool, Ignore>) {
367*481dde66SAndroid Build Coastguard Worker // M is implicitly convertible to Matcher<T>, which means that either
368*481dde66SAndroid Build Coastguard Worker // M is a polymorphic matcher or Matcher<T> has an implicit constructor
369*481dde66SAndroid Build Coastguard Worker // from M. In both cases using the implicit conversion will produce a
370*481dde66SAndroid Build Coastguard Worker // matcher.
371*481dde66SAndroid Build Coastguard Worker //
372*481dde66SAndroid Build Coastguard Worker // Even if T has an implicit constructor from M, it won't be called because
373*481dde66SAndroid Build Coastguard Worker // creating Matcher<T> would require a chain of two user-defined conversions
374*481dde66SAndroid Build Coastguard Worker // (first to create T from M and then to create Matcher<T> from T).
375*481dde66SAndroid Build Coastguard Worker return polymorphic_matcher_or_value;
376*481dde66SAndroid Build Coastguard Worker }
377*481dde66SAndroid Build Coastguard Worker
378*481dde66SAndroid Build Coastguard Worker // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
379*481dde66SAndroid Build Coastguard Worker // matcher. It's a value of a type implicitly convertible to T. Use direct
380*481dde66SAndroid Build Coastguard Worker // initialization to create a matcher.
CastImpl(const M & value,std::false_type,std::true_type)381*481dde66SAndroid Build Coastguard Worker static Matcher<T> CastImpl(const M& value,
382*481dde66SAndroid Build Coastguard Worker std::false_type /* convertible_to_matcher */,
383*481dde66SAndroid Build Coastguard Worker std::true_type /* convertible_to_T */) {
384*481dde66SAndroid Build Coastguard Worker return Matcher<T>(ImplicitCast_<T>(value));
385*481dde66SAndroid Build Coastguard Worker }
386*481dde66SAndroid Build Coastguard Worker
387*481dde66SAndroid Build Coastguard Worker // M can't be implicitly converted to either Matcher<T> or T. Attempt to use
388*481dde66SAndroid Build Coastguard Worker // polymorphic matcher Eq(value) in this case.
389*481dde66SAndroid Build Coastguard Worker //
390*481dde66SAndroid Build Coastguard Worker // Note that we first attempt to perform an implicit cast on the value and
391*481dde66SAndroid Build Coastguard Worker // only fall back to the polymorphic Eq() matcher afterwards because the
392*481dde66SAndroid Build Coastguard Worker // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end
393*481dde66SAndroid Build Coastguard Worker // which might be undefined even when Rhs is implicitly convertible to Lhs
394*481dde66SAndroid Build Coastguard Worker // (e.g. std::pair<const int, int> vs. std::pair<int, int>).
395*481dde66SAndroid Build Coastguard Worker //
396*481dde66SAndroid Build Coastguard Worker // We don't define this method inline as we need the declaration of Eq().
397*481dde66SAndroid Build Coastguard Worker static Matcher<T> CastImpl(const M& value,
398*481dde66SAndroid Build Coastguard Worker std::false_type /* convertible_to_matcher */,
399*481dde66SAndroid Build Coastguard Worker std::false_type /* convertible_to_T */);
400*481dde66SAndroid Build Coastguard Worker };
401*481dde66SAndroid Build Coastguard Worker
402*481dde66SAndroid Build Coastguard Worker // This more specialized version is used when MatcherCast()'s argument
403*481dde66SAndroid Build Coastguard Worker // is already a Matcher. This only compiles when type T can be
404*481dde66SAndroid Build Coastguard Worker // statically converted to type U.
405*481dde66SAndroid Build Coastguard Worker template <typename T, typename U>
406*481dde66SAndroid Build Coastguard Worker class MatcherCastImpl<T, Matcher<U>> {
407*481dde66SAndroid Build Coastguard Worker public:
Cast(const Matcher<U> & source_matcher)408*481dde66SAndroid Build Coastguard Worker static Matcher<T> Cast(const Matcher<U>& source_matcher) {
409*481dde66SAndroid Build Coastguard Worker return Matcher<T>(new Impl(source_matcher));
410*481dde66SAndroid Build Coastguard Worker }
411*481dde66SAndroid Build Coastguard Worker
412*481dde66SAndroid Build Coastguard Worker private:
413*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<T> {
414*481dde66SAndroid Build Coastguard Worker public:
Impl(const Matcher<U> & source_matcher)415*481dde66SAndroid Build Coastguard Worker explicit Impl(const Matcher<U>& source_matcher)
416*481dde66SAndroid Build Coastguard Worker : source_matcher_(source_matcher) {}
417*481dde66SAndroid Build Coastguard Worker
418*481dde66SAndroid Build Coastguard Worker // We delegate the matching logic to the source matcher.
MatchAndExplain(T x,MatchResultListener * listener)419*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T x, MatchResultListener* listener) const override {
420*481dde66SAndroid Build Coastguard Worker using FromType = typename std::remove_cv<typename std::remove_pointer<
421*481dde66SAndroid Build Coastguard Worker typename std::remove_reference<T>::type>::type>::type;
422*481dde66SAndroid Build Coastguard Worker using ToType = typename std::remove_cv<typename std::remove_pointer<
423*481dde66SAndroid Build Coastguard Worker typename std::remove_reference<U>::type>::type>::type;
424*481dde66SAndroid Build Coastguard Worker // Do not allow implicitly converting base*/& to derived*/&.
425*481dde66SAndroid Build Coastguard Worker static_assert(
426*481dde66SAndroid Build Coastguard Worker // Do not trigger if only one of them is a pointer. That implies a
427*481dde66SAndroid Build Coastguard Worker // regular conversion and not a down_cast.
428*481dde66SAndroid Build Coastguard Worker (std::is_pointer<typename std::remove_reference<T>::type>::value !=
429*481dde66SAndroid Build Coastguard Worker std::is_pointer<typename std::remove_reference<U>::type>::value) ||
430*481dde66SAndroid Build Coastguard Worker std::is_same<FromType, ToType>::value ||
431*481dde66SAndroid Build Coastguard Worker !std::is_base_of<FromType, ToType>::value,
432*481dde66SAndroid Build Coastguard Worker "Can't implicitly convert from <base> to <derived>");
433*481dde66SAndroid Build Coastguard Worker
434*481dde66SAndroid Build Coastguard Worker // Do the cast to `U` explicitly if necessary.
435*481dde66SAndroid Build Coastguard Worker // Otherwise, let implicit conversions do the trick.
436*481dde66SAndroid Build Coastguard Worker using CastType =
437*481dde66SAndroid Build Coastguard Worker typename std::conditional<std::is_convertible<T&, const U&>::value,
438*481dde66SAndroid Build Coastguard Worker T&, U>::type;
439*481dde66SAndroid Build Coastguard Worker
440*481dde66SAndroid Build Coastguard Worker return source_matcher_.MatchAndExplain(static_cast<CastType>(x),
441*481dde66SAndroid Build Coastguard Worker listener);
442*481dde66SAndroid Build Coastguard Worker }
443*481dde66SAndroid Build Coastguard Worker
DescribeTo(::std::ostream * os)444*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
445*481dde66SAndroid Build Coastguard Worker source_matcher_.DescribeTo(os);
446*481dde66SAndroid Build Coastguard Worker }
447*481dde66SAndroid Build Coastguard Worker
DescribeNegationTo(::std::ostream * os)448*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
449*481dde66SAndroid Build Coastguard Worker source_matcher_.DescribeNegationTo(os);
450*481dde66SAndroid Build Coastguard Worker }
451*481dde66SAndroid Build Coastguard Worker
452*481dde66SAndroid Build Coastguard Worker private:
453*481dde66SAndroid Build Coastguard Worker const Matcher<U> source_matcher_;
454*481dde66SAndroid Build Coastguard Worker };
455*481dde66SAndroid Build Coastguard Worker };
456*481dde66SAndroid Build Coastguard Worker
457*481dde66SAndroid Build Coastguard Worker // This even more specialized version is used for efficiently casting
458*481dde66SAndroid Build Coastguard Worker // a matcher to its own type.
459*481dde66SAndroid Build Coastguard Worker template <typename T>
460*481dde66SAndroid Build Coastguard Worker class MatcherCastImpl<T, Matcher<T>> {
461*481dde66SAndroid Build Coastguard Worker public:
Cast(const Matcher<T> & matcher)462*481dde66SAndroid Build Coastguard Worker static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
463*481dde66SAndroid Build Coastguard Worker };
464*481dde66SAndroid Build Coastguard Worker
465*481dde66SAndroid Build Coastguard Worker // Template specialization for parameterless Matcher.
466*481dde66SAndroid Build Coastguard Worker template <typename Derived>
467*481dde66SAndroid Build Coastguard Worker class MatcherBaseImpl {
468*481dde66SAndroid Build Coastguard Worker public:
469*481dde66SAndroid Build Coastguard Worker MatcherBaseImpl() = default;
470*481dde66SAndroid Build Coastguard Worker
471*481dde66SAndroid Build Coastguard Worker template <typename T>
472*481dde66SAndroid Build Coastguard Worker operator ::testing::Matcher<T>() const { // NOLINT(runtime/explicit)
473*481dde66SAndroid Build Coastguard Worker return ::testing::Matcher<T>(new
474*481dde66SAndroid Build Coastguard Worker typename Derived::template gmock_Impl<T>());
475*481dde66SAndroid Build Coastguard Worker }
476*481dde66SAndroid Build Coastguard Worker };
477*481dde66SAndroid Build Coastguard Worker
478*481dde66SAndroid Build Coastguard Worker // Template specialization for Matcher with parameters.
479*481dde66SAndroid Build Coastguard Worker template <template <typename...> class Derived, typename... Ts>
480*481dde66SAndroid Build Coastguard Worker class MatcherBaseImpl<Derived<Ts...>> {
481*481dde66SAndroid Build Coastguard Worker public:
482*481dde66SAndroid Build Coastguard Worker // Mark the constructor explicit for single argument T to avoid implicit
483*481dde66SAndroid Build Coastguard Worker // conversions.
484*481dde66SAndroid Build Coastguard Worker template <typename E = std::enable_if<sizeof...(Ts) == 1>,
485*481dde66SAndroid Build Coastguard Worker typename E::type* = nullptr>
MatcherBaseImpl(Ts...params)486*481dde66SAndroid Build Coastguard Worker explicit MatcherBaseImpl(Ts... params)
487*481dde66SAndroid Build Coastguard Worker : params_(std::forward<Ts>(params)...) {}
488*481dde66SAndroid Build Coastguard Worker template <typename E = std::enable_if<sizeof...(Ts) != 1>,
489*481dde66SAndroid Build Coastguard Worker typename = typename E::type>
MatcherBaseImpl(Ts...params)490*481dde66SAndroid Build Coastguard Worker MatcherBaseImpl(Ts... params) // NOLINT
491*481dde66SAndroid Build Coastguard Worker : params_(std::forward<Ts>(params)...) {}
492*481dde66SAndroid Build Coastguard Worker
493*481dde66SAndroid Build Coastguard Worker template <typename F>
494*481dde66SAndroid Build Coastguard Worker operator ::testing::Matcher<F>() const { // NOLINT(runtime/explicit)
495*481dde66SAndroid Build Coastguard Worker return Apply<F>(std::make_index_sequence<sizeof...(Ts)>{});
496*481dde66SAndroid Build Coastguard Worker }
497*481dde66SAndroid Build Coastguard Worker
498*481dde66SAndroid Build Coastguard Worker private:
499*481dde66SAndroid Build Coastguard Worker template <typename F, std::size_t... tuple_ids>
Apply(std::index_sequence<tuple_ids...>)500*481dde66SAndroid Build Coastguard Worker ::testing::Matcher<F> Apply(std::index_sequence<tuple_ids...>) const {
501*481dde66SAndroid Build Coastguard Worker return ::testing::Matcher<F>(
502*481dde66SAndroid Build Coastguard Worker new typename Derived<Ts...>::template gmock_Impl<F>(
503*481dde66SAndroid Build Coastguard Worker std::get<tuple_ids>(params_)...));
504*481dde66SAndroid Build Coastguard Worker }
505*481dde66SAndroid Build Coastguard Worker
506*481dde66SAndroid Build Coastguard Worker const std::tuple<Ts...> params_;
507*481dde66SAndroid Build Coastguard Worker };
508*481dde66SAndroid Build Coastguard Worker
509*481dde66SAndroid Build Coastguard Worker } // namespace internal
510*481dde66SAndroid Build Coastguard Worker
511*481dde66SAndroid Build Coastguard Worker // In order to be safe and clear, casting between different matcher
512*481dde66SAndroid Build Coastguard Worker // types is done explicitly via MatcherCast<T>(m), which takes a
513*481dde66SAndroid Build Coastguard Worker // matcher m and returns a Matcher<T>. It compiles only when T can be
514*481dde66SAndroid Build Coastguard Worker // statically converted to the argument type of m.
515*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
MatcherCast(const M & matcher)516*481dde66SAndroid Build Coastguard Worker inline Matcher<T> MatcherCast(const M& matcher) {
517*481dde66SAndroid Build Coastguard Worker return internal::MatcherCastImpl<T, M>::Cast(matcher);
518*481dde66SAndroid Build Coastguard Worker }
519*481dde66SAndroid Build Coastguard Worker
520*481dde66SAndroid Build Coastguard Worker // This overload handles polymorphic matchers and values only since
521*481dde66SAndroid Build Coastguard Worker // monomorphic matchers are handled by the next one.
522*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
SafeMatcherCast(const M & polymorphic_matcher_or_value)523*481dde66SAndroid Build Coastguard Worker inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher_or_value) {
524*481dde66SAndroid Build Coastguard Worker return MatcherCast<T>(polymorphic_matcher_or_value);
525*481dde66SAndroid Build Coastguard Worker }
526*481dde66SAndroid Build Coastguard Worker
527*481dde66SAndroid Build Coastguard Worker // This overload handles monomorphic matchers.
528*481dde66SAndroid Build Coastguard Worker //
529*481dde66SAndroid Build Coastguard Worker // In general, if type T can be implicitly converted to type U, we can
530*481dde66SAndroid Build Coastguard Worker // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
531*481dde66SAndroid Build Coastguard Worker // contravariant): just keep a copy of the original Matcher<U>, convert the
532*481dde66SAndroid Build Coastguard Worker // argument from type T to U, and then pass it to the underlying Matcher<U>.
533*481dde66SAndroid Build Coastguard Worker // The only exception is when U is a reference and T is not, as the
534*481dde66SAndroid Build Coastguard Worker // underlying Matcher<U> may be interested in the argument's address, which
535*481dde66SAndroid Build Coastguard Worker // is not preserved in the conversion from T to U.
536*481dde66SAndroid Build Coastguard Worker template <typename T, typename U>
SafeMatcherCast(const Matcher<U> & matcher)537*481dde66SAndroid Build Coastguard Worker inline Matcher<T> SafeMatcherCast(const Matcher<U>& matcher) {
538*481dde66SAndroid Build Coastguard Worker // Enforce that T can be implicitly converted to U.
539*481dde66SAndroid Build Coastguard Worker static_assert(std::is_convertible<const T&, const U&>::value,
540*481dde66SAndroid Build Coastguard Worker "T must be implicitly convertible to U");
541*481dde66SAndroid Build Coastguard Worker // Enforce that we are not converting a non-reference type T to a reference
542*481dde66SAndroid Build Coastguard Worker // type U.
543*481dde66SAndroid Build Coastguard Worker static_assert(std::is_reference<T>::value || !std::is_reference<U>::value,
544*481dde66SAndroid Build Coastguard Worker "cannot convert non reference arg to reference");
545*481dde66SAndroid Build Coastguard Worker // In case both T and U are arithmetic types, enforce that the
546*481dde66SAndroid Build Coastguard Worker // conversion is not lossy.
547*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;
548*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;
549*481dde66SAndroid Build Coastguard Worker constexpr bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;
550*481dde66SAndroid Build Coastguard Worker constexpr bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;
551*481dde66SAndroid Build Coastguard Worker static_assert(
552*481dde66SAndroid Build Coastguard Worker kTIsOther || kUIsOther ||
553*481dde66SAndroid Build Coastguard Worker (internal::LosslessArithmeticConvertible<RawT, RawU>::value),
554*481dde66SAndroid Build Coastguard Worker "conversion of arithmetic types must be lossless");
555*481dde66SAndroid Build Coastguard Worker return MatcherCast<T>(matcher);
556*481dde66SAndroid Build Coastguard Worker }
557*481dde66SAndroid Build Coastguard Worker
558*481dde66SAndroid Build Coastguard Worker // A<T>() returns a matcher that matches any value of type T.
559*481dde66SAndroid Build Coastguard Worker template <typename T>
560*481dde66SAndroid Build Coastguard Worker Matcher<T> A();
561*481dde66SAndroid Build Coastguard Worker
562*481dde66SAndroid Build Coastguard Worker // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
563*481dde66SAndroid Build Coastguard Worker // and MUST NOT BE USED IN USER CODE!!!
564*481dde66SAndroid Build Coastguard Worker namespace internal {
565*481dde66SAndroid Build Coastguard Worker
566*481dde66SAndroid Build Coastguard Worker // If the explanation is not empty, prints it to the ostream.
PrintIfNotEmpty(const std::string & explanation,::std::ostream * os)567*481dde66SAndroid Build Coastguard Worker inline void PrintIfNotEmpty(const std::string& explanation,
568*481dde66SAndroid Build Coastguard Worker ::std::ostream* os) {
569*481dde66SAndroid Build Coastguard Worker if (!explanation.empty() && os != nullptr) {
570*481dde66SAndroid Build Coastguard Worker *os << ", " << explanation;
571*481dde66SAndroid Build Coastguard Worker }
572*481dde66SAndroid Build Coastguard Worker }
573*481dde66SAndroid Build Coastguard Worker
574*481dde66SAndroid Build Coastguard Worker // Returns true if the given type name is easy to read by a human.
575*481dde66SAndroid Build Coastguard Worker // This is used to decide whether printing the type of a value might
576*481dde66SAndroid Build Coastguard Worker // be helpful.
IsReadableTypeName(const std::string & type_name)577*481dde66SAndroid Build Coastguard Worker inline bool IsReadableTypeName(const std::string& type_name) {
578*481dde66SAndroid Build Coastguard Worker // We consider a type name readable if it's short or doesn't contain
579*481dde66SAndroid Build Coastguard Worker // a template or function type.
580*481dde66SAndroid Build Coastguard Worker return (type_name.length() <= 20 ||
581*481dde66SAndroid Build Coastguard Worker type_name.find_first_of("<(") == std::string::npos);
582*481dde66SAndroid Build Coastguard Worker }
583*481dde66SAndroid Build Coastguard Worker
584*481dde66SAndroid Build Coastguard Worker // Matches the value against the given matcher, prints the value and explains
585*481dde66SAndroid Build Coastguard Worker // the match result to the listener. Returns the match result.
586*481dde66SAndroid Build Coastguard Worker // 'listener' must not be NULL.
587*481dde66SAndroid Build Coastguard Worker // Value cannot be passed by const reference, because some matchers take a
588*481dde66SAndroid Build Coastguard Worker // non-const argument.
589*481dde66SAndroid Build Coastguard Worker template <typename Value, typename T>
MatchPrintAndExplain(Value & value,const Matcher<T> & matcher,MatchResultListener * listener)590*481dde66SAndroid Build Coastguard Worker bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
591*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) {
592*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
593*481dde66SAndroid Build Coastguard Worker // If the listener is not interested, we do not need to construct the
594*481dde66SAndroid Build Coastguard Worker // inner explanation.
595*481dde66SAndroid Build Coastguard Worker return matcher.Matches(value);
596*481dde66SAndroid Build Coastguard Worker }
597*481dde66SAndroid Build Coastguard Worker
598*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
599*481dde66SAndroid Build Coastguard Worker const bool match = matcher.MatchAndExplain(value, &inner_listener);
600*481dde66SAndroid Build Coastguard Worker
601*481dde66SAndroid Build Coastguard Worker UniversalPrint(value, listener->stream());
602*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
603*481dde66SAndroid Build Coastguard Worker const std::string& type_name = GetTypeName<Value>();
604*481dde66SAndroid Build Coastguard Worker if (IsReadableTypeName(type_name))
605*481dde66SAndroid Build Coastguard Worker *listener->stream() << " (of type " << type_name << ")";
606*481dde66SAndroid Build Coastguard Worker #endif
607*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener.str(), listener->stream());
608*481dde66SAndroid Build Coastguard Worker
609*481dde66SAndroid Build Coastguard Worker return match;
610*481dde66SAndroid Build Coastguard Worker }
611*481dde66SAndroid Build Coastguard Worker
612*481dde66SAndroid Build Coastguard Worker // An internal helper class for doing compile-time loop on a tuple's
613*481dde66SAndroid Build Coastguard Worker // fields.
614*481dde66SAndroid Build Coastguard Worker template <size_t N>
615*481dde66SAndroid Build Coastguard Worker class TuplePrefix {
616*481dde66SAndroid Build Coastguard Worker public:
617*481dde66SAndroid Build Coastguard Worker // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
618*481dde66SAndroid Build Coastguard Worker // if and only if the first N fields of matcher_tuple matches
619*481dde66SAndroid Build Coastguard Worker // the first N fields of value_tuple, respectively.
620*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
Matches(const MatcherTuple & matcher_tuple,const ValueTuple & value_tuple)621*481dde66SAndroid Build Coastguard Worker static bool Matches(const MatcherTuple& matcher_tuple,
622*481dde66SAndroid Build Coastguard Worker const ValueTuple& value_tuple) {
623*481dde66SAndroid Build Coastguard Worker return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) &&
624*481dde66SAndroid Build Coastguard Worker std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple));
625*481dde66SAndroid Build Coastguard Worker }
626*481dde66SAndroid Build Coastguard Worker
627*481dde66SAndroid Build Coastguard Worker // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
628*481dde66SAndroid Build Coastguard Worker // describes failures in matching the first N fields of matchers
629*481dde66SAndroid Build Coastguard Worker // against the first N fields of values. If there is no failure,
630*481dde66SAndroid Build Coastguard Worker // nothing will be streamed to os.
631*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
ExplainMatchFailuresTo(const MatcherTuple & matchers,const ValueTuple & values,::std::ostream * os)632*481dde66SAndroid Build Coastguard Worker static void ExplainMatchFailuresTo(const MatcherTuple& matchers,
633*481dde66SAndroid Build Coastguard Worker const ValueTuple& values,
634*481dde66SAndroid Build Coastguard Worker ::std::ostream* os) {
635*481dde66SAndroid Build Coastguard Worker // First, describes failures in the first N - 1 fields.
636*481dde66SAndroid Build Coastguard Worker TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);
637*481dde66SAndroid Build Coastguard Worker
638*481dde66SAndroid Build Coastguard Worker // Then describes the failure (if any) in the (N - 1)-th (0-based)
639*481dde66SAndroid Build Coastguard Worker // field.
640*481dde66SAndroid Build Coastguard Worker typename std::tuple_element<N - 1, MatcherTuple>::type matcher =
641*481dde66SAndroid Build Coastguard Worker std::get<N - 1>(matchers);
642*481dde66SAndroid Build Coastguard Worker typedef typename std::tuple_element<N - 1, ValueTuple>::type Value;
643*481dde66SAndroid Build Coastguard Worker const Value& value = std::get<N - 1>(values);
644*481dde66SAndroid Build Coastguard Worker StringMatchResultListener listener;
645*481dde66SAndroid Build Coastguard Worker if (!matcher.MatchAndExplain(value, &listener)) {
646*481dde66SAndroid Build Coastguard Worker *os << " Expected arg #" << N - 1 << ": ";
647*481dde66SAndroid Build Coastguard Worker std::get<N - 1>(matchers).DescribeTo(os);
648*481dde66SAndroid Build Coastguard Worker *os << "\n Actual: ";
649*481dde66SAndroid Build Coastguard Worker // We remove the reference in type Value to prevent the
650*481dde66SAndroid Build Coastguard Worker // universal printer from printing the address of value, which
651*481dde66SAndroid Build Coastguard Worker // isn't interesting to the user most of the time. The
652*481dde66SAndroid Build Coastguard Worker // matcher's MatchAndExplain() method handles the case when
653*481dde66SAndroid Build Coastguard Worker // the address is interesting.
654*481dde66SAndroid Build Coastguard Worker internal::UniversalPrint(value, os);
655*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(listener.str(), os);
656*481dde66SAndroid Build Coastguard Worker *os << "\n";
657*481dde66SAndroid Build Coastguard Worker }
658*481dde66SAndroid Build Coastguard Worker }
659*481dde66SAndroid Build Coastguard Worker };
660*481dde66SAndroid Build Coastguard Worker
661*481dde66SAndroid Build Coastguard Worker // The base case.
662*481dde66SAndroid Build Coastguard Worker template <>
663*481dde66SAndroid Build Coastguard Worker class TuplePrefix<0> {
664*481dde66SAndroid Build Coastguard Worker public:
665*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
Matches(const MatcherTuple &,const ValueTuple &)666*481dde66SAndroid Build Coastguard Worker static bool Matches(const MatcherTuple& /* matcher_tuple */,
667*481dde66SAndroid Build Coastguard Worker const ValueTuple& /* value_tuple */) {
668*481dde66SAndroid Build Coastguard Worker return true;
669*481dde66SAndroid Build Coastguard Worker }
670*481dde66SAndroid Build Coastguard Worker
671*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
ExplainMatchFailuresTo(const MatcherTuple &,const ValueTuple &,::std::ostream *)672*481dde66SAndroid Build Coastguard Worker static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,
673*481dde66SAndroid Build Coastguard Worker const ValueTuple& /* values */,
674*481dde66SAndroid Build Coastguard Worker ::std::ostream* /* os */) {}
675*481dde66SAndroid Build Coastguard Worker };
676*481dde66SAndroid Build Coastguard Worker
677*481dde66SAndroid Build Coastguard Worker // TupleMatches(matcher_tuple, value_tuple) returns true if and only if
678*481dde66SAndroid Build Coastguard Worker // all matchers in matcher_tuple match the corresponding fields in
679*481dde66SAndroid Build Coastguard Worker // value_tuple. It is a compiler error if matcher_tuple and
680*481dde66SAndroid Build Coastguard Worker // value_tuple have different number of fields or incompatible field
681*481dde66SAndroid Build Coastguard Worker // types.
682*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
TupleMatches(const MatcherTuple & matcher_tuple,const ValueTuple & value_tuple)683*481dde66SAndroid Build Coastguard Worker bool TupleMatches(const MatcherTuple& matcher_tuple,
684*481dde66SAndroid Build Coastguard Worker const ValueTuple& value_tuple) {
685*481dde66SAndroid Build Coastguard Worker // Makes sure that matcher_tuple and value_tuple have the same
686*481dde66SAndroid Build Coastguard Worker // number of fields.
687*481dde66SAndroid Build Coastguard Worker static_assert(std::tuple_size<MatcherTuple>::value ==
688*481dde66SAndroid Build Coastguard Worker std::tuple_size<ValueTuple>::value,
689*481dde66SAndroid Build Coastguard Worker "matcher and value have different numbers of fields");
690*481dde66SAndroid Build Coastguard Worker return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple,
691*481dde66SAndroid Build Coastguard Worker value_tuple);
692*481dde66SAndroid Build Coastguard Worker }
693*481dde66SAndroid Build Coastguard Worker
694*481dde66SAndroid Build Coastguard Worker // Describes failures in matching matchers against values. If there
695*481dde66SAndroid Build Coastguard Worker // is no failure, nothing will be streamed to os.
696*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple, typename ValueTuple>
ExplainMatchFailureTupleTo(const MatcherTuple & matchers,const ValueTuple & values,::std::ostream * os)697*481dde66SAndroid Build Coastguard Worker void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
698*481dde66SAndroid Build Coastguard Worker const ValueTuple& values, ::std::ostream* os) {
699*481dde66SAndroid Build Coastguard Worker TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(
700*481dde66SAndroid Build Coastguard Worker matchers, values, os);
701*481dde66SAndroid Build Coastguard Worker }
702*481dde66SAndroid Build Coastguard Worker
703*481dde66SAndroid Build Coastguard Worker // TransformTupleValues and its helper.
704*481dde66SAndroid Build Coastguard Worker //
705*481dde66SAndroid Build Coastguard Worker // TransformTupleValuesHelper hides the internal machinery that
706*481dde66SAndroid Build Coastguard Worker // TransformTupleValues uses to implement a tuple traversal.
707*481dde66SAndroid Build Coastguard Worker template <typename Tuple, typename Func, typename OutIter>
708*481dde66SAndroid Build Coastguard Worker class TransformTupleValuesHelper {
709*481dde66SAndroid Build Coastguard Worker private:
710*481dde66SAndroid Build Coastguard Worker typedef ::std::tuple_size<Tuple> TupleSize;
711*481dde66SAndroid Build Coastguard Worker
712*481dde66SAndroid Build Coastguard Worker public:
713*481dde66SAndroid Build Coastguard Worker // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
714*481dde66SAndroid Build Coastguard Worker // Returns the final value of 'out' in case the caller needs it.
Run(Func f,const Tuple & t,OutIter out)715*481dde66SAndroid Build Coastguard Worker static OutIter Run(Func f, const Tuple& t, OutIter out) {
716*481dde66SAndroid Build Coastguard Worker return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);
717*481dde66SAndroid Build Coastguard Worker }
718*481dde66SAndroid Build Coastguard Worker
719*481dde66SAndroid Build Coastguard Worker private:
720*481dde66SAndroid Build Coastguard Worker template <typename Tup, size_t kRemainingSize>
721*481dde66SAndroid Build Coastguard Worker struct IterateOverTuple {
operatorIterateOverTuple722*481dde66SAndroid Build Coastguard Worker OutIter operator()(Func f, const Tup& t, OutIter out) const {
723*481dde66SAndroid Build Coastguard Worker *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t));
724*481dde66SAndroid Build Coastguard Worker return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);
725*481dde66SAndroid Build Coastguard Worker }
726*481dde66SAndroid Build Coastguard Worker };
727*481dde66SAndroid Build Coastguard Worker template <typename Tup>
728*481dde66SAndroid Build Coastguard Worker struct IterateOverTuple<Tup, 0> {
729*481dde66SAndroid Build Coastguard Worker OutIter operator()(Func /* f */, const Tup& /* t */, OutIter out) const {
730*481dde66SAndroid Build Coastguard Worker return out;
731*481dde66SAndroid Build Coastguard Worker }
732*481dde66SAndroid Build Coastguard Worker };
733*481dde66SAndroid Build Coastguard Worker };
734*481dde66SAndroid Build Coastguard Worker
735*481dde66SAndroid Build Coastguard Worker // Successively invokes 'f(element)' on each element of the tuple 't',
736*481dde66SAndroid Build Coastguard Worker // appending each result to the 'out' iterator. Returns the final value
737*481dde66SAndroid Build Coastguard Worker // of 'out'.
738*481dde66SAndroid Build Coastguard Worker template <typename Tuple, typename Func, typename OutIter>
739*481dde66SAndroid Build Coastguard Worker OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {
740*481dde66SAndroid Build Coastguard Worker return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);
741*481dde66SAndroid Build Coastguard Worker }
742*481dde66SAndroid Build Coastguard Worker
743*481dde66SAndroid Build Coastguard Worker // Implements _, a matcher that matches any value of any
744*481dde66SAndroid Build Coastguard Worker // type. This is a polymorphic matcher, so we need a template type
745*481dde66SAndroid Build Coastguard Worker // conversion operator to make it appearing as a Matcher<T> for any
746*481dde66SAndroid Build Coastguard Worker // type T.
747*481dde66SAndroid Build Coastguard Worker class AnythingMatcher {
748*481dde66SAndroid Build Coastguard Worker public:
749*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void;
750*481dde66SAndroid Build Coastguard Worker
751*481dde66SAndroid Build Coastguard Worker template <typename T>
752*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& /* x */, std::ostream* /* listener */) const {
753*481dde66SAndroid Build Coastguard Worker return true;
754*481dde66SAndroid Build Coastguard Worker }
755*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const { *os << "is anything"; }
756*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
757*481dde66SAndroid Build Coastguard Worker // This is mostly for completeness' sake, as it's not very useful
758*481dde66SAndroid Build Coastguard Worker // to write Not(A<bool>()). However we cannot completely rule out
759*481dde66SAndroid Build Coastguard Worker // such a possibility, and it doesn't hurt to be prepared.
760*481dde66SAndroid Build Coastguard Worker *os << "never matches";
761*481dde66SAndroid Build Coastguard Worker }
762*481dde66SAndroid Build Coastguard Worker };
763*481dde66SAndroid Build Coastguard Worker
764*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic IsNull() matcher, which matches any raw or smart
765*481dde66SAndroid Build Coastguard Worker // pointer that is NULL.
766*481dde66SAndroid Build Coastguard Worker class IsNullMatcher {
767*481dde66SAndroid Build Coastguard Worker public:
768*481dde66SAndroid Build Coastguard Worker template <typename Pointer>
769*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const Pointer& p,
770*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
771*481dde66SAndroid Build Coastguard Worker return p == nullptr;
772*481dde66SAndroid Build Coastguard Worker }
773*481dde66SAndroid Build Coastguard Worker
774*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
775*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const { *os << "isn't NULL"; }
776*481dde66SAndroid Build Coastguard Worker };
777*481dde66SAndroid Build Coastguard Worker
778*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic NotNull() matcher, which matches any raw or smart
779*481dde66SAndroid Build Coastguard Worker // pointer that is not NULL.
780*481dde66SAndroid Build Coastguard Worker class NotNullMatcher {
781*481dde66SAndroid Build Coastguard Worker public:
782*481dde66SAndroid Build Coastguard Worker template <typename Pointer>
783*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const Pointer& p,
784*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
785*481dde66SAndroid Build Coastguard Worker return p != nullptr;
786*481dde66SAndroid Build Coastguard Worker }
787*481dde66SAndroid Build Coastguard Worker
788*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }
789*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const { *os << "is NULL"; }
790*481dde66SAndroid Build Coastguard Worker };
791*481dde66SAndroid Build Coastguard Worker
792*481dde66SAndroid Build Coastguard Worker // Ref(variable) matches any argument that is a reference to
793*481dde66SAndroid Build Coastguard Worker // 'variable'. This matcher is polymorphic as it can match any
794*481dde66SAndroid Build Coastguard Worker // super type of the type of 'variable'.
795*481dde66SAndroid Build Coastguard Worker //
796*481dde66SAndroid Build Coastguard Worker // The RefMatcher template class implements Ref(variable). It can
797*481dde66SAndroid Build Coastguard Worker // only be instantiated with a reference type. This prevents a user
798*481dde66SAndroid Build Coastguard Worker // from mistakenly using Ref(x) to match a non-reference function
799*481dde66SAndroid Build Coastguard Worker // argument. For example, the following will righteously cause a
800*481dde66SAndroid Build Coastguard Worker // compiler error:
801*481dde66SAndroid Build Coastguard Worker //
802*481dde66SAndroid Build Coastguard Worker // int n;
803*481dde66SAndroid Build Coastguard Worker // Matcher<int> m1 = Ref(n); // This won't compile.
804*481dde66SAndroid Build Coastguard Worker // Matcher<int&> m2 = Ref(n); // This will compile.
805*481dde66SAndroid Build Coastguard Worker template <typename T>
806*481dde66SAndroid Build Coastguard Worker class RefMatcher;
807*481dde66SAndroid Build Coastguard Worker
808*481dde66SAndroid Build Coastguard Worker template <typename T>
809*481dde66SAndroid Build Coastguard Worker class RefMatcher<T&> {
810*481dde66SAndroid Build Coastguard Worker // Google Mock is a generic framework and thus needs to support
811*481dde66SAndroid Build Coastguard Worker // mocking any function types, including those that take non-const
812*481dde66SAndroid Build Coastguard Worker // reference arguments. Therefore the template parameter T (and
813*481dde66SAndroid Build Coastguard Worker // Super below) can be instantiated to either a const type or a
814*481dde66SAndroid Build Coastguard Worker // non-const type.
815*481dde66SAndroid Build Coastguard Worker public:
816*481dde66SAndroid Build Coastguard Worker // RefMatcher() takes a T& instead of const T&, as we want the
817*481dde66SAndroid Build Coastguard Worker // compiler to catch using Ref(const_value) as a matcher for a
818*481dde66SAndroid Build Coastguard Worker // non-const reference.
819*481dde66SAndroid Build Coastguard Worker explicit RefMatcher(T& x) : object_(x) {} // NOLINT
820*481dde66SAndroid Build Coastguard Worker
821*481dde66SAndroid Build Coastguard Worker template <typename Super>
822*481dde66SAndroid Build Coastguard Worker operator Matcher<Super&>() const {
823*481dde66SAndroid Build Coastguard Worker // By passing object_ (type T&) to Impl(), which expects a Super&,
824*481dde66SAndroid Build Coastguard Worker // we make sure that Super is a super type of T. In particular,
825*481dde66SAndroid Build Coastguard Worker // this catches using Ref(const_value) as a matcher for a
826*481dde66SAndroid Build Coastguard Worker // non-const reference, as you cannot implicitly convert a const
827*481dde66SAndroid Build Coastguard Worker // reference to a non-const reference.
828*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new Impl<Super>(object_));
829*481dde66SAndroid Build Coastguard Worker }
830*481dde66SAndroid Build Coastguard Worker
831*481dde66SAndroid Build Coastguard Worker private:
832*481dde66SAndroid Build Coastguard Worker template <typename Super>
833*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Super&> {
834*481dde66SAndroid Build Coastguard Worker public:
835*481dde66SAndroid Build Coastguard Worker explicit Impl(Super& x) : object_(x) {} // NOLINT
836*481dde66SAndroid Build Coastguard Worker
837*481dde66SAndroid Build Coastguard Worker // MatchAndExplain() takes a Super& (as opposed to const Super&)
838*481dde66SAndroid Build Coastguard Worker // in order to match the interface MatcherInterface<Super&>.
839*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Super& x,
840*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
841*481dde66SAndroid Build Coastguard Worker *listener << "which is located @" << static_cast<const void*>(&x);
842*481dde66SAndroid Build Coastguard Worker return &x == &object_;
843*481dde66SAndroid Build Coastguard Worker }
844*481dde66SAndroid Build Coastguard Worker
845*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
846*481dde66SAndroid Build Coastguard Worker *os << "references the variable ";
847*481dde66SAndroid Build Coastguard Worker UniversalPrinter<Super&>::Print(object_, os);
848*481dde66SAndroid Build Coastguard Worker }
849*481dde66SAndroid Build Coastguard Worker
850*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
851*481dde66SAndroid Build Coastguard Worker *os << "does not reference the variable ";
852*481dde66SAndroid Build Coastguard Worker UniversalPrinter<Super&>::Print(object_, os);
853*481dde66SAndroid Build Coastguard Worker }
854*481dde66SAndroid Build Coastguard Worker
855*481dde66SAndroid Build Coastguard Worker private:
856*481dde66SAndroid Build Coastguard Worker const Super& object_;
857*481dde66SAndroid Build Coastguard Worker };
858*481dde66SAndroid Build Coastguard Worker
859*481dde66SAndroid Build Coastguard Worker T& object_;
860*481dde66SAndroid Build Coastguard Worker };
861*481dde66SAndroid Build Coastguard Worker
862*481dde66SAndroid Build Coastguard Worker // Polymorphic helper functions for narrow and wide string matchers.
863*481dde66SAndroid Build Coastguard Worker inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
864*481dde66SAndroid Build Coastguard Worker return String::CaseInsensitiveCStringEquals(lhs, rhs);
865*481dde66SAndroid Build Coastguard Worker }
866*481dde66SAndroid Build Coastguard Worker
867*481dde66SAndroid Build Coastguard Worker inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,
868*481dde66SAndroid Build Coastguard Worker const wchar_t* rhs) {
869*481dde66SAndroid Build Coastguard Worker return String::CaseInsensitiveWideCStringEquals(lhs, rhs);
870*481dde66SAndroid Build Coastguard Worker }
871*481dde66SAndroid Build Coastguard Worker
872*481dde66SAndroid Build Coastguard Worker // String comparison for narrow or wide strings that can have embedded NUL
873*481dde66SAndroid Build Coastguard Worker // characters.
874*481dde66SAndroid Build Coastguard Worker template <typename StringType>
875*481dde66SAndroid Build Coastguard Worker bool CaseInsensitiveStringEquals(const StringType& s1, const StringType& s2) {
876*481dde66SAndroid Build Coastguard Worker // Are the heads equal?
877*481dde66SAndroid Build Coastguard Worker if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {
878*481dde66SAndroid Build Coastguard Worker return false;
879*481dde66SAndroid Build Coastguard Worker }
880*481dde66SAndroid Build Coastguard Worker
881*481dde66SAndroid Build Coastguard Worker // Skip the equal heads.
882*481dde66SAndroid Build Coastguard Worker const typename StringType::value_type nul = 0;
883*481dde66SAndroid Build Coastguard Worker const size_t i1 = s1.find(nul), i2 = s2.find(nul);
884*481dde66SAndroid Build Coastguard Worker
885*481dde66SAndroid Build Coastguard Worker // Are we at the end of either s1 or s2?
886*481dde66SAndroid Build Coastguard Worker if (i1 == StringType::npos || i2 == StringType::npos) {
887*481dde66SAndroid Build Coastguard Worker return i1 == i2;
888*481dde66SAndroid Build Coastguard Worker }
889*481dde66SAndroid Build Coastguard Worker
890*481dde66SAndroid Build Coastguard Worker // Are the tails equal?
891*481dde66SAndroid Build Coastguard Worker return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));
892*481dde66SAndroid Build Coastguard Worker }
893*481dde66SAndroid Build Coastguard Worker
894*481dde66SAndroid Build Coastguard Worker // String matchers.
895*481dde66SAndroid Build Coastguard Worker
896*481dde66SAndroid Build Coastguard Worker // Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
897*481dde66SAndroid Build Coastguard Worker template <typename StringType>
898*481dde66SAndroid Build Coastguard Worker class StrEqualityMatcher {
899*481dde66SAndroid Build Coastguard Worker public:
900*481dde66SAndroid Build Coastguard Worker StrEqualityMatcher(StringType str, bool expect_eq, bool case_sensitive)
901*481dde66SAndroid Build Coastguard Worker : string_(std::move(str)),
902*481dde66SAndroid Build Coastguard Worker expect_eq_(expect_eq),
903*481dde66SAndroid Build Coastguard Worker case_sensitive_(case_sensitive) {}
904*481dde66SAndroid Build Coastguard Worker
905*481dde66SAndroid Build Coastguard Worker #if GTEST_INTERNAL_HAS_STRING_VIEW
906*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const internal::StringView& s,
907*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
908*481dde66SAndroid Build Coastguard Worker // This should fail to compile if StringView is used with wide
909*481dde66SAndroid Build Coastguard Worker // strings.
910*481dde66SAndroid Build Coastguard Worker const StringType& str = std::string(s);
911*481dde66SAndroid Build Coastguard Worker return MatchAndExplain(str, listener);
912*481dde66SAndroid Build Coastguard Worker }
913*481dde66SAndroid Build Coastguard Worker #endif // GTEST_INTERNAL_HAS_STRING_VIEW
914*481dde66SAndroid Build Coastguard Worker
915*481dde66SAndroid Build Coastguard Worker // Accepts pointer types, particularly:
916*481dde66SAndroid Build Coastguard Worker // const char*
917*481dde66SAndroid Build Coastguard Worker // char*
918*481dde66SAndroid Build Coastguard Worker // const wchar_t*
919*481dde66SAndroid Build Coastguard Worker // wchar_t*
920*481dde66SAndroid Build Coastguard Worker template <typename CharType>
921*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
922*481dde66SAndroid Build Coastguard Worker if (s == nullptr) {
923*481dde66SAndroid Build Coastguard Worker return !expect_eq_;
924*481dde66SAndroid Build Coastguard Worker }
925*481dde66SAndroid Build Coastguard Worker return MatchAndExplain(StringType(s), listener);
926*481dde66SAndroid Build Coastguard Worker }
927*481dde66SAndroid Build Coastguard Worker
928*481dde66SAndroid Build Coastguard Worker // Matches anything that can convert to StringType.
929*481dde66SAndroid Build Coastguard Worker //
930*481dde66SAndroid Build Coastguard Worker // This is a template, not just a plain function with const StringType&,
931*481dde66SAndroid Build Coastguard Worker // because StringView has some interfering non-explicit constructors.
932*481dde66SAndroid Build Coastguard Worker template <typename MatcheeStringType>
933*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const MatcheeStringType& s,
934*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
935*481dde66SAndroid Build Coastguard Worker const StringType s2(s);
936*481dde66SAndroid Build Coastguard Worker const bool eq = case_sensitive_ ? s2 == string_
937*481dde66SAndroid Build Coastguard Worker : CaseInsensitiveStringEquals(s2, string_);
938*481dde66SAndroid Build Coastguard Worker return expect_eq_ == eq;
939*481dde66SAndroid Build Coastguard Worker }
940*481dde66SAndroid Build Coastguard Worker
941*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
942*481dde66SAndroid Build Coastguard Worker DescribeToHelper(expect_eq_, os);
943*481dde66SAndroid Build Coastguard Worker }
944*481dde66SAndroid Build Coastguard Worker
945*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
946*481dde66SAndroid Build Coastguard Worker DescribeToHelper(!expect_eq_, os);
947*481dde66SAndroid Build Coastguard Worker }
948*481dde66SAndroid Build Coastguard Worker
949*481dde66SAndroid Build Coastguard Worker private:
950*481dde66SAndroid Build Coastguard Worker void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {
951*481dde66SAndroid Build Coastguard Worker *os << (expect_eq ? "is " : "isn't ");
952*481dde66SAndroid Build Coastguard Worker *os << "equal to ";
953*481dde66SAndroid Build Coastguard Worker if (!case_sensitive_) {
954*481dde66SAndroid Build Coastguard Worker *os << "(ignoring case) ";
955*481dde66SAndroid Build Coastguard Worker }
956*481dde66SAndroid Build Coastguard Worker UniversalPrint(string_, os);
957*481dde66SAndroid Build Coastguard Worker }
958*481dde66SAndroid Build Coastguard Worker
959*481dde66SAndroid Build Coastguard Worker const StringType string_;
960*481dde66SAndroid Build Coastguard Worker const bool expect_eq_;
961*481dde66SAndroid Build Coastguard Worker const bool case_sensitive_;
962*481dde66SAndroid Build Coastguard Worker };
963*481dde66SAndroid Build Coastguard Worker
964*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic HasSubstr(substring) matcher, which
965*481dde66SAndroid Build Coastguard Worker // can be used as a Matcher<T> as long as T can be converted to a
966*481dde66SAndroid Build Coastguard Worker // string.
967*481dde66SAndroid Build Coastguard Worker template <typename StringType>
968*481dde66SAndroid Build Coastguard Worker class HasSubstrMatcher {
969*481dde66SAndroid Build Coastguard Worker public:
970*481dde66SAndroid Build Coastguard Worker explicit HasSubstrMatcher(const StringType& substring)
971*481dde66SAndroid Build Coastguard Worker : substring_(substring) {}
972*481dde66SAndroid Build Coastguard Worker
973*481dde66SAndroid Build Coastguard Worker #if GTEST_INTERNAL_HAS_STRING_VIEW
974*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const internal::StringView& s,
975*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
976*481dde66SAndroid Build Coastguard Worker // This should fail to compile if StringView is used with wide
977*481dde66SAndroid Build Coastguard Worker // strings.
978*481dde66SAndroid Build Coastguard Worker const StringType& str = std::string(s);
979*481dde66SAndroid Build Coastguard Worker return MatchAndExplain(str, listener);
980*481dde66SAndroid Build Coastguard Worker }
981*481dde66SAndroid Build Coastguard Worker #endif // GTEST_INTERNAL_HAS_STRING_VIEW
982*481dde66SAndroid Build Coastguard Worker
983*481dde66SAndroid Build Coastguard Worker // Accepts pointer types, particularly:
984*481dde66SAndroid Build Coastguard Worker // const char*
985*481dde66SAndroid Build Coastguard Worker // char*
986*481dde66SAndroid Build Coastguard Worker // const wchar_t*
987*481dde66SAndroid Build Coastguard Worker // wchar_t*
988*481dde66SAndroid Build Coastguard Worker template <typename CharType>
989*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
990*481dde66SAndroid Build Coastguard Worker return s != nullptr && MatchAndExplain(StringType(s), listener);
991*481dde66SAndroid Build Coastguard Worker }
992*481dde66SAndroid Build Coastguard Worker
993*481dde66SAndroid Build Coastguard Worker // Matches anything that can convert to StringType.
994*481dde66SAndroid Build Coastguard Worker //
995*481dde66SAndroid Build Coastguard Worker // This is a template, not just a plain function with const StringType&,
996*481dde66SAndroid Build Coastguard Worker // because StringView has some interfering non-explicit constructors.
997*481dde66SAndroid Build Coastguard Worker template <typename MatcheeStringType>
998*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const MatcheeStringType& s,
999*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
1000*481dde66SAndroid Build Coastguard Worker return StringType(s).find(substring_) != StringType::npos;
1001*481dde66SAndroid Build Coastguard Worker }
1002*481dde66SAndroid Build Coastguard Worker
1003*481dde66SAndroid Build Coastguard Worker // Describes what this matcher matches.
1004*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
1005*481dde66SAndroid Build Coastguard Worker *os << "has substring ";
1006*481dde66SAndroid Build Coastguard Worker UniversalPrint(substring_, os);
1007*481dde66SAndroid Build Coastguard Worker }
1008*481dde66SAndroid Build Coastguard Worker
1009*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
1010*481dde66SAndroid Build Coastguard Worker *os << "has no substring ";
1011*481dde66SAndroid Build Coastguard Worker UniversalPrint(substring_, os);
1012*481dde66SAndroid Build Coastguard Worker }
1013*481dde66SAndroid Build Coastguard Worker
1014*481dde66SAndroid Build Coastguard Worker private:
1015*481dde66SAndroid Build Coastguard Worker const StringType substring_;
1016*481dde66SAndroid Build Coastguard Worker };
1017*481dde66SAndroid Build Coastguard Worker
1018*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic StartsWith(substring) matcher, which
1019*481dde66SAndroid Build Coastguard Worker // can be used as a Matcher<T> as long as T can be converted to a
1020*481dde66SAndroid Build Coastguard Worker // string.
1021*481dde66SAndroid Build Coastguard Worker template <typename StringType>
1022*481dde66SAndroid Build Coastguard Worker class StartsWithMatcher {
1023*481dde66SAndroid Build Coastguard Worker public:
1024*481dde66SAndroid Build Coastguard Worker explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {}
1025*481dde66SAndroid Build Coastguard Worker
1026*481dde66SAndroid Build Coastguard Worker #if GTEST_INTERNAL_HAS_STRING_VIEW
1027*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const internal::StringView& s,
1028*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
1029*481dde66SAndroid Build Coastguard Worker // This should fail to compile if StringView is used with wide
1030*481dde66SAndroid Build Coastguard Worker // strings.
1031*481dde66SAndroid Build Coastguard Worker const StringType& str = std::string(s);
1032*481dde66SAndroid Build Coastguard Worker return MatchAndExplain(str, listener);
1033*481dde66SAndroid Build Coastguard Worker }
1034*481dde66SAndroid Build Coastguard Worker #endif // GTEST_INTERNAL_HAS_STRING_VIEW
1035*481dde66SAndroid Build Coastguard Worker
1036*481dde66SAndroid Build Coastguard Worker // Accepts pointer types, particularly:
1037*481dde66SAndroid Build Coastguard Worker // const char*
1038*481dde66SAndroid Build Coastguard Worker // char*
1039*481dde66SAndroid Build Coastguard Worker // const wchar_t*
1040*481dde66SAndroid Build Coastguard Worker // wchar_t*
1041*481dde66SAndroid Build Coastguard Worker template <typename CharType>
1042*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1043*481dde66SAndroid Build Coastguard Worker return s != nullptr && MatchAndExplain(StringType(s), listener);
1044*481dde66SAndroid Build Coastguard Worker }
1045*481dde66SAndroid Build Coastguard Worker
1046*481dde66SAndroid Build Coastguard Worker // Matches anything that can convert to StringType.
1047*481dde66SAndroid Build Coastguard Worker //
1048*481dde66SAndroid Build Coastguard Worker // This is a template, not just a plain function with const StringType&,
1049*481dde66SAndroid Build Coastguard Worker // because StringView has some interfering non-explicit constructors.
1050*481dde66SAndroid Build Coastguard Worker template <typename MatcheeStringType>
1051*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const MatcheeStringType& s,
1052*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
1053*481dde66SAndroid Build Coastguard Worker const StringType s2(s);
1054*481dde66SAndroid Build Coastguard Worker return s2.length() >= prefix_.length() &&
1055*481dde66SAndroid Build Coastguard Worker s2.substr(0, prefix_.length()) == prefix_;
1056*481dde66SAndroid Build Coastguard Worker }
1057*481dde66SAndroid Build Coastguard Worker
1058*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
1059*481dde66SAndroid Build Coastguard Worker *os << "starts with ";
1060*481dde66SAndroid Build Coastguard Worker UniversalPrint(prefix_, os);
1061*481dde66SAndroid Build Coastguard Worker }
1062*481dde66SAndroid Build Coastguard Worker
1063*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
1064*481dde66SAndroid Build Coastguard Worker *os << "doesn't start with ";
1065*481dde66SAndroid Build Coastguard Worker UniversalPrint(prefix_, os);
1066*481dde66SAndroid Build Coastguard Worker }
1067*481dde66SAndroid Build Coastguard Worker
1068*481dde66SAndroid Build Coastguard Worker private:
1069*481dde66SAndroid Build Coastguard Worker const StringType prefix_;
1070*481dde66SAndroid Build Coastguard Worker };
1071*481dde66SAndroid Build Coastguard Worker
1072*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic EndsWith(substring) matcher, which
1073*481dde66SAndroid Build Coastguard Worker // can be used as a Matcher<T> as long as T can be converted to a
1074*481dde66SAndroid Build Coastguard Worker // string.
1075*481dde66SAndroid Build Coastguard Worker template <typename StringType>
1076*481dde66SAndroid Build Coastguard Worker class EndsWithMatcher {
1077*481dde66SAndroid Build Coastguard Worker public:
1078*481dde66SAndroid Build Coastguard Worker explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}
1079*481dde66SAndroid Build Coastguard Worker
1080*481dde66SAndroid Build Coastguard Worker #if GTEST_INTERNAL_HAS_STRING_VIEW
1081*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const internal::StringView& s,
1082*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
1083*481dde66SAndroid Build Coastguard Worker // This should fail to compile if StringView is used with wide
1084*481dde66SAndroid Build Coastguard Worker // strings.
1085*481dde66SAndroid Build Coastguard Worker const StringType& str = std::string(s);
1086*481dde66SAndroid Build Coastguard Worker return MatchAndExplain(str, listener);
1087*481dde66SAndroid Build Coastguard Worker }
1088*481dde66SAndroid Build Coastguard Worker #endif // GTEST_INTERNAL_HAS_STRING_VIEW
1089*481dde66SAndroid Build Coastguard Worker
1090*481dde66SAndroid Build Coastguard Worker // Accepts pointer types, particularly:
1091*481dde66SAndroid Build Coastguard Worker // const char*
1092*481dde66SAndroid Build Coastguard Worker // char*
1093*481dde66SAndroid Build Coastguard Worker // const wchar_t*
1094*481dde66SAndroid Build Coastguard Worker // wchar_t*
1095*481dde66SAndroid Build Coastguard Worker template <typename CharType>
1096*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
1097*481dde66SAndroid Build Coastguard Worker return s != nullptr && MatchAndExplain(StringType(s), listener);
1098*481dde66SAndroid Build Coastguard Worker }
1099*481dde66SAndroid Build Coastguard Worker
1100*481dde66SAndroid Build Coastguard Worker // Matches anything that can convert to StringType.
1101*481dde66SAndroid Build Coastguard Worker //
1102*481dde66SAndroid Build Coastguard Worker // This is a template, not just a plain function with const StringType&,
1103*481dde66SAndroid Build Coastguard Worker // because StringView has some interfering non-explicit constructors.
1104*481dde66SAndroid Build Coastguard Worker template <typename MatcheeStringType>
1105*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const MatcheeStringType& s,
1106*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
1107*481dde66SAndroid Build Coastguard Worker const StringType s2(s);
1108*481dde66SAndroid Build Coastguard Worker return s2.length() >= suffix_.length() &&
1109*481dde66SAndroid Build Coastguard Worker s2.substr(s2.length() - suffix_.length()) == suffix_;
1110*481dde66SAndroid Build Coastguard Worker }
1111*481dde66SAndroid Build Coastguard Worker
1112*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
1113*481dde66SAndroid Build Coastguard Worker *os << "ends with ";
1114*481dde66SAndroid Build Coastguard Worker UniversalPrint(suffix_, os);
1115*481dde66SAndroid Build Coastguard Worker }
1116*481dde66SAndroid Build Coastguard Worker
1117*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
1118*481dde66SAndroid Build Coastguard Worker *os << "doesn't end with ";
1119*481dde66SAndroid Build Coastguard Worker UniversalPrint(suffix_, os);
1120*481dde66SAndroid Build Coastguard Worker }
1121*481dde66SAndroid Build Coastguard Worker
1122*481dde66SAndroid Build Coastguard Worker private:
1123*481dde66SAndroid Build Coastguard Worker const StringType suffix_;
1124*481dde66SAndroid Build Coastguard Worker };
1125*481dde66SAndroid Build Coastguard Worker
1126*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic WhenBase64Unescaped(matcher) matcher, which can be
1127*481dde66SAndroid Build Coastguard Worker // used as a Matcher<T> as long as T can be converted to a string.
1128*481dde66SAndroid Build Coastguard Worker class WhenBase64UnescapedMatcher {
1129*481dde66SAndroid Build Coastguard Worker public:
1130*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void;
1131*481dde66SAndroid Build Coastguard Worker
1132*481dde66SAndroid Build Coastguard Worker explicit WhenBase64UnescapedMatcher(
1133*481dde66SAndroid Build Coastguard Worker const Matcher<const std::string&>& internal_matcher)
1134*481dde66SAndroid Build Coastguard Worker : internal_matcher_(internal_matcher) {}
1135*481dde66SAndroid Build Coastguard Worker
1136*481dde66SAndroid Build Coastguard Worker // Matches anything that can convert to std::string.
1137*481dde66SAndroid Build Coastguard Worker template <typename MatcheeStringType>
1138*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const MatcheeStringType& s,
1139*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
1140*481dde66SAndroid Build Coastguard Worker const std::string s2(s); // NOLINT (needed for working with string_view).
1141*481dde66SAndroid Build Coastguard Worker std::string unescaped;
1142*481dde66SAndroid Build Coastguard Worker if (!internal::Base64Unescape(s2, &unescaped)) {
1143*481dde66SAndroid Build Coastguard Worker if (listener != nullptr) {
1144*481dde66SAndroid Build Coastguard Worker *listener << "is not a valid base64 escaped string";
1145*481dde66SAndroid Build Coastguard Worker }
1146*481dde66SAndroid Build Coastguard Worker return false;
1147*481dde66SAndroid Build Coastguard Worker }
1148*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(unescaped, internal_matcher_, listener);
1149*481dde66SAndroid Build Coastguard Worker }
1150*481dde66SAndroid Build Coastguard Worker
1151*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
1152*481dde66SAndroid Build Coastguard Worker *os << "matches after Base64Unescape ";
1153*481dde66SAndroid Build Coastguard Worker internal_matcher_.DescribeTo(os);
1154*481dde66SAndroid Build Coastguard Worker }
1155*481dde66SAndroid Build Coastguard Worker
1156*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
1157*481dde66SAndroid Build Coastguard Worker *os << "does not match after Base64Unescape ";
1158*481dde66SAndroid Build Coastguard Worker internal_matcher_.DescribeTo(os);
1159*481dde66SAndroid Build Coastguard Worker }
1160*481dde66SAndroid Build Coastguard Worker
1161*481dde66SAndroid Build Coastguard Worker private:
1162*481dde66SAndroid Build Coastguard Worker const Matcher<const std::string&> internal_matcher_;
1163*481dde66SAndroid Build Coastguard Worker };
1164*481dde66SAndroid Build Coastguard Worker
1165*481dde66SAndroid Build Coastguard Worker // Implements a matcher that compares the two fields of a 2-tuple
1166*481dde66SAndroid Build Coastguard Worker // using one of the ==, <=, <, etc, operators. The two fields being
1167*481dde66SAndroid Build Coastguard Worker // compared don't have to have the same type.
1168*481dde66SAndroid Build Coastguard Worker //
1169*481dde66SAndroid Build Coastguard Worker // The matcher defined here is polymorphic (for example, Eq() can be
1170*481dde66SAndroid Build Coastguard Worker // used to match a std::tuple<int, short>, a std::tuple<const long&, double>,
1171*481dde66SAndroid Build Coastguard Worker // etc). Therefore we use a template type conversion operator in the
1172*481dde66SAndroid Build Coastguard Worker // implementation.
1173*481dde66SAndroid Build Coastguard Worker template <typename D, typename Op>
1174*481dde66SAndroid Build Coastguard Worker class PairMatchBase {
1175*481dde66SAndroid Build Coastguard Worker public:
1176*481dde66SAndroid Build Coastguard Worker template <typename T1, typename T2>
1177*481dde66SAndroid Build Coastguard Worker operator Matcher<::std::tuple<T1, T2>>() const {
1178*481dde66SAndroid Build Coastguard Worker return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>);
1179*481dde66SAndroid Build Coastguard Worker }
1180*481dde66SAndroid Build Coastguard Worker template <typename T1, typename T2>
1181*481dde66SAndroid Build Coastguard Worker operator Matcher<const ::std::tuple<T1, T2>&>() const {
1182*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>);
1183*481dde66SAndroid Build Coastguard Worker }
1184*481dde66SAndroid Build Coastguard Worker
1185*481dde66SAndroid Build Coastguard Worker private:
1186*481dde66SAndroid Build Coastguard Worker static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT
1187*481dde66SAndroid Build Coastguard Worker return os << D::Desc();
1188*481dde66SAndroid Build Coastguard Worker }
1189*481dde66SAndroid Build Coastguard Worker
1190*481dde66SAndroid Build Coastguard Worker template <typename Tuple>
1191*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Tuple> {
1192*481dde66SAndroid Build Coastguard Worker public:
1193*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Tuple args,
1194*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const override {
1195*481dde66SAndroid Build Coastguard Worker return Op()(::std::get<0>(args), ::std::get<1>(args));
1196*481dde66SAndroid Build Coastguard Worker }
1197*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1198*481dde66SAndroid Build Coastguard Worker *os << "are " << GetDesc;
1199*481dde66SAndroid Build Coastguard Worker }
1200*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1201*481dde66SAndroid Build Coastguard Worker *os << "aren't " << GetDesc;
1202*481dde66SAndroid Build Coastguard Worker }
1203*481dde66SAndroid Build Coastguard Worker };
1204*481dde66SAndroid Build Coastguard Worker };
1205*481dde66SAndroid Build Coastguard Worker
1206*481dde66SAndroid Build Coastguard Worker class Eq2Matcher : public PairMatchBase<Eq2Matcher, std::equal_to<>> {
1207*481dde66SAndroid Build Coastguard Worker public:
1208*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "an equal pair"; }
1209*481dde66SAndroid Build Coastguard Worker };
1210*481dde66SAndroid Build Coastguard Worker class Ne2Matcher : public PairMatchBase<Ne2Matcher, std::not_equal_to<>> {
1211*481dde66SAndroid Build Coastguard Worker public:
1212*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "an unequal pair"; }
1213*481dde66SAndroid Build Coastguard Worker };
1214*481dde66SAndroid Build Coastguard Worker class Lt2Matcher : public PairMatchBase<Lt2Matcher, std::less<>> {
1215*481dde66SAndroid Build Coastguard Worker public:
1216*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "a pair where the first < the second"; }
1217*481dde66SAndroid Build Coastguard Worker };
1218*481dde66SAndroid Build Coastguard Worker class Gt2Matcher : public PairMatchBase<Gt2Matcher, std::greater<>> {
1219*481dde66SAndroid Build Coastguard Worker public:
1220*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "a pair where the first > the second"; }
1221*481dde66SAndroid Build Coastguard Worker };
1222*481dde66SAndroid Build Coastguard Worker class Le2Matcher : public PairMatchBase<Le2Matcher, std::less_equal<>> {
1223*481dde66SAndroid Build Coastguard Worker public:
1224*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "a pair where the first <= the second"; }
1225*481dde66SAndroid Build Coastguard Worker };
1226*481dde66SAndroid Build Coastguard Worker class Ge2Matcher : public PairMatchBase<Ge2Matcher, std::greater_equal<>> {
1227*481dde66SAndroid Build Coastguard Worker public:
1228*481dde66SAndroid Build Coastguard Worker static const char* Desc() { return "a pair where the first >= the second"; }
1229*481dde66SAndroid Build Coastguard Worker };
1230*481dde66SAndroid Build Coastguard Worker
1231*481dde66SAndroid Build Coastguard Worker // Implements the Not(...) matcher for a particular argument type T.
1232*481dde66SAndroid Build Coastguard Worker // We do not nest it inside the NotMatcher class template, as that
1233*481dde66SAndroid Build Coastguard Worker // will prevent different instantiations of NotMatcher from sharing
1234*481dde66SAndroid Build Coastguard Worker // the same NotMatcherImpl<T> class.
1235*481dde66SAndroid Build Coastguard Worker template <typename T>
1236*481dde66SAndroid Build Coastguard Worker class NotMatcherImpl : public MatcherInterface<const T&> {
1237*481dde66SAndroid Build Coastguard Worker public:
1238*481dde66SAndroid Build Coastguard Worker explicit NotMatcherImpl(const Matcher<T>& matcher) : matcher_(matcher) {}
1239*481dde66SAndroid Build Coastguard Worker
1240*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& x,
1241*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1242*481dde66SAndroid Build Coastguard Worker return !matcher_.MatchAndExplain(x, listener);
1243*481dde66SAndroid Build Coastguard Worker }
1244*481dde66SAndroid Build Coastguard Worker
1245*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1246*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
1247*481dde66SAndroid Build Coastguard Worker }
1248*481dde66SAndroid Build Coastguard Worker
1249*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1250*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
1251*481dde66SAndroid Build Coastguard Worker }
1252*481dde66SAndroid Build Coastguard Worker
1253*481dde66SAndroid Build Coastguard Worker private:
1254*481dde66SAndroid Build Coastguard Worker const Matcher<T> matcher_;
1255*481dde66SAndroid Build Coastguard Worker };
1256*481dde66SAndroid Build Coastguard Worker
1257*481dde66SAndroid Build Coastguard Worker // Implements the Not(m) matcher, which matches a value that doesn't
1258*481dde66SAndroid Build Coastguard Worker // match matcher m.
1259*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
1260*481dde66SAndroid Build Coastguard Worker class NotMatcher {
1261*481dde66SAndroid Build Coastguard Worker public:
1262*481dde66SAndroid Build Coastguard Worker explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}
1263*481dde66SAndroid Build Coastguard Worker
1264*481dde66SAndroid Build Coastguard Worker // This template type conversion operator allows Not(m) to be used
1265*481dde66SAndroid Build Coastguard Worker // to match any type m can match.
1266*481dde66SAndroid Build Coastguard Worker template <typename T>
1267*481dde66SAndroid Build Coastguard Worker operator Matcher<T>() const {
1268*481dde66SAndroid Build Coastguard Worker return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));
1269*481dde66SAndroid Build Coastguard Worker }
1270*481dde66SAndroid Build Coastguard Worker
1271*481dde66SAndroid Build Coastguard Worker private:
1272*481dde66SAndroid Build Coastguard Worker InnerMatcher matcher_;
1273*481dde66SAndroid Build Coastguard Worker };
1274*481dde66SAndroid Build Coastguard Worker
1275*481dde66SAndroid Build Coastguard Worker // Implements the AllOf(m1, m2) matcher for a particular argument type
1276*481dde66SAndroid Build Coastguard Worker // T. We do not nest it inside the BothOfMatcher class template, as
1277*481dde66SAndroid Build Coastguard Worker // that will prevent different instantiations of BothOfMatcher from
1278*481dde66SAndroid Build Coastguard Worker // sharing the same BothOfMatcherImpl<T> class.
1279*481dde66SAndroid Build Coastguard Worker template <typename T>
1280*481dde66SAndroid Build Coastguard Worker class AllOfMatcherImpl : public MatcherInterface<const T&> {
1281*481dde66SAndroid Build Coastguard Worker public:
1282*481dde66SAndroid Build Coastguard Worker explicit AllOfMatcherImpl(std::vector<Matcher<T>> matchers)
1283*481dde66SAndroid Build Coastguard Worker : matchers_(std::move(matchers)) {}
1284*481dde66SAndroid Build Coastguard Worker
1285*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1286*481dde66SAndroid Build Coastguard Worker *os << "(";
1287*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i < matchers_.size(); ++i) {
1288*481dde66SAndroid Build Coastguard Worker if (i != 0) *os << ") and (";
1289*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeTo(os);
1290*481dde66SAndroid Build Coastguard Worker }
1291*481dde66SAndroid Build Coastguard Worker *os << ")";
1292*481dde66SAndroid Build Coastguard Worker }
1293*481dde66SAndroid Build Coastguard Worker
1294*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1295*481dde66SAndroid Build Coastguard Worker *os << "(";
1296*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i < matchers_.size(); ++i) {
1297*481dde66SAndroid Build Coastguard Worker if (i != 0) *os << ") or (";
1298*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeNegationTo(os);
1299*481dde66SAndroid Build Coastguard Worker }
1300*481dde66SAndroid Build Coastguard Worker *os << ")";
1301*481dde66SAndroid Build Coastguard Worker }
1302*481dde66SAndroid Build Coastguard Worker
1303*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& x,
1304*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1305*481dde66SAndroid Build Coastguard Worker // This method uses matcher's explanation when explaining the result.
1306*481dde66SAndroid Build Coastguard Worker // However, if matcher doesn't provide one, this method uses matcher's
1307*481dde66SAndroid Build Coastguard Worker // description.
1308*481dde66SAndroid Build Coastguard Worker std::string all_match_result;
1309*481dde66SAndroid Build Coastguard Worker for (const Matcher<T>& matcher : matchers_) {
1310*481dde66SAndroid Build Coastguard Worker StringMatchResultListener slistener;
1311*481dde66SAndroid Build Coastguard Worker // Return explanation for first failed matcher.
1312*481dde66SAndroid Build Coastguard Worker if (!matcher.MatchAndExplain(x, &slistener)) {
1313*481dde66SAndroid Build Coastguard Worker const std::string explanation = slistener.str();
1314*481dde66SAndroid Build Coastguard Worker if (!explanation.empty()) {
1315*481dde66SAndroid Build Coastguard Worker *listener << explanation;
1316*481dde66SAndroid Build Coastguard Worker } else {
1317*481dde66SAndroid Build Coastguard Worker *listener << "which doesn't match (" << Describe(matcher) << ")";
1318*481dde66SAndroid Build Coastguard Worker }
1319*481dde66SAndroid Build Coastguard Worker return false;
1320*481dde66SAndroid Build Coastguard Worker }
1321*481dde66SAndroid Build Coastguard Worker // Keep track of explanations in case all matchers succeed.
1322*481dde66SAndroid Build Coastguard Worker std::string explanation = slistener.str();
1323*481dde66SAndroid Build Coastguard Worker if (explanation.empty()) {
1324*481dde66SAndroid Build Coastguard Worker explanation = Describe(matcher);
1325*481dde66SAndroid Build Coastguard Worker }
1326*481dde66SAndroid Build Coastguard Worker if (all_match_result.empty()) {
1327*481dde66SAndroid Build Coastguard Worker all_match_result = explanation;
1328*481dde66SAndroid Build Coastguard Worker } else {
1329*481dde66SAndroid Build Coastguard Worker if (!explanation.empty()) {
1330*481dde66SAndroid Build Coastguard Worker all_match_result += ", and ";
1331*481dde66SAndroid Build Coastguard Worker all_match_result += explanation;
1332*481dde66SAndroid Build Coastguard Worker }
1333*481dde66SAndroid Build Coastguard Worker }
1334*481dde66SAndroid Build Coastguard Worker }
1335*481dde66SAndroid Build Coastguard Worker
1336*481dde66SAndroid Build Coastguard Worker *listener << all_match_result;
1337*481dde66SAndroid Build Coastguard Worker return true;
1338*481dde66SAndroid Build Coastguard Worker }
1339*481dde66SAndroid Build Coastguard Worker
1340*481dde66SAndroid Build Coastguard Worker private:
1341*481dde66SAndroid Build Coastguard Worker // Returns matcher description as a string.
1342*481dde66SAndroid Build Coastguard Worker std::string Describe(const Matcher<T>& matcher) const {
1343*481dde66SAndroid Build Coastguard Worker StringMatchResultListener listener;
1344*481dde66SAndroid Build Coastguard Worker matcher.DescribeTo(listener.stream());
1345*481dde66SAndroid Build Coastguard Worker return listener.str();
1346*481dde66SAndroid Build Coastguard Worker }
1347*481dde66SAndroid Build Coastguard Worker const std::vector<Matcher<T>> matchers_;
1348*481dde66SAndroid Build Coastguard Worker };
1349*481dde66SAndroid Build Coastguard Worker
1350*481dde66SAndroid Build Coastguard Worker // VariadicMatcher is used for the variadic implementation of
1351*481dde66SAndroid Build Coastguard Worker // AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
1352*481dde66SAndroid Build Coastguard Worker // CombiningMatcher<T> is used to recursively combine the provided matchers
1353*481dde66SAndroid Build Coastguard Worker // (of type Args...).
1354*481dde66SAndroid Build Coastguard Worker template <template <typename T> class CombiningMatcher, typename... Args>
1355*481dde66SAndroid Build Coastguard Worker class VariadicMatcher {
1356*481dde66SAndroid Build Coastguard Worker public:
1357*481dde66SAndroid Build Coastguard Worker VariadicMatcher(const Args&... matchers) // NOLINT
1358*481dde66SAndroid Build Coastguard Worker : matchers_(matchers...) {
1359*481dde66SAndroid Build Coastguard Worker static_assert(sizeof...(Args) > 0, "Must have at least one matcher.");
1360*481dde66SAndroid Build Coastguard Worker }
1361*481dde66SAndroid Build Coastguard Worker
1362*481dde66SAndroid Build Coastguard Worker VariadicMatcher(const VariadicMatcher&) = default;
1363*481dde66SAndroid Build Coastguard Worker VariadicMatcher& operator=(const VariadicMatcher&) = delete;
1364*481dde66SAndroid Build Coastguard Worker
1365*481dde66SAndroid Build Coastguard Worker // This template type conversion operator allows an
1366*481dde66SAndroid Build Coastguard Worker // VariadicMatcher<Matcher1, Matcher2...> object to match any type that
1367*481dde66SAndroid Build Coastguard Worker // all of the provided matchers (Matcher1, Matcher2, ...) can match.
1368*481dde66SAndroid Build Coastguard Worker template <typename T>
1369*481dde66SAndroid Build Coastguard Worker operator Matcher<T>() const {
1370*481dde66SAndroid Build Coastguard Worker std::vector<Matcher<T>> values;
1371*481dde66SAndroid Build Coastguard Worker CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());
1372*481dde66SAndroid Build Coastguard Worker return Matcher<T>(new CombiningMatcher<T>(std::move(values)));
1373*481dde66SAndroid Build Coastguard Worker }
1374*481dde66SAndroid Build Coastguard Worker
1375*481dde66SAndroid Build Coastguard Worker private:
1376*481dde66SAndroid Build Coastguard Worker template <typename T, size_t I>
1377*481dde66SAndroid Build Coastguard Worker void CreateVariadicMatcher(std::vector<Matcher<T>>* values,
1378*481dde66SAndroid Build Coastguard Worker std::integral_constant<size_t, I>) const {
1379*481dde66SAndroid Build Coastguard Worker values->push_back(SafeMatcherCast<T>(std::get<I>(matchers_)));
1380*481dde66SAndroid Build Coastguard Worker CreateVariadicMatcher<T>(values, std::integral_constant<size_t, I + 1>());
1381*481dde66SAndroid Build Coastguard Worker }
1382*481dde66SAndroid Build Coastguard Worker
1383*481dde66SAndroid Build Coastguard Worker template <typename T>
1384*481dde66SAndroid Build Coastguard Worker void CreateVariadicMatcher(
1385*481dde66SAndroid Build Coastguard Worker std::vector<Matcher<T>>*,
1386*481dde66SAndroid Build Coastguard Worker std::integral_constant<size_t, sizeof...(Args)>) const {}
1387*481dde66SAndroid Build Coastguard Worker
1388*481dde66SAndroid Build Coastguard Worker std::tuple<Args...> matchers_;
1389*481dde66SAndroid Build Coastguard Worker };
1390*481dde66SAndroid Build Coastguard Worker
1391*481dde66SAndroid Build Coastguard Worker template <typename... Args>
1392*481dde66SAndroid Build Coastguard Worker using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;
1393*481dde66SAndroid Build Coastguard Worker
1394*481dde66SAndroid Build Coastguard Worker // Implements the AnyOf(m1, m2) matcher for a particular argument type
1395*481dde66SAndroid Build Coastguard Worker // T. We do not nest it inside the AnyOfMatcher class template, as
1396*481dde66SAndroid Build Coastguard Worker // that will prevent different instantiations of AnyOfMatcher from
1397*481dde66SAndroid Build Coastguard Worker // sharing the same EitherOfMatcherImpl<T> class.
1398*481dde66SAndroid Build Coastguard Worker template <typename T>
1399*481dde66SAndroid Build Coastguard Worker class AnyOfMatcherImpl : public MatcherInterface<const T&> {
1400*481dde66SAndroid Build Coastguard Worker public:
1401*481dde66SAndroid Build Coastguard Worker explicit AnyOfMatcherImpl(std::vector<Matcher<T>> matchers)
1402*481dde66SAndroid Build Coastguard Worker : matchers_(std::move(matchers)) {}
1403*481dde66SAndroid Build Coastguard Worker
1404*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1405*481dde66SAndroid Build Coastguard Worker *os << "(";
1406*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i < matchers_.size(); ++i) {
1407*481dde66SAndroid Build Coastguard Worker if (i != 0) *os << ") or (";
1408*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeTo(os);
1409*481dde66SAndroid Build Coastguard Worker }
1410*481dde66SAndroid Build Coastguard Worker *os << ")";
1411*481dde66SAndroid Build Coastguard Worker }
1412*481dde66SAndroid Build Coastguard Worker
1413*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1414*481dde66SAndroid Build Coastguard Worker *os << "(";
1415*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i < matchers_.size(); ++i) {
1416*481dde66SAndroid Build Coastguard Worker if (i != 0) *os << ") and (";
1417*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeNegationTo(os);
1418*481dde66SAndroid Build Coastguard Worker }
1419*481dde66SAndroid Build Coastguard Worker *os << ")";
1420*481dde66SAndroid Build Coastguard Worker }
1421*481dde66SAndroid Build Coastguard Worker
1422*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& x,
1423*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1424*481dde66SAndroid Build Coastguard Worker std::string no_match_result;
1425*481dde66SAndroid Build Coastguard Worker
1426*481dde66SAndroid Build Coastguard Worker // If either matcher1_ or matcher2_ matches x, we just need to
1427*481dde66SAndroid Build Coastguard Worker // explain why *one* of them matches.
1428*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i < matchers_.size(); ++i) {
1429*481dde66SAndroid Build Coastguard Worker StringMatchResultListener slistener;
1430*481dde66SAndroid Build Coastguard Worker if (matchers_[i].MatchAndExplain(x, &slistener)) {
1431*481dde66SAndroid Build Coastguard Worker *listener << slistener.str();
1432*481dde66SAndroid Build Coastguard Worker return true;
1433*481dde66SAndroid Build Coastguard Worker } else {
1434*481dde66SAndroid Build Coastguard Worker if (no_match_result.empty()) {
1435*481dde66SAndroid Build Coastguard Worker no_match_result = slistener.str();
1436*481dde66SAndroid Build Coastguard Worker } else {
1437*481dde66SAndroid Build Coastguard Worker std::string result = slistener.str();
1438*481dde66SAndroid Build Coastguard Worker if (!result.empty()) {
1439*481dde66SAndroid Build Coastguard Worker no_match_result += ", and ";
1440*481dde66SAndroid Build Coastguard Worker no_match_result += result;
1441*481dde66SAndroid Build Coastguard Worker }
1442*481dde66SAndroid Build Coastguard Worker }
1443*481dde66SAndroid Build Coastguard Worker }
1444*481dde66SAndroid Build Coastguard Worker }
1445*481dde66SAndroid Build Coastguard Worker
1446*481dde66SAndroid Build Coastguard Worker // Otherwise we need to explain why *both* of them fail.
1447*481dde66SAndroid Build Coastguard Worker *listener << no_match_result;
1448*481dde66SAndroid Build Coastguard Worker return false;
1449*481dde66SAndroid Build Coastguard Worker }
1450*481dde66SAndroid Build Coastguard Worker
1451*481dde66SAndroid Build Coastguard Worker private:
1452*481dde66SAndroid Build Coastguard Worker const std::vector<Matcher<T>> matchers_;
1453*481dde66SAndroid Build Coastguard Worker };
1454*481dde66SAndroid Build Coastguard Worker
1455*481dde66SAndroid Build Coastguard Worker // AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
1456*481dde66SAndroid Build Coastguard Worker template <typename... Args>
1457*481dde66SAndroid Build Coastguard Worker using AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;
1458*481dde66SAndroid Build Coastguard Worker
1459*481dde66SAndroid Build Coastguard Worker // ConditionalMatcher is the implementation of Conditional(cond, m1, m2)
1460*481dde66SAndroid Build Coastguard Worker template <typename MatcherTrue, typename MatcherFalse>
1461*481dde66SAndroid Build Coastguard Worker class ConditionalMatcher {
1462*481dde66SAndroid Build Coastguard Worker public:
1463*481dde66SAndroid Build Coastguard Worker ConditionalMatcher(bool condition, MatcherTrue matcher_true,
1464*481dde66SAndroid Build Coastguard Worker MatcherFalse matcher_false)
1465*481dde66SAndroid Build Coastguard Worker : condition_(condition),
1466*481dde66SAndroid Build Coastguard Worker matcher_true_(std::move(matcher_true)),
1467*481dde66SAndroid Build Coastguard Worker matcher_false_(std::move(matcher_false)) {}
1468*481dde66SAndroid Build Coastguard Worker
1469*481dde66SAndroid Build Coastguard Worker template <typename T>
1470*481dde66SAndroid Build Coastguard Worker operator Matcher<T>() const { // NOLINT(runtime/explicit)
1471*481dde66SAndroid Build Coastguard Worker return condition_ ? SafeMatcherCast<T>(matcher_true_)
1472*481dde66SAndroid Build Coastguard Worker : SafeMatcherCast<T>(matcher_false_);
1473*481dde66SAndroid Build Coastguard Worker }
1474*481dde66SAndroid Build Coastguard Worker
1475*481dde66SAndroid Build Coastguard Worker private:
1476*481dde66SAndroid Build Coastguard Worker bool condition_;
1477*481dde66SAndroid Build Coastguard Worker MatcherTrue matcher_true_;
1478*481dde66SAndroid Build Coastguard Worker MatcherFalse matcher_false_;
1479*481dde66SAndroid Build Coastguard Worker };
1480*481dde66SAndroid Build Coastguard Worker
1481*481dde66SAndroid Build Coastguard Worker // Wrapper for implementation of Any/AllOfArray().
1482*481dde66SAndroid Build Coastguard Worker template <template <class> class MatcherImpl, typename T>
1483*481dde66SAndroid Build Coastguard Worker class SomeOfArrayMatcher {
1484*481dde66SAndroid Build Coastguard Worker public:
1485*481dde66SAndroid Build Coastguard Worker // Constructs the matcher from a sequence of element values or
1486*481dde66SAndroid Build Coastguard Worker // element matchers.
1487*481dde66SAndroid Build Coastguard Worker template <typename Iter>
1488*481dde66SAndroid Build Coastguard Worker SomeOfArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
1489*481dde66SAndroid Build Coastguard Worker
1490*481dde66SAndroid Build Coastguard Worker template <typename U>
1491*481dde66SAndroid Build Coastguard Worker operator Matcher<U>() const { // NOLINT
1492*481dde66SAndroid Build Coastguard Worker using RawU = typename std::decay<U>::type;
1493*481dde66SAndroid Build Coastguard Worker std::vector<Matcher<RawU>> matchers;
1494*481dde66SAndroid Build Coastguard Worker matchers.reserve(matchers_.size());
1495*481dde66SAndroid Build Coastguard Worker for (const auto& matcher : matchers_) {
1496*481dde66SAndroid Build Coastguard Worker matchers.push_back(MatcherCast<RawU>(matcher));
1497*481dde66SAndroid Build Coastguard Worker }
1498*481dde66SAndroid Build Coastguard Worker return Matcher<U>(new MatcherImpl<RawU>(std::move(matchers)));
1499*481dde66SAndroid Build Coastguard Worker }
1500*481dde66SAndroid Build Coastguard Worker
1501*481dde66SAndroid Build Coastguard Worker private:
1502*481dde66SAndroid Build Coastguard Worker const ::std::vector<T> matchers_;
1503*481dde66SAndroid Build Coastguard Worker };
1504*481dde66SAndroid Build Coastguard Worker
1505*481dde66SAndroid Build Coastguard Worker template <typename T>
1506*481dde66SAndroid Build Coastguard Worker using AllOfArrayMatcher = SomeOfArrayMatcher<AllOfMatcherImpl, T>;
1507*481dde66SAndroid Build Coastguard Worker
1508*481dde66SAndroid Build Coastguard Worker template <typename T>
1509*481dde66SAndroid Build Coastguard Worker using AnyOfArrayMatcher = SomeOfArrayMatcher<AnyOfMatcherImpl, T>;
1510*481dde66SAndroid Build Coastguard Worker
1511*481dde66SAndroid Build Coastguard Worker // Used for implementing Truly(pred), which turns a predicate into a
1512*481dde66SAndroid Build Coastguard Worker // matcher.
1513*481dde66SAndroid Build Coastguard Worker template <typename Predicate>
1514*481dde66SAndroid Build Coastguard Worker class TrulyMatcher {
1515*481dde66SAndroid Build Coastguard Worker public:
1516*481dde66SAndroid Build Coastguard Worker explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}
1517*481dde66SAndroid Build Coastguard Worker
1518*481dde66SAndroid Build Coastguard Worker // This method template allows Truly(pred) to be used as a matcher
1519*481dde66SAndroid Build Coastguard Worker // for type T where T is the argument type of predicate 'pred'. The
1520*481dde66SAndroid Build Coastguard Worker // argument is passed by reference as the predicate may be
1521*481dde66SAndroid Build Coastguard Worker // interested in the address of the argument.
1522*481dde66SAndroid Build Coastguard Worker template <typename T>
1523*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T& x, // NOLINT
1524*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
1525*481dde66SAndroid Build Coastguard Worker // Without the if-statement, MSVC sometimes warns about converting
1526*481dde66SAndroid Build Coastguard Worker // a value to bool (warning 4800).
1527*481dde66SAndroid Build Coastguard Worker //
1528*481dde66SAndroid Build Coastguard Worker // We cannot write 'return !!predicate_(x);' as that doesn't work
1529*481dde66SAndroid Build Coastguard Worker // when predicate_(x) returns a class convertible to bool but
1530*481dde66SAndroid Build Coastguard Worker // having no operator!().
1531*481dde66SAndroid Build Coastguard Worker if (predicate_(x)) return true;
1532*481dde66SAndroid Build Coastguard Worker *listener << "didn't satisfy the given predicate";
1533*481dde66SAndroid Build Coastguard Worker return false;
1534*481dde66SAndroid Build Coastguard Worker }
1535*481dde66SAndroid Build Coastguard Worker
1536*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
1537*481dde66SAndroid Build Coastguard Worker *os << "satisfies the given predicate";
1538*481dde66SAndroid Build Coastguard Worker }
1539*481dde66SAndroid Build Coastguard Worker
1540*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
1541*481dde66SAndroid Build Coastguard Worker *os << "doesn't satisfy the given predicate";
1542*481dde66SAndroid Build Coastguard Worker }
1543*481dde66SAndroid Build Coastguard Worker
1544*481dde66SAndroid Build Coastguard Worker private:
1545*481dde66SAndroid Build Coastguard Worker Predicate predicate_;
1546*481dde66SAndroid Build Coastguard Worker };
1547*481dde66SAndroid Build Coastguard Worker
1548*481dde66SAndroid Build Coastguard Worker // Used for implementing Matches(matcher), which turns a matcher into
1549*481dde66SAndroid Build Coastguard Worker // a predicate.
1550*481dde66SAndroid Build Coastguard Worker template <typename M>
1551*481dde66SAndroid Build Coastguard Worker class MatcherAsPredicate {
1552*481dde66SAndroid Build Coastguard Worker public:
1553*481dde66SAndroid Build Coastguard Worker explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}
1554*481dde66SAndroid Build Coastguard Worker
1555*481dde66SAndroid Build Coastguard Worker // This template operator() allows Matches(m) to be used as a
1556*481dde66SAndroid Build Coastguard Worker // predicate on type T where m is a matcher on type T.
1557*481dde66SAndroid Build Coastguard Worker //
1558*481dde66SAndroid Build Coastguard Worker // The argument x is passed by reference instead of by value, as
1559*481dde66SAndroid Build Coastguard Worker // some matcher may be interested in its address (e.g. as in
1560*481dde66SAndroid Build Coastguard Worker // Matches(Ref(n))(x)).
1561*481dde66SAndroid Build Coastguard Worker template <typename T>
1562*481dde66SAndroid Build Coastguard Worker bool operator()(const T& x) const {
1563*481dde66SAndroid Build Coastguard Worker // We let matcher_ commit to a particular type here instead of
1564*481dde66SAndroid Build Coastguard Worker // when the MatcherAsPredicate object was constructed. This
1565*481dde66SAndroid Build Coastguard Worker // allows us to write Matches(m) where m is a polymorphic matcher
1566*481dde66SAndroid Build Coastguard Worker // (e.g. Eq(5)).
1567*481dde66SAndroid Build Coastguard Worker //
1568*481dde66SAndroid Build Coastguard Worker // If we write Matcher<T>(matcher_).Matches(x) here, it won't
1569*481dde66SAndroid Build Coastguard Worker // compile when matcher_ has type Matcher<const T&>; if we write
1570*481dde66SAndroid Build Coastguard Worker // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
1571*481dde66SAndroid Build Coastguard Worker // when matcher_ has type Matcher<T>; if we just write
1572*481dde66SAndroid Build Coastguard Worker // matcher_.Matches(x), it won't compile when matcher_ is
1573*481dde66SAndroid Build Coastguard Worker // polymorphic, e.g. Eq(5).
1574*481dde66SAndroid Build Coastguard Worker //
1575*481dde66SAndroid Build Coastguard Worker // MatcherCast<const T&>() is necessary for making the code work
1576*481dde66SAndroid Build Coastguard Worker // in all of the above situations.
1577*481dde66SAndroid Build Coastguard Worker return MatcherCast<const T&>(matcher_).Matches(x);
1578*481dde66SAndroid Build Coastguard Worker }
1579*481dde66SAndroid Build Coastguard Worker
1580*481dde66SAndroid Build Coastguard Worker private:
1581*481dde66SAndroid Build Coastguard Worker M matcher_;
1582*481dde66SAndroid Build Coastguard Worker };
1583*481dde66SAndroid Build Coastguard Worker
1584*481dde66SAndroid Build Coastguard Worker // For implementing ASSERT_THAT() and EXPECT_THAT(). The template
1585*481dde66SAndroid Build Coastguard Worker // argument M must be a type that can be converted to a matcher.
1586*481dde66SAndroid Build Coastguard Worker template <typename M>
1587*481dde66SAndroid Build Coastguard Worker class PredicateFormatterFromMatcher {
1588*481dde66SAndroid Build Coastguard Worker public:
1589*481dde66SAndroid Build Coastguard Worker explicit PredicateFormatterFromMatcher(M m) : matcher_(std::move(m)) {}
1590*481dde66SAndroid Build Coastguard Worker
1591*481dde66SAndroid Build Coastguard Worker // This template () operator allows a PredicateFormatterFromMatcher
1592*481dde66SAndroid Build Coastguard Worker // object to act as a predicate-formatter suitable for using with
1593*481dde66SAndroid Build Coastguard Worker // Google Test's EXPECT_PRED_FORMAT1() macro.
1594*481dde66SAndroid Build Coastguard Worker template <typename T>
1595*481dde66SAndroid Build Coastguard Worker AssertionResult operator()(const char* value_text, const T& x) const {
1596*481dde66SAndroid Build Coastguard Worker // We convert matcher_ to a Matcher<const T&> *now* instead of
1597*481dde66SAndroid Build Coastguard Worker // when the PredicateFormatterFromMatcher object was constructed,
1598*481dde66SAndroid Build Coastguard Worker // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
1599*481dde66SAndroid Build Coastguard Worker // know which type to instantiate it to until we actually see the
1600*481dde66SAndroid Build Coastguard Worker // type of x here.
1601*481dde66SAndroid Build Coastguard Worker //
1602*481dde66SAndroid Build Coastguard Worker // We write SafeMatcherCast<const T&>(matcher_) instead of
1603*481dde66SAndroid Build Coastguard Worker // Matcher<const T&>(matcher_), as the latter won't compile when
1604*481dde66SAndroid Build Coastguard Worker // matcher_ has type Matcher<T> (e.g. An<int>()).
1605*481dde66SAndroid Build Coastguard Worker // We don't write MatcherCast<const T&> either, as that allows
1606*481dde66SAndroid Build Coastguard Worker // potentially unsafe downcasting of the matcher argument.
1607*481dde66SAndroid Build Coastguard Worker const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
1608*481dde66SAndroid Build Coastguard Worker
1609*481dde66SAndroid Build Coastguard Worker // The expected path here is that the matcher should match (i.e. that most
1610*481dde66SAndroid Build Coastguard Worker // tests pass) so optimize for this case.
1611*481dde66SAndroid Build Coastguard Worker if (matcher.Matches(x)) {
1612*481dde66SAndroid Build Coastguard Worker return AssertionSuccess();
1613*481dde66SAndroid Build Coastguard Worker }
1614*481dde66SAndroid Build Coastguard Worker
1615*481dde66SAndroid Build Coastguard Worker ::std::stringstream ss;
1616*481dde66SAndroid Build Coastguard Worker ss << "Value of: " << value_text << "\n"
1617*481dde66SAndroid Build Coastguard Worker << "Expected: ";
1618*481dde66SAndroid Build Coastguard Worker matcher.DescribeTo(&ss);
1619*481dde66SAndroid Build Coastguard Worker
1620*481dde66SAndroid Build Coastguard Worker // Rerun the matcher to "PrintAndExplain" the failure.
1621*481dde66SAndroid Build Coastguard Worker StringMatchResultListener listener;
1622*481dde66SAndroid Build Coastguard Worker if (MatchPrintAndExplain(x, matcher, &listener)) {
1623*481dde66SAndroid Build Coastguard Worker ss << "\n The matcher failed on the initial attempt; but passed when "
1624*481dde66SAndroid Build Coastguard Worker "rerun to generate the explanation.";
1625*481dde66SAndroid Build Coastguard Worker }
1626*481dde66SAndroid Build Coastguard Worker ss << "\n Actual: " << listener.str();
1627*481dde66SAndroid Build Coastguard Worker return AssertionFailure() << ss.str();
1628*481dde66SAndroid Build Coastguard Worker }
1629*481dde66SAndroid Build Coastguard Worker
1630*481dde66SAndroid Build Coastguard Worker private:
1631*481dde66SAndroid Build Coastguard Worker const M matcher_;
1632*481dde66SAndroid Build Coastguard Worker };
1633*481dde66SAndroid Build Coastguard Worker
1634*481dde66SAndroid Build Coastguard Worker // A helper function for converting a matcher to a predicate-formatter
1635*481dde66SAndroid Build Coastguard Worker // without the user needing to explicitly write the type. This is
1636*481dde66SAndroid Build Coastguard Worker // used for implementing ASSERT_THAT() and EXPECT_THAT().
1637*481dde66SAndroid Build Coastguard Worker // Implementation detail: 'matcher' is received by-value to force decaying.
1638*481dde66SAndroid Build Coastguard Worker template <typename M>
1639*481dde66SAndroid Build Coastguard Worker inline PredicateFormatterFromMatcher<M> MakePredicateFormatterFromMatcher(
1640*481dde66SAndroid Build Coastguard Worker M matcher) {
1641*481dde66SAndroid Build Coastguard Worker return PredicateFormatterFromMatcher<M>(std::move(matcher));
1642*481dde66SAndroid Build Coastguard Worker }
1643*481dde66SAndroid Build Coastguard Worker
1644*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic IsNan() matcher, which matches any floating type
1645*481dde66SAndroid Build Coastguard Worker // value that is Nan.
1646*481dde66SAndroid Build Coastguard Worker class IsNanMatcher {
1647*481dde66SAndroid Build Coastguard Worker public:
1648*481dde66SAndroid Build Coastguard Worker template <typename FloatType>
1649*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const FloatType& f,
1650*481dde66SAndroid Build Coastguard Worker MatchResultListener* /* listener */) const {
1651*481dde66SAndroid Build Coastguard Worker return (::std::isnan)(f);
1652*481dde66SAndroid Build Coastguard Worker }
1653*481dde66SAndroid Build Coastguard Worker
1654*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const { *os << "is NaN"; }
1655*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const { *os << "isn't NaN"; }
1656*481dde66SAndroid Build Coastguard Worker };
1657*481dde66SAndroid Build Coastguard Worker
1658*481dde66SAndroid Build Coastguard Worker // Implements the polymorphic floating point equality matcher, which matches
1659*481dde66SAndroid Build Coastguard Worker // two float values using ULP-based approximation or, optionally, a
1660*481dde66SAndroid Build Coastguard Worker // user-specified epsilon. The template is meant to be instantiated with
1661*481dde66SAndroid Build Coastguard Worker // FloatType being either float or double.
1662*481dde66SAndroid Build Coastguard Worker template <typename FloatType>
1663*481dde66SAndroid Build Coastguard Worker class FloatingEqMatcher {
1664*481dde66SAndroid Build Coastguard Worker public:
1665*481dde66SAndroid Build Coastguard Worker // Constructor for FloatingEqMatcher.
1666*481dde66SAndroid Build Coastguard Worker // The matcher's input will be compared with expected. The matcher treats two
1667*481dde66SAndroid Build Coastguard Worker // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards,
1668*481dde66SAndroid Build Coastguard Worker // equality comparisons between NANs will always return false. We specify a
1669*481dde66SAndroid Build Coastguard Worker // negative max_abs_error_ term to indicate that ULP-based approximation will
1670*481dde66SAndroid Build Coastguard Worker // be used for comparison.
1671*481dde66SAndroid Build Coastguard Worker FloatingEqMatcher(FloatType expected, bool nan_eq_nan)
1672*481dde66SAndroid Build Coastguard Worker : expected_(expected), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {}
1673*481dde66SAndroid Build Coastguard Worker
1674*481dde66SAndroid Build Coastguard Worker // Constructor that supports a user-specified max_abs_error that will be used
1675*481dde66SAndroid Build Coastguard Worker // for comparison instead of ULP-based approximation. The max absolute
1676*481dde66SAndroid Build Coastguard Worker // should be non-negative.
1677*481dde66SAndroid Build Coastguard Worker FloatingEqMatcher(FloatType expected, bool nan_eq_nan,
1678*481dde66SAndroid Build Coastguard Worker FloatType max_abs_error)
1679*481dde66SAndroid Build Coastguard Worker : expected_(expected),
1680*481dde66SAndroid Build Coastguard Worker nan_eq_nan_(nan_eq_nan),
1681*481dde66SAndroid Build Coastguard Worker max_abs_error_(max_abs_error) {
1682*481dde66SAndroid Build Coastguard Worker GTEST_CHECK_(max_abs_error >= 0)
1683*481dde66SAndroid Build Coastguard Worker << ", where max_abs_error is" << max_abs_error;
1684*481dde66SAndroid Build Coastguard Worker }
1685*481dde66SAndroid Build Coastguard Worker
1686*481dde66SAndroid Build Coastguard Worker // Implements floating point equality matcher as a Matcher<T>.
1687*481dde66SAndroid Build Coastguard Worker template <typename T>
1688*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<T> {
1689*481dde66SAndroid Build Coastguard Worker public:
1690*481dde66SAndroid Build Coastguard Worker Impl(FloatType expected, bool nan_eq_nan, FloatType max_abs_error)
1691*481dde66SAndroid Build Coastguard Worker : expected_(expected),
1692*481dde66SAndroid Build Coastguard Worker nan_eq_nan_(nan_eq_nan),
1693*481dde66SAndroid Build Coastguard Worker max_abs_error_(max_abs_error) {}
1694*481dde66SAndroid Build Coastguard Worker
1695*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T value,
1696*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1697*481dde66SAndroid Build Coastguard Worker const FloatingPoint<FloatType> actual(value), expected(expected_);
1698*481dde66SAndroid Build Coastguard Worker
1699*481dde66SAndroid Build Coastguard Worker // Compares NaNs first, if nan_eq_nan_ is true.
1700*481dde66SAndroid Build Coastguard Worker if (actual.is_nan() || expected.is_nan()) {
1701*481dde66SAndroid Build Coastguard Worker if (actual.is_nan() && expected.is_nan()) {
1702*481dde66SAndroid Build Coastguard Worker return nan_eq_nan_;
1703*481dde66SAndroid Build Coastguard Worker }
1704*481dde66SAndroid Build Coastguard Worker // One is nan; the other is not nan.
1705*481dde66SAndroid Build Coastguard Worker return false;
1706*481dde66SAndroid Build Coastguard Worker }
1707*481dde66SAndroid Build Coastguard Worker if (HasMaxAbsError()) {
1708*481dde66SAndroid Build Coastguard Worker // We perform an equality check so that inf will match inf, regardless
1709*481dde66SAndroid Build Coastguard Worker // of error bounds. If the result of value - expected_ would result in
1710*481dde66SAndroid Build Coastguard Worker // overflow or if either value is inf, the default result is infinity,
1711*481dde66SAndroid Build Coastguard Worker // which should only match if max_abs_error_ is also infinity.
1712*481dde66SAndroid Build Coastguard Worker if (value == expected_) {
1713*481dde66SAndroid Build Coastguard Worker return true;
1714*481dde66SAndroid Build Coastguard Worker }
1715*481dde66SAndroid Build Coastguard Worker
1716*481dde66SAndroid Build Coastguard Worker const FloatType diff = value - expected_;
1717*481dde66SAndroid Build Coastguard Worker if (::std::fabs(diff) <= max_abs_error_) {
1718*481dde66SAndroid Build Coastguard Worker return true;
1719*481dde66SAndroid Build Coastguard Worker }
1720*481dde66SAndroid Build Coastguard Worker
1721*481dde66SAndroid Build Coastguard Worker if (listener->IsInterested()) {
1722*481dde66SAndroid Build Coastguard Worker *listener << "which is " << diff << " from " << expected_;
1723*481dde66SAndroid Build Coastguard Worker }
1724*481dde66SAndroid Build Coastguard Worker return false;
1725*481dde66SAndroid Build Coastguard Worker } else {
1726*481dde66SAndroid Build Coastguard Worker return actual.AlmostEquals(expected);
1727*481dde66SAndroid Build Coastguard Worker }
1728*481dde66SAndroid Build Coastguard Worker }
1729*481dde66SAndroid Build Coastguard Worker
1730*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1731*481dde66SAndroid Build Coastguard Worker // os->precision() returns the previously set precision, which we
1732*481dde66SAndroid Build Coastguard Worker // store to restore the ostream to its original configuration
1733*481dde66SAndroid Build Coastguard Worker // after outputting.
1734*481dde66SAndroid Build Coastguard Worker const ::std::streamsize old_precision =
1735*481dde66SAndroid Build Coastguard Worker os->precision(::std::numeric_limits<FloatType>::digits10 + 2);
1736*481dde66SAndroid Build Coastguard Worker if (FloatingPoint<FloatType>(expected_).is_nan()) {
1737*481dde66SAndroid Build Coastguard Worker if (nan_eq_nan_) {
1738*481dde66SAndroid Build Coastguard Worker *os << "is NaN";
1739*481dde66SAndroid Build Coastguard Worker } else {
1740*481dde66SAndroid Build Coastguard Worker *os << "never matches";
1741*481dde66SAndroid Build Coastguard Worker }
1742*481dde66SAndroid Build Coastguard Worker } else {
1743*481dde66SAndroid Build Coastguard Worker *os << "is approximately " << expected_;
1744*481dde66SAndroid Build Coastguard Worker if (HasMaxAbsError()) {
1745*481dde66SAndroid Build Coastguard Worker *os << " (absolute error <= " << max_abs_error_ << ")";
1746*481dde66SAndroid Build Coastguard Worker }
1747*481dde66SAndroid Build Coastguard Worker }
1748*481dde66SAndroid Build Coastguard Worker os->precision(old_precision);
1749*481dde66SAndroid Build Coastguard Worker }
1750*481dde66SAndroid Build Coastguard Worker
1751*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1752*481dde66SAndroid Build Coastguard Worker // As before, get original precision.
1753*481dde66SAndroid Build Coastguard Worker const ::std::streamsize old_precision =
1754*481dde66SAndroid Build Coastguard Worker os->precision(::std::numeric_limits<FloatType>::digits10 + 2);
1755*481dde66SAndroid Build Coastguard Worker if (FloatingPoint<FloatType>(expected_).is_nan()) {
1756*481dde66SAndroid Build Coastguard Worker if (nan_eq_nan_) {
1757*481dde66SAndroid Build Coastguard Worker *os << "isn't NaN";
1758*481dde66SAndroid Build Coastguard Worker } else {
1759*481dde66SAndroid Build Coastguard Worker *os << "is anything";
1760*481dde66SAndroid Build Coastguard Worker }
1761*481dde66SAndroid Build Coastguard Worker } else {
1762*481dde66SAndroid Build Coastguard Worker *os << "isn't approximately " << expected_;
1763*481dde66SAndroid Build Coastguard Worker if (HasMaxAbsError()) {
1764*481dde66SAndroid Build Coastguard Worker *os << " (absolute error > " << max_abs_error_ << ")";
1765*481dde66SAndroid Build Coastguard Worker }
1766*481dde66SAndroid Build Coastguard Worker }
1767*481dde66SAndroid Build Coastguard Worker // Restore original precision.
1768*481dde66SAndroid Build Coastguard Worker os->precision(old_precision);
1769*481dde66SAndroid Build Coastguard Worker }
1770*481dde66SAndroid Build Coastguard Worker
1771*481dde66SAndroid Build Coastguard Worker private:
1772*481dde66SAndroid Build Coastguard Worker bool HasMaxAbsError() const { return max_abs_error_ >= 0; }
1773*481dde66SAndroid Build Coastguard Worker
1774*481dde66SAndroid Build Coastguard Worker const FloatType expected_;
1775*481dde66SAndroid Build Coastguard Worker const bool nan_eq_nan_;
1776*481dde66SAndroid Build Coastguard Worker // max_abs_error will be used for value comparison when >= 0.
1777*481dde66SAndroid Build Coastguard Worker const FloatType max_abs_error_;
1778*481dde66SAndroid Build Coastguard Worker };
1779*481dde66SAndroid Build Coastguard Worker
1780*481dde66SAndroid Build Coastguard Worker // The following 3 type conversion operators allow FloatEq(expected) and
1781*481dde66SAndroid Build Coastguard Worker // NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a
1782*481dde66SAndroid Build Coastguard Worker // Matcher<const float&>, or a Matcher<float&>, but nothing else.
1783*481dde66SAndroid Build Coastguard Worker operator Matcher<FloatType>() const {
1784*481dde66SAndroid Build Coastguard Worker return MakeMatcher(
1785*481dde66SAndroid Build Coastguard Worker new Impl<FloatType>(expected_, nan_eq_nan_, max_abs_error_));
1786*481dde66SAndroid Build Coastguard Worker }
1787*481dde66SAndroid Build Coastguard Worker
1788*481dde66SAndroid Build Coastguard Worker operator Matcher<const FloatType&>() const {
1789*481dde66SAndroid Build Coastguard Worker return MakeMatcher(
1790*481dde66SAndroid Build Coastguard Worker new Impl<const FloatType&>(expected_, nan_eq_nan_, max_abs_error_));
1791*481dde66SAndroid Build Coastguard Worker }
1792*481dde66SAndroid Build Coastguard Worker
1793*481dde66SAndroid Build Coastguard Worker operator Matcher<FloatType&>() const {
1794*481dde66SAndroid Build Coastguard Worker return MakeMatcher(
1795*481dde66SAndroid Build Coastguard Worker new Impl<FloatType&>(expected_, nan_eq_nan_, max_abs_error_));
1796*481dde66SAndroid Build Coastguard Worker }
1797*481dde66SAndroid Build Coastguard Worker
1798*481dde66SAndroid Build Coastguard Worker private:
1799*481dde66SAndroid Build Coastguard Worker const FloatType expected_;
1800*481dde66SAndroid Build Coastguard Worker const bool nan_eq_nan_;
1801*481dde66SAndroid Build Coastguard Worker // max_abs_error will be used for value comparison when >= 0.
1802*481dde66SAndroid Build Coastguard Worker const FloatType max_abs_error_;
1803*481dde66SAndroid Build Coastguard Worker };
1804*481dde66SAndroid Build Coastguard Worker
1805*481dde66SAndroid Build Coastguard Worker // A 2-tuple ("binary") wrapper around FloatingEqMatcher:
1806*481dde66SAndroid Build Coastguard Worker // FloatingEq2Matcher() matches (x, y) by matching FloatingEqMatcher(x, false)
1807*481dde66SAndroid Build Coastguard Worker // against y, and FloatingEq2Matcher(e) matches FloatingEqMatcher(x, false, e)
1808*481dde66SAndroid Build Coastguard Worker // against y. The former implements "Eq", the latter "Near". At present, there
1809*481dde66SAndroid Build Coastguard Worker // is no version that compares NaNs as equal.
1810*481dde66SAndroid Build Coastguard Worker template <typename FloatType>
1811*481dde66SAndroid Build Coastguard Worker class FloatingEq2Matcher {
1812*481dde66SAndroid Build Coastguard Worker public:
1813*481dde66SAndroid Build Coastguard Worker FloatingEq2Matcher() { Init(-1, false); }
1814*481dde66SAndroid Build Coastguard Worker
1815*481dde66SAndroid Build Coastguard Worker explicit FloatingEq2Matcher(bool nan_eq_nan) { Init(-1, nan_eq_nan); }
1816*481dde66SAndroid Build Coastguard Worker
1817*481dde66SAndroid Build Coastguard Worker explicit FloatingEq2Matcher(FloatType max_abs_error) {
1818*481dde66SAndroid Build Coastguard Worker Init(max_abs_error, false);
1819*481dde66SAndroid Build Coastguard Worker }
1820*481dde66SAndroid Build Coastguard Worker
1821*481dde66SAndroid Build Coastguard Worker FloatingEq2Matcher(FloatType max_abs_error, bool nan_eq_nan) {
1822*481dde66SAndroid Build Coastguard Worker Init(max_abs_error, nan_eq_nan);
1823*481dde66SAndroid Build Coastguard Worker }
1824*481dde66SAndroid Build Coastguard Worker
1825*481dde66SAndroid Build Coastguard Worker template <typename T1, typename T2>
1826*481dde66SAndroid Build Coastguard Worker operator Matcher<::std::tuple<T1, T2>>() const {
1827*481dde66SAndroid Build Coastguard Worker return MakeMatcher(
1828*481dde66SAndroid Build Coastguard Worker new Impl<::std::tuple<T1, T2>>(max_abs_error_, nan_eq_nan_));
1829*481dde66SAndroid Build Coastguard Worker }
1830*481dde66SAndroid Build Coastguard Worker template <typename T1, typename T2>
1831*481dde66SAndroid Build Coastguard Worker operator Matcher<const ::std::tuple<T1, T2>&>() const {
1832*481dde66SAndroid Build Coastguard Worker return MakeMatcher(
1833*481dde66SAndroid Build Coastguard Worker new Impl<const ::std::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));
1834*481dde66SAndroid Build Coastguard Worker }
1835*481dde66SAndroid Build Coastguard Worker
1836*481dde66SAndroid Build Coastguard Worker private:
1837*481dde66SAndroid Build Coastguard Worker static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT
1838*481dde66SAndroid Build Coastguard Worker return os << "an almost-equal pair";
1839*481dde66SAndroid Build Coastguard Worker }
1840*481dde66SAndroid Build Coastguard Worker
1841*481dde66SAndroid Build Coastguard Worker template <typename Tuple>
1842*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Tuple> {
1843*481dde66SAndroid Build Coastguard Worker public:
1844*481dde66SAndroid Build Coastguard Worker Impl(FloatType max_abs_error, bool nan_eq_nan)
1845*481dde66SAndroid Build Coastguard Worker : max_abs_error_(max_abs_error), nan_eq_nan_(nan_eq_nan) {}
1846*481dde66SAndroid Build Coastguard Worker
1847*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Tuple args,
1848*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1849*481dde66SAndroid Build Coastguard Worker if (max_abs_error_ == -1) {
1850*481dde66SAndroid Build Coastguard Worker FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_);
1851*481dde66SAndroid Build Coastguard Worker return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(
1852*481dde66SAndroid Build Coastguard Worker ::std::get<1>(args), listener);
1853*481dde66SAndroid Build Coastguard Worker } else {
1854*481dde66SAndroid Build Coastguard Worker FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_,
1855*481dde66SAndroid Build Coastguard Worker max_abs_error_);
1856*481dde66SAndroid Build Coastguard Worker return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(
1857*481dde66SAndroid Build Coastguard Worker ::std::get<1>(args), listener);
1858*481dde66SAndroid Build Coastguard Worker }
1859*481dde66SAndroid Build Coastguard Worker }
1860*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1861*481dde66SAndroid Build Coastguard Worker *os << "are " << GetDesc;
1862*481dde66SAndroid Build Coastguard Worker }
1863*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1864*481dde66SAndroid Build Coastguard Worker *os << "aren't " << GetDesc;
1865*481dde66SAndroid Build Coastguard Worker }
1866*481dde66SAndroid Build Coastguard Worker
1867*481dde66SAndroid Build Coastguard Worker private:
1868*481dde66SAndroid Build Coastguard Worker FloatType max_abs_error_;
1869*481dde66SAndroid Build Coastguard Worker const bool nan_eq_nan_;
1870*481dde66SAndroid Build Coastguard Worker };
1871*481dde66SAndroid Build Coastguard Worker
1872*481dde66SAndroid Build Coastguard Worker void Init(FloatType max_abs_error_val, bool nan_eq_nan_val) {
1873*481dde66SAndroid Build Coastguard Worker max_abs_error_ = max_abs_error_val;
1874*481dde66SAndroid Build Coastguard Worker nan_eq_nan_ = nan_eq_nan_val;
1875*481dde66SAndroid Build Coastguard Worker }
1876*481dde66SAndroid Build Coastguard Worker FloatType max_abs_error_;
1877*481dde66SAndroid Build Coastguard Worker bool nan_eq_nan_;
1878*481dde66SAndroid Build Coastguard Worker };
1879*481dde66SAndroid Build Coastguard Worker
1880*481dde66SAndroid Build Coastguard Worker // Implements the Pointee(m) matcher for matching a pointer whose
1881*481dde66SAndroid Build Coastguard Worker // pointee matches matcher m. The pointer can be either raw or smart.
1882*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
1883*481dde66SAndroid Build Coastguard Worker class PointeeMatcher {
1884*481dde66SAndroid Build Coastguard Worker public:
1885*481dde66SAndroid Build Coastguard Worker explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
1886*481dde66SAndroid Build Coastguard Worker
1887*481dde66SAndroid Build Coastguard Worker // This type conversion operator template allows Pointee(m) to be
1888*481dde66SAndroid Build Coastguard Worker // used as a matcher for any pointer type whose pointee type is
1889*481dde66SAndroid Build Coastguard Worker // compatible with the inner matcher, where type Pointer can be
1890*481dde66SAndroid Build Coastguard Worker // either a raw pointer or a smart pointer.
1891*481dde66SAndroid Build Coastguard Worker //
1892*481dde66SAndroid Build Coastguard Worker // The reason we do this instead of relying on
1893*481dde66SAndroid Build Coastguard Worker // MakePolymorphicMatcher() is that the latter is not flexible
1894*481dde66SAndroid Build Coastguard Worker // enough for implementing the DescribeTo() method of Pointee().
1895*481dde66SAndroid Build Coastguard Worker template <typename Pointer>
1896*481dde66SAndroid Build Coastguard Worker operator Matcher<Pointer>() const {
1897*481dde66SAndroid Build Coastguard Worker return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));
1898*481dde66SAndroid Build Coastguard Worker }
1899*481dde66SAndroid Build Coastguard Worker
1900*481dde66SAndroid Build Coastguard Worker private:
1901*481dde66SAndroid Build Coastguard Worker // The monomorphic implementation that works for a particular pointer type.
1902*481dde66SAndroid Build Coastguard Worker template <typename Pointer>
1903*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Pointer> {
1904*481dde66SAndroid Build Coastguard Worker public:
1905*481dde66SAndroid Build Coastguard Worker using Pointee =
1906*481dde66SAndroid Build Coastguard Worker typename std::pointer_traits<GTEST_REMOVE_REFERENCE_AND_CONST_(
1907*481dde66SAndroid Build Coastguard Worker Pointer)>::element_type;
1908*481dde66SAndroid Build Coastguard Worker
1909*481dde66SAndroid Build Coastguard Worker explicit Impl(const InnerMatcher& matcher)
1910*481dde66SAndroid Build Coastguard Worker : matcher_(MatcherCast<const Pointee&>(matcher)) {}
1911*481dde66SAndroid Build Coastguard Worker
1912*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1913*481dde66SAndroid Build Coastguard Worker *os << "points to a value that ";
1914*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
1915*481dde66SAndroid Build Coastguard Worker }
1916*481dde66SAndroid Build Coastguard Worker
1917*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1918*481dde66SAndroid Build Coastguard Worker *os << "does not point to a value that ";
1919*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
1920*481dde66SAndroid Build Coastguard Worker }
1921*481dde66SAndroid Build Coastguard Worker
1922*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Pointer pointer,
1923*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1924*481dde66SAndroid Build Coastguard Worker if (GetRawPointer(pointer) == nullptr) return false;
1925*481dde66SAndroid Build Coastguard Worker
1926*481dde66SAndroid Build Coastguard Worker *listener << "which points to ";
1927*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(*pointer, matcher_, listener);
1928*481dde66SAndroid Build Coastguard Worker }
1929*481dde66SAndroid Build Coastguard Worker
1930*481dde66SAndroid Build Coastguard Worker private:
1931*481dde66SAndroid Build Coastguard Worker const Matcher<const Pointee&> matcher_;
1932*481dde66SAndroid Build Coastguard Worker };
1933*481dde66SAndroid Build Coastguard Worker
1934*481dde66SAndroid Build Coastguard Worker const InnerMatcher matcher_;
1935*481dde66SAndroid Build Coastguard Worker };
1936*481dde66SAndroid Build Coastguard Worker
1937*481dde66SAndroid Build Coastguard Worker // Implements the Pointer(m) matcher
1938*481dde66SAndroid Build Coastguard Worker // Implements the Pointer(m) matcher for matching a pointer that matches matcher
1939*481dde66SAndroid Build Coastguard Worker // m. The pointer can be either raw or smart, and will match `m` against the
1940*481dde66SAndroid Build Coastguard Worker // raw pointer.
1941*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
1942*481dde66SAndroid Build Coastguard Worker class PointerMatcher {
1943*481dde66SAndroid Build Coastguard Worker public:
1944*481dde66SAndroid Build Coastguard Worker explicit PointerMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
1945*481dde66SAndroid Build Coastguard Worker
1946*481dde66SAndroid Build Coastguard Worker // This type conversion operator template allows Pointer(m) to be
1947*481dde66SAndroid Build Coastguard Worker // used as a matcher for any pointer type whose pointer type is
1948*481dde66SAndroid Build Coastguard Worker // compatible with the inner matcher, where type PointerType can be
1949*481dde66SAndroid Build Coastguard Worker // either a raw pointer or a smart pointer.
1950*481dde66SAndroid Build Coastguard Worker //
1951*481dde66SAndroid Build Coastguard Worker // The reason we do this instead of relying on
1952*481dde66SAndroid Build Coastguard Worker // MakePolymorphicMatcher() is that the latter is not flexible
1953*481dde66SAndroid Build Coastguard Worker // enough for implementing the DescribeTo() method of Pointer().
1954*481dde66SAndroid Build Coastguard Worker template <typename PointerType>
1955*481dde66SAndroid Build Coastguard Worker operator Matcher<PointerType>() const { // NOLINT
1956*481dde66SAndroid Build Coastguard Worker return Matcher<PointerType>(new Impl<const PointerType&>(matcher_));
1957*481dde66SAndroid Build Coastguard Worker }
1958*481dde66SAndroid Build Coastguard Worker
1959*481dde66SAndroid Build Coastguard Worker private:
1960*481dde66SAndroid Build Coastguard Worker // The monomorphic implementation that works for a particular pointer type.
1961*481dde66SAndroid Build Coastguard Worker template <typename PointerType>
1962*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<PointerType> {
1963*481dde66SAndroid Build Coastguard Worker public:
1964*481dde66SAndroid Build Coastguard Worker using Pointer =
1965*481dde66SAndroid Build Coastguard Worker const typename std::pointer_traits<GTEST_REMOVE_REFERENCE_AND_CONST_(
1966*481dde66SAndroid Build Coastguard Worker PointerType)>::element_type*;
1967*481dde66SAndroid Build Coastguard Worker
1968*481dde66SAndroid Build Coastguard Worker explicit Impl(const InnerMatcher& matcher)
1969*481dde66SAndroid Build Coastguard Worker : matcher_(MatcherCast<Pointer>(matcher)) {}
1970*481dde66SAndroid Build Coastguard Worker
1971*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
1972*481dde66SAndroid Build Coastguard Worker *os << "is a pointer that ";
1973*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
1974*481dde66SAndroid Build Coastguard Worker }
1975*481dde66SAndroid Build Coastguard Worker
1976*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
1977*481dde66SAndroid Build Coastguard Worker *os << "is not a pointer that ";
1978*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
1979*481dde66SAndroid Build Coastguard Worker }
1980*481dde66SAndroid Build Coastguard Worker
1981*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(PointerType pointer,
1982*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
1983*481dde66SAndroid Build Coastguard Worker *listener << "which is a pointer that ";
1984*481dde66SAndroid Build Coastguard Worker Pointer p = GetRawPointer(pointer);
1985*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(p, matcher_, listener);
1986*481dde66SAndroid Build Coastguard Worker }
1987*481dde66SAndroid Build Coastguard Worker
1988*481dde66SAndroid Build Coastguard Worker private:
1989*481dde66SAndroid Build Coastguard Worker Matcher<Pointer> matcher_;
1990*481dde66SAndroid Build Coastguard Worker };
1991*481dde66SAndroid Build Coastguard Worker
1992*481dde66SAndroid Build Coastguard Worker const InnerMatcher matcher_;
1993*481dde66SAndroid Build Coastguard Worker };
1994*481dde66SAndroid Build Coastguard Worker
1995*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
1996*481dde66SAndroid Build Coastguard Worker // Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or
1997*481dde66SAndroid Build Coastguard Worker // reference that matches inner_matcher when dynamic_cast<T> is applied.
1998*481dde66SAndroid Build Coastguard Worker // The result of dynamic_cast<To> is forwarded to the inner matcher.
1999*481dde66SAndroid Build Coastguard Worker // If To is a pointer and the cast fails, the inner matcher will receive NULL.
2000*481dde66SAndroid Build Coastguard Worker // If To is a reference and the cast fails, this matcher returns false
2001*481dde66SAndroid Build Coastguard Worker // immediately.
2002*481dde66SAndroid Build Coastguard Worker template <typename To>
2003*481dde66SAndroid Build Coastguard Worker class WhenDynamicCastToMatcherBase {
2004*481dde66SAndroid Build Coastguard Worker public:
2005*481dde66SAndroid Build Coastguard Worker explicit WhenDynamicCastToMatcherBase(const Matcher<To>& matcher)
2006*481dde66SAndroid Build Coastguard Worker : matcher_(matcher) {}
2007*481dde66SAndroid Build Coastguard Worker
2008*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
2009*481dde66SAndroid Build Coastguard Worker GetCastTypeDescription(os);
2010*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
2011*481dde66SAndroid Build Coastguard Worker }
2012*481dde66SAndroid Build Coastguard Worker
2013*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
2014*481dde66SAndroid Build Coastguard Worker GetCastTypeDescription(os);
2015*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
2016*481dde66SAndroid Build Coastguard Worker }
2017*481dde66SAndroid Build Coastguard Worker
2018*481dde66SAndroid Build Coastguard Worker protected:
2019*481dde66SAndroid Build Coastguard Worker const Matcher<To> matcher_;
2020*481dde66SAndroid Build Coastguard Worker
2021*481dde66SAndroid Build Coastguard Worker static std::string GetToName() { return GetTypeName<To>(); }
2022*481dde66SAndroid Build Coastguard Worker
2023*481dde66SAndroid Build Coastguard Worker private:
2024*481dde66SAndroid Build Coastguard Worker static void GetCastTypeDescription(::std::ostream* os) {
2025*481dde66SAndroid Build Coastguard Worker *os << "when dynamic_cast to " << GetToName() << ", ";
2026*481dde66SAndroid Build Coastguard Worker }
2027*481dde66SAndroid Build Coastguard Worker };
2028*481dde66SAndroid Build Coastguard Worker
2029*481dde66SAndroid Build Coastguard Worker // Primary template.
2030*481dde66SAndroid Build Coastguard Worker // To is a pointer. Cast and forward the result.
2031*481dde66SAndroid Build Coastguard Worker template <typename To>
2032*481dde66SAndroid Build Coastguard Worker class WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {
2033*481dde66SAndroid Build Coastguard Worker public:
2034*481dde66SAndroid Build Coastguard Worker explicit WhenDynamicCastToMatcher(const Matcher<To>& matcher)
2035*481dde66SAndroid Build Coastguard Worker : WhenDynamicCastToMatcherBase<To>(matcher) {}
2036*481dde66SAndroid Build Coastguard Worker
2037*481dde66SAndroid Build Coastguard Worker template <typename From>
2038*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(From from, MatchResultListener* listener) const {
2039*481dde66SAndroid Build Coastguard Worker To to = dynamic_cast<To>(from);
2040*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(to, this->matcher_, listener);
2041*481dde66SAndroid Build Coastguard Worker }
2042*481dde66SAndroid Build Coastguard Worker };
2043*481dde66SAndroid Build Coastguard Worker
2044*481dde66SAndroid Build Coastguard Worker // Specialize for references.
2045*481dde66SAndroid Build Coastguard Worker // In this case we return false if the dynamic_cast fails.
2046*481dde66SAndroid Build Coastguard Worker template <typename To>
2047*481dde66SAndroid Build Coastguard Worker class WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {
2048*481dde66SAndroid Build Coastguard Worker public:
2049*481dde66SAndroid Build Coastguard Worker explicit WhenDynamicCastToMatcher(const Matcher<To&>& matcher)
2050*481dde66SAndroid Build Coastguard Worker : WhenDynamicCastToMatcherBase<To&>(matcher) {}
2051*481dde66SAndroid Build Coastguard Worker
2052*481dde66SAndroid Build Coastguard Worker template <typename From>
2053*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(From& from, MatchResultListener* listener) const {
2054*481dde66SAndroid Build Coastguard Worker // We don't want an std::bad_cast here, so do the cast with pointers.
2055*481dde66SAndroid Build Coastguard Worker To* to = dynamic_cast<To*>(&from);
2056*481dde66SAndroid Build Coastguard Worker if (to == nullptr) {
2057*481dde66SAndroid Build Coastguard Worker *listener << "which cannot be dynamic_cast to " << this->GetToName();
2058*481dde66SAndroid Build Coastguard Worker return false;
2059*481dde66SAndroid Build Coastguard Worker }
2060*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(*to, this->matcher_, listener);
2061*481dde66SAndroid Build Coastguard Worker }
2062*481dde66SAndroid Build Coastguard Worker };
2063*481dde66SAndroid Build Coastguard Worker #endif // GTEST_HAS_RTTI
2064*481dde66SAndroid Build Coastguard Worker
2065*481dde66SAndroid Build Coastguard Worker // Implements the Field() matcher for matching a field (i.e. member
2066*481dde66SAndroid Build Coastguard Worker // variable) of an object.
2067*481dde66SAndroid Build Coastguard Worker template <typename Class, typename FieldType>
2068*481dde66SAndroid Build Coastguard Worker class FieldMatcher {
2069*481dde66SAndroid Build Coastguard Worker public:
2070*481dde66SAndroid Build Coastguard Worker FieldMatcher(FieldType Class::*field,
2071*481dde66SAndroid Build Coastguard Worker const Matcher<const FieldType&>& matcher)
2072*481dde66SAndroid Build Coastguard Worker : field_(field), matcher_(matcher), whose_field_("whose given field ") {}
2073*481dde66SAndroid Build Coastguard Worker
2074*481dde66SAndroid Build Coastguard Worker FieldMatcher(const std::string& field_name, FieldType Class::*field,
2075*481dde66SAndroid Build Coastguard Worker const Matcher<const FieldType&>& matcher)
2076*481dde66SAndroid Build Coastguard Worker : field_(field),
2077*481dde66SAndroid Build Coastguard Worker matcher_(matcher),
2078*481dde66SAndroid Build Coastguard Worker whose_field_("whose field `" + field_name + "` ") {}
2079*481dde66SAndroid Build Coastguard Worker
2080*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
2081*481dde66SAndroid Build Coastguard Worker *os << "is an object " << whose_field_;
2082*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
2083*481dde66SAndroid Build Coastguard Worker }
2084*481dde66SAndroid Build Coastguard Worker
2085*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
2086*481dde66SAndroid Build Coastguard Worker *os << "is an object " << whose_field_;
2087*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
2088*481dde66SAndroid Build Coastguard Worker }
2089*481dde66SAndroid Build Coastguard Worker
2090*481dde66SAndroid Build Coastguard Worker template <typename T>
2091*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
2092*481dde66SAndroid Build Coastguard Worker // FIXME: The dispatch on std::is_pointer was introduced as a workaround for
2093*481dde66SAndroid Build Coastguard Worker // a compiler bug, and can now be removed.
2094*481dde66SAndroid Build Coastguard Worker return MatchAndExplainImpl(
2095*481dde66SAndroid Build Coastguard Worker typename std::is_pointer<typename std::remove_const<T>::type>::type(),
2096*481dde66SAndroid Build Coastguard Worker value, listener);
2097*481dde66SAndroid Build Coastguard Worker }
2098*481dde66SAndroid Build Coastguard Worker
2099*481dde66SAndroid Build Coastguard Worker private:
2100*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,
2101*481dde66SAndroid Build Coastguard Worker const Class& obj,
2102*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2103*481dde66SAndroid Build Coastguard Worker *listener << whose_field_ << "is ";
2104*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(obj.*field_, matcher_, listener);
2105*481dde66SAndroid Build Coastguard Worker }
2106*481dde66SAndroid Build Coastguard Worker
2107*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,
2108*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2109*481dde66SAndroid Build Coastguard Worker if (p == nullptr) return false;
2110*481dde66SAndroid Build Coastguard Worker
2111*481dde66SAndroid Build Coastguard Worker *listener << "which points to an object ";
2112*481dde66SAndroid Build Coastguard Worker // Since *p has a field, it must be a class/struct/union type and
2113*481dde66SAndroid Build Coastguard Worker // thus cannot be a pointer. Therefore we pass false_type() as
2114*481dde66SAndroid Build Coastguard Worker // the first argument.
2115*481dde66SAndroid Build Coastguard Worker return MatchAndExplainImpl(std::false_type(), *p, listener);
2116*481dde66SAndroid Build Coastguard Worker }
2117*481dde66SAndroid Build Coastguard Worker
2118*481dde66SAndroid Build Coastguard Worker const FieldType Class::*field_;
2119*481dde66SAndroid Build Coastguard Worker const Matcher<const FieldType&> matcher_;
2120*481dde66SAndroid Build Coastguard Worker
2121*481dde66SAndroid Build Coastguard Worker // Contains either "whose given field " if the name of the field is unknown
2122*481dde66SAndroid Build Coastguard Worker // or "whose field `name_of_field` " if the name is known.
2123*481dde66SAndroid Build Coastguard Worker const std::string whose_field_;
2124*481dde66SAndroid Build Coastguard Worker };
2125*481dde66SAndroid Build Coastguard Worker
2126*481dde66SAndroid Build Coastguard Worker // Implements the Property() matcher for matching a property
2127*481dde66SAndroid Build Coastguard Worker // (i.e. return value of a getter method) of an object.
2128*481dde66SAndroid Build Coastguard Worker //
2129*481dde66SAndroid Build Coastguard Worker // Property is a const-qualified member function of Class returning
2130*481dde66SAndroid Build Coastguard Worker // PropertyType.
2131*481dde66SAndroid Build Coastguard Worker template <typename Class, typename PropertyType, typename Property>
2132*481dde66SAndroid Build Coastguard Worker class PropertyMatcher {
2133*481dde66SAndroid Build Coastguard Worker public:
2134*481dde66SAndroid Build Coastguard Worker typedef const PropertyType& RefToConstProperty;
2135*481dde66SAndroid Build Coastguard Worker
2136*481dde66SAndroid Build Coastguard Worker PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)
2137*481dde66SAndroid Build Coastguard Worker : property_(property),
2138*481dde66SAndroid Build Coastguard Worker matcher_(matcher),
2139*481dde66SAndroid Build Coastguard Worker whose_property_("whose given property ") {}
2140*481dde66SAndroid Build Coastguard Worker
2141*481dde66SAndroid Build Coastguard Worker PropertyMatcher(const std::string& property_name, Property property,
2142*481dde66SAndroid Build Coastguard Worker const Matcher<RefToConstProperty>& matcher)
2143*481dde66SAndroid Build Coastguard Worker : property_(property),
2144*481dde66SAndroid Build Coastguard Worker matcher_(matcher),
2145*481dde66SAndroid Build Coastguard Worker whose_property_("whose property `" + property_name + "` ") {}
2146*481dde66SAndroid Build Coastguard Worker
2147*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
2148*481dde66SAndroid Build Coastguard Worker *os << "is an object " << whose_property_;
2149*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
2150*481dde66SAndroid Build Coastguard Worker }
2151*481dde66SAndroid Build Coastguard Worker
2152*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
2153*481dde66SAndroid Build Coastguard Worker *os << "is an object " << whose_property_;
2154*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
2155*481dde66SAndroid Build Coastguard Worker }
2156*481dde66SAndroid Build Coastguard Worker
2157*481dde66SAndroid Build Coastguard Worker template <typename T>
2158*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
2159*481dde66SAndroid Build Coastguard Worker return MatchAndExplainImpl(
2160*481dde66SAndroid Build Coastguard Worker typename std::is_pointer<typename std::remove_const<T>::type>::type(),
2161*481dde66SAndroid Build Coastguard Worker value, listener);
2162*481dde66SAndroid Build Coastguard Worker }
2163*481dde66SAndroid Build Coastguard Worker
2164*481dde66SAndroid Build Coastguard Worker private:
2165*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,
2166*481dde66SAndroid Build Coastguard Worker const Class& obj,
2167*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2168*481dde66SAndroid Build Coastguard Worker *listener << whose_property_ << "is ";
2169*481dde66SAndroid Build Coastguard Worker // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
2170*481dde66SAndroid Build Coastguard Worker // which takes a non-const reference as argument.
2171*481dde66SAndroid Build Coastguard Worker RefToConstProperty result = (obj.*property_)();
2172*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(result, matcher_, listener);
2173*481dde66SAndroid Build Coastguard Worker }
2174*481dde66SAndroid Build Coastguard Worker
2175*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,
2176*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2177*481dde66SAndroid Build Coastguard Worker if (p == nullptr) return false;
2178*481dde66SAndroid Build Coastguard Worker
2179*481dde66SAndroid Build Coastguard Worker *listener << "which points to an object ";
2180*481dde66SAndroid Build Coastguard Worker // Since *p has a property method, it must be a class/struct/union
2181*481dde66SAndroid Build Coastguard Worker // type and thus cannot be a pointer. Therefore we pass
2182*481dde66SAndroid Build Coastguard Worker // false_type() as the first argument.
2183*481dde66SAndroid Build Coastguard Worker return MatchAndExplainImpl(std::false_type(), *p, listener);
2184*481dde66SAndroid Build Coastguard Worker }
2185*481dde66SAndroid Build Coastguard Worker
2186*481dde66SAndroid Build Coastguard Worker Property property_;
2187*481dde66SAndroid Build Coastguard Worker const Matcher<RefToConstProperty> matcher_;
2188*481dde66SAndroid Build Coastguard Worker
2189*481dde66SAndroid Build Coastguard Worker // Contains either "whose given property " if the name of the property is
2190*481dde66SAndroid Build Coastguard Worker // unknown or "whose property `name_of_property` " if the name is known.
2191*481dde66SAndroid Build Coastguard Worker const std::string whose_property_;
2192*481dde66SAndroid Build Coastguard Worker };
2193*481dde66SAndroid Build Coastguard Worker
2194*481dde66SAndroid Build Coastguard Worker // Type traits specifying various features of different functors for ResultOf.
2195*481dde66SAndroid Build Coastguard Worker // The default template specifies features for functor objects.
2196*481dde66SAndroid Build Coastguard Worker template <typename Functor>
2197*481dde66SAndroid Build Coastguard Worker struct CallableTraits {
2198*481dde66SAndroid Build Coastguard Worker typedef Functor StorageType;
2199*481dde66SAndroid Build Coastguard Worker
2200*481dde66SAndroid Build Coastguard Worker static void CheckIsValid(Functor /* functor */) {}
2201*481dde66SAndroid Build Coastguard Worker
2202*481dde66SAndroid Build Coastguard Worker template <typename T>
2203*481dde66SAndroid Build Coastguard Worker static auto Invoke(Functor f, const T& arg) -> decltype(f(arg)) {
2204*481dde66SAndroid Build Coastguard Worker return f(arg);
2205*481dde66SAndroid Build Coastguard Worker }
2206*481dde66SAndroid Build Coastguard Worker };
2207*481dde66SAndroid Build Coastguard Worker
2208*481dde66SAndroid Build Coastguard Worker // Specialization for function pointers.
2209*481dde66SAndroid Build Coastguard Worker template <typename ArgType, typename ResType>
2210*481dde66SAndroid Build Coastguard Worker struct CallableTraits<ResType (*)(ArgType)> {
2211*481dde66SAndroid Build Coastguard Worker typedef ResType ResultType;
2212*481dde66SAndroid Build Coastguard Worker typedef ResType (*StorageType)(ArgType);
2213*481dde66SAndroid Build Coastguard Worker
2214*481dde66SAndroid Build Coastguard Worker static void CheckIsValid(ResType (*f)(ArgType)) {
2215*481dde66SAndroid Build Coastguard Worker GTEST_CHECK_(f != nullptr)
2216*481dde66SAndroid Build Coastguard Worker << "NULL function pointer is passed into ResultOf().";
2217*481dde66SAndroid Build Coastguard Worker }
2218*481dde66SAndroid Build Coastguard Worker template <typename T>
2219*481dde66SAndroid Build Coastguard Worker static ResType Invoke(ResType (*f)(ArgType), T arg) {
2220*481dde66SAndroid Build Coastguard Worker return (*f)(arg);
2221*481dde66SAndroid Build Coastguard Worker }
2222*481dde66SAndroid Build Coastguard Worker };
2223*481dde66SAndroid Build Coastguard Worker
2224*481dde66SAndroid Build Coastguard Worker // Implements the ResultOf() matcher for matching a return value of a
2225*481dde66SAndroid Build Coastguard Worker // unary function of an object.
2226*481dde66SAndroid Build Coastguard Worker template <typename Callable, typename InnerMatcher>
2227*481dde66SAndroid Build Coastguard Worker class ResultOfMatcher {
2228*481dde66SAndroid Build Coastguard Worker public:
2229*481dde66SAndroid Build Coastguard Worker ResultOfMatcher(Callable callable, InnerMatcher matcher)
2230*481dde66SAndroid Build Coastguard Worker : ResultOfMatcher(/*result_description=*/"", std::move(callable),
2231*481dde66SAndroid Build Coastguard Worker std::move(matcher)) {}
2232*481dde66SAndroid Build Coastguard Worker
2233*481dde66SAndroid Build Coastguard Worker ResultOfMatcher(const std::string& result_description, Callable callable,
2234*481dde66SAndroid Build Coastguard Worker InnerMatcher matcher)
2235*481dde66SAndroid Build Coastguard Worker : result_description_(result_description),
2236*481dde66SAndroid Build Coastguard Worker callable_(std::move(callable)),
2237*481dde66SAndroid Build Coastguard Worker matcher_(std::move(matcher)) {
2238*481dde66SAndroid Build Coastguard Worker CallableTraits<Callable>::CheckIsValid(callable_);
2239*481dde66SAndroid Build Coastguard Worker }
2240*481dde66SAndroid Build Coastguard Worker
2241*481dde66SAndroid Build Coastguard Worker template <typename T>
2242*481dde66SAndroid Build Coastguard Worker operator Matcher<T>() const {
2243*481dde66SAndroid Build Coastguard Worker return Matcher<T>(
2244*481dde66SAndroid Build Coastguard Worker new Impl<const T&>(result_description_, callable_, matcher_));
2245*481dde66SAndroid Build Coastguard Worker }
2246*481dde66SAndroid Build Coastguard Worker
2247*481dde66SAndroid Build Coastguard Worker private:
2248*481dde66SAndroid Build Coastguard Worker typedef typename CallableTraits<Callable>::StorageType CallableStorageType;
2249*481dde66SAndroid Build Coastguard Worker
2250*481dde66SAndroid Build Coastguard Worker template <typename T>
2251*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<T> {
2252*481dde66SAndroid Build Coastguard Worker using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(
2253*481dde66SAndroid Build Coastguard Worker std::declval<CallableStorageType>(), std::declval<T>()));
2254*481dde66SAndroid Build Coastguard Worker
2255*481dde66SAndroid Build Coastguard Worker public:
2256*481dde66SAndroid Build Coastguard Worker template <typename M>
2257*481dde66SAndroid Build Coastguard Worker Impl(const std::string& result_description,
2258*481dde66SAndroid Build Coastguard Worker const CallableStorageType& callable, const M& matcher)
2259*481dde66SAndroid Build Coastguard Worker : result_description_(result_description),
2260*481dde66SAndroid Build Coastguard Worker callable_(callable),
2261*481dde66SAndroid Build Coastguard Worker matcher_(MatcherCast<ResultType>(matcher)) {}
2262*481dde66SAndroid Build Coastguard Worker
2263*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2264*481dde66SAndroid Build Coastguard Worker if (result_description_.empty()) {
2265*481dde66SAndroid Build Coastguard Worker *os << "is mapped by the given callable to a value that ";
2266*481dde66SAndroid Build Coastguard Worker } else {
2267*481dde66SAndroid Build Coastguard Worker *os << "whose " << result_description_ << " ";
2268*481dde66SAndroid Build Coastguard Worker }
2269*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
2270*481dde66SAndroid Build Coastguard Worker }
2271*481dde66SAndroid Build Coastguard Worker
2272*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2273*481dde66SAndroid Build Coastguard Worker if (result_description_.empty()) {
2274*481dde66SAndroid Build Coastguard Worker *os << "is mapped by the given callable to a value that ";
2275*481dde66SAndroid Build Coastguard Worker } else {
2276*481dde66SAndroid Build Coastguard Worker *os << "whose " << result_description_ << " ";
2277*481dde66SAndroid Build Coastguard Worker }
2278*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
2279*481dde66SAndroid Build Coastguard Worker }
2280*481dde66SAndroid Build Coastguard Worker
2281*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T obj, MatchResultListener* listener) const override {
2282*481dde66SAndroid Build Coastguard Worker if (result_description_.empty()) {
2283*481dde66SAndroid Build Coastguard Worker *listener << "which is mapped by the given callable to ";
2284*481dde66SAndroid Build Coastguard Worker } else {
2285*481dde66SAndroid Build Coastguard Worker *listener << "whose " << result_description_ << " is ";
2286*481dde66SAndroid Build Coastguard Worker }
2287*481dde66SAndroid Build Coastguard Worker // Cannot pass the return value directly to MatchPrintAndExplain, which
2288*481dde66SAndroid Build Coastguard Worker // takes a non-const reference as argument.
2289*481dde66SAndroid Build Coastguard Worker // Also, specifying template argument explicitly is needed because T could
2290*481dde66SAndroid Build Coastguard Worker // be a non-const reference (e.g. Matcher<Uncopyable&>).
2291*481dde66SAndroid Build Coastguard Worker ResultType result =
2292*481dde66SAndroid Build Coastguard Worker CallableTraits<Callable>::template Invoke<T>(callable_, obj);
2293*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(result, matcher_, listener);
2294*481dde66SAndroid Build Coastguard Worker }
2295*481dde66SAndroid Build Coastguard Worker
2296*481dde66SAndroid Build Coastguard Worker private:
2297*481dde66SAndroid Build Coastguard Worker const std::string result_description_;
2298*481dde66SAndroid Build Coastguard Worker // Functors often define operator() as non-const method even though
2299*481dde66SAndroid Build Coastguard Worker // they are actually stateless. But we need to use them even when
2300*481dde66SAndroid Build Coastguard Worker // 'this' is a const pointer. It's the user's responsibility not to
2301*481dde66SAndroid Build Coastguard Worker // use stateful callables with ResultOf(), which doesn't guarantee
2302*481dde66SAndroid Build Coastguard Worker // how many times the callable will be invoked.
2303*481dde66SAndroid Build Coastguard Worker mutable CallableStorageType callable_;
2304*481dde66SAndroid Build Coastguard Worker const Matcher<ResultType> matcher_;
2305*481dde66SAndroid Build Coastguard Worker }; // class Impl
2306*481dde66SAndroid Build Coastguard Worker
2307*481dde66SAndroid Build Coastguard Worker const std::string result_description_;
2308*481dde66SAndroid Build Coastguard Worker const CallableStorageType callable_;
2309*481dde66SAndroid Build Coastguard Worker const InnerMatcher matcher_;
2310*481dde66SAndroid Build Coastguard Worker };
2311*481dde66SAndroid Build Coastguard Worker
2312*481dde66SAndroid Build Coastguard Worker // Implements a matcher that checks the size of an STL-style container.
2313*481dde66SAndroid Build Coastguard Worker template <typename SizeMatcher>
2314*481dde66SAndroid Build Coastguard Worker class SizeIsMatcher {
2315*481dde66SAndroid Build Coastguard Worker public:
2316*481dde66SAndroid Build Coastguard Worker explicit SizeIsMatcher(const SizeMatcher& size_matcher)
2317*481dde66SAndroid Build Coastguard Worker : size_matcher_(size_matcher) {}
2318*481dde66SAndroid Build Coastguard Worker
2319*481dde66SAndroid Build Coastguard Worker template <typename Container>
2320*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
2321*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(new Impl<const Container&>(size_matcher_));
2322*481dde66SAndroid Build Coastguard Worker }
2323*481dde66SAndroid Build Coastguard Worker
2324*481dde66SAndroid Build Coastguard Worker template <typename Container>
2325*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Container> {
2326*481dde66SAndroid Build Coastguard Worker public:
2327*481dde66SAndroid Build Coastguard Worker using SizeType = decltype(std::declval<Container>().size());
2328*481dde66SAndroid Build Coastguard Worker explicit Impl(const SizeMatcher& size_matcher)
2329*481dde66SAndroid Build Coastguard Worker : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}
2330*481dde66SAndroid Build Coastguard Worker
2331*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2332*481dde66SAndroid Build Coastguard Worker *os << "has a size that ";
2333*481dde66SAndroid Build Coastguard Worker size_matcher_.DescribeTo(os);
2334*481dde66SAndroid Build Coastguard Worker }
2335*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2336*481dde66SAndroid Build Coastguard Worker *os << "has a size that ";
2337*481dde66SAndroid Build Coastguard Worker size_matcher_.DescribeNegationTo(os);
2338*481dde66SAndroid Build Coastguard Worker }
2339*481dde66SAndroid Build Coastguard Worker
2340*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
2341*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2342*481dde66SAndroid Build Coastguard Worker SizeType size = container.size();
2343*481dde66SAndroid Build Coastguard Worker StringMatchResultListener size_listener;
2344*481dde66SAndroid Build Coastguard Worker const bool result = size_matcher_.MatchAndExplain(size, &size_listener);
2345*481dde66SAndroid Build Coastguard Worker *listener << "whose size " << size
2346*481dde66SAndroid Build Coastguard Worker << (result ? " matches" : " doesn't match");
2347*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(size_listener.str(), listener->stream());
2348*481dde66SAndroid Build Coastguard Worker return result;
2349*481dde66SAndroid Build Coastguard Worker }
2350*481dde66SAndroid Build Coastguard Worker
2351*481dde66SAndroid Build Coastguard Worker private:
2352*481dde66SAndroid Build Coastguard Worker const Matcher<SizeType> size_matcher_;
2353*481dde66SAndroid Build Coastguard Worker };
2354*481dde66SAndroid Build Coastguard Worker
2355*481dde66SAndroid Build Coastguard Worker private:
2356*481dde66SAndroid Build Coastguard Worker const SizeMatcher size_matcher_;
2357*481dde66SAndroid Build Coastguard Worker };
2358*481dde66SAndroid Build Coastguard Worker
2359*481dde66SAndroid Build Coastguard Worker // Implements a matcher that checks the begin()..end() distance of an STL-style
2360*481dde66SAndroid Build Coastguard Worker // container.
2361*481dde66SAndroid Build Coastguard Worker template <typename DistanceMatcher>
2362*481dde66SAndroid Build Coastguard Worker class BeginEndDistanceIsMatcher {
2363*481dde66SAndroid Build Coastguard Worker public:
2364*481dde66SAndroid Build Coastguard Worker explicit BeginEndDistanceIsMatcher(const DistanceMatcher& distance_matcher)
2365*481dde66SAndroid Build Coastguard Worker : distance_matcher_(distance_matcher) {}
2366*481dde66SAndroid Build Coastguard Worker
2367*481dde66SAndroid Build Coastguard Worker template <typename Container>
2368*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
2369*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(new Impl<const Container&>(distance_matcher_));
2370*481dde66SAndroid Build Coastguard Worker }
2371*481dde66SAndroid Build Coastguard Worker
2372*481dde66SAndroid Build Coastguard Worker template <typename Container>
2373*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Container> {
2374*481dde66SAndroid Build Coastguard Worker public:
2375*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<GTEST_REMOVE_REFERENCE_AND_CONST_(
2376*481dde66SAndroid Build Coastguard Worker Container)>
2377*481dde66SAndroid Build Coastguard Worker ContainerView;
2378*481dde66SAndroid Build Coastguard Worker typedef typename std::iterator_traits<
2379*481dde66SAndroid Build Coastguard Worker typename ContainerView::type::const_iterator>::difference_type
2380*481dde66SAndroid Build Coastguard Worker DistanceType;
2381*481dde66SAndroid Build Coastguard Worker explicit Impl(const DistanceMatcher& distance_matcher)
2382*481dde66SAndroid Build Coastguard Worker : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}
2383*481dde66SAndroid Build Coastguard Worker
2384*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2385*481dde66SAndroid Build Coastguard Worker *os << "distance between begin() and end() ";
2386*481dde66SAndroid Build Coastguard Worker distance_matcher_.DescribeTo(os);
2387*481dde66SAndroid Build Coastguard Worker }
2388*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2389*481dde66SAndroid Build Coastguard Worker *os << "distance between begin() and end() ";
2390*481dde66SAndroid Build Coastguard Worker distance_matcher_.DescribeNegationTo(os);
2391*481dde66SAndroid Build Coastguard Worker }
2392*481dde66SAndroid Build Coastguard Worker
2393*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
2394*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2395*481dde66SAndroid Build Coastguard Worker using std::begin;
2396*481dde66SAndroid Build Coastguard Worker using std::end;
2397*481dde66SAndroid Build Coastguard Worker DistanceType distance = std::distance(begin(container), end(container));
2398*481dde66SAndroid Build Coastguard Worker StringMatchResultListener distance_listener;
2399*481dde66SAndroid Build Coastguard Worker const bool result =
2400*481dde66SAndroid Build Coastguard Worker distance_matcher_.MatchAndExplain(distance, &distance_listener);
2401*481dde66SAndroid Build Coastguard Worker *listener << "whose distance between begin() and end() " << distance
2402*481dde66SAndroid Build Coastguard Worker << (result ? " matches" : " doesn't match");
2403*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(distance_listener.str(), listener->stream());
2404*481dde66SAndroid Build Coastguard Worker return result;
2405*481dde66SAndroid Build Coastguard Worker }
2406*481dde66SAndroid Build Coastguard Worker
2407*481dde66SAndroid Build Coastguard Worker private:
2408*481dde66SAndroid Build Coastguard Worker const Matcher<DistanceType> distance_matcher_;
2409*481dde66SAndroid Build Coastguard Worker };
2410*481dde66SAndroid Build Coastguard Worker
2411*481dde66SAndroid Build Coastguard Worker private:
2412*481dde66SAndroid Build Coastguard Worker const DistanceMatcher distance_matcher_;
2413*481dde66SAndroid Build Coastguard Worker };
2414*481dde66SAndroid Build Coastguard Worker
2415*481dde66SAndroid Build Coastguard Worker // Implements an equality matcher for any STL-style container whose elements
2416*481dde66SAndroid Build Coastguard Worker // support ==. This matcher is like Eq(), but its failure explanations provide
2417*481dde66SAndroid Build Coastguard Worker // more detailed information that is useful when the container is used as a set.
2418*481dde66SAndroid Build Coastguard Worker // The failure message reports elements that are in one of the operands but not
2419*481dde66SAndroid Build Coastguard Worker // the other. The failure messages do not report duplicate or out-of-order
2420*481dde66SAndroid Build Coastguard Worker // elements in the containers (which don't properly matter to sets, but can
2421*481dde66SAndroid Build Coastguard Worker // occur if the containers are vectors or lists, for example).
2422*481dde66SAndroid Build Coastguard Worker //
2423*481dde66SAndroid Build Coastguard Worker // Uses the container's const_iterator, value_type, operator ==,
2424*481dde66SAndroid Build Coastguard Worker // begin(), and end().
2425*481dde66SAndroid Build Coastguard Worker template <typename Container>
2426*481dde66SAndroid Build Coastguard Worker class ContainerEqMatcher {
2427*481dde66SAndroid Build Coastguard Worker public:
2428*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<Container> View;
2429*481dde66SAndroid Build Coastguard Worker typedef typename View::type StlContainer;
2430*481dde66SAndroid Build Coastguard Worker typedef typename View::const_reference StlContainerReference;
2431*481dde66SAndroid Build Coastguard Worker
2432*481dde66SAndroid Build Coastguard Worker static_assert(!std::is_const<Container>::value,
2433*481dde66SAndroid Build Coastguard Worker "Container type must not be const");
2434*481dde66SAndroid Build Coastguard Worker static_assert(!std::is_reference<Container>::value,
2435*481dde66SAndroid Build Coastguard Worker "Container type must not be a reference");
2436*481dde66SAndroid Build Coastguard Worker
2437*481dde66SAndroid Build Coastguard Worker // We make a copy of expected in case the elements in it are modified
2438*481dde66SAndroid Build Coastguard Worker // after this matcher is created.
2439*481dde66SAndroid Build Coastguard Worker explicit ContainerEqMatcher(const Container& expected)
2440*481dde66SAndroid Build Coastguard Worker : expected_(View::Copy(expected)) {}
2441*481dde66SAndroid Build Coastguard Worker
2442*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const {
2443*481dde66SAndroid Build Coastguard Worker *os << "equals ";
2444*481dde66SAndroid Build Coastguard Worker UniversalPrint(expected_, os);
2445*481dde66SAndroid Build Coastguard Worker }
2446*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const {
2447*481dde66SAndroid Build Coastguard Worker *os << "does not equal ";
2448*481dde66SAndroid Build Coastguard Worker UniversalPrint(expected_, os);
2449*481dde66SAndroid Build Coastguard Worker }
2450*481dde66SAndroid Build Coastguard Worker
2451*481dde66SAndroid Build Coastguard Worker template <typename LhsContainer>
2452*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const LhsContainer& lhs,
2453*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2454*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<
2455*481dde66SAndroid Build Coastguard Worker typename std::remove_const<LhsContainer>::type>
2456*481dde66SAndroid Build Coastguard Worker LhsView;
2457*481dde66SAndroid Build Coastguard Worker StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2458*481dde66SAndroid Build Coastguard Worker if (lhs_stl_container == expected_) return true;
2459*481dde66SAndroid Build Coastguard Worker
2460*481dde66SAndroid Build Coastguard Worker ::std::ostream* const os = listener->stream();
2461*481dde66SAndroid Build Coastguard Worker if (os != nullptr) {
2462*481dde66SAndroid Build Coastguard Worker // Something is different. Check for extra values first.
2463*481dde66SAndroid Build Coastguard Worker bool printed_header = false;
2464*481dde66SAndroid Build Coastguard Worker for (auto it = lhs_stl_container.begin(); it != lhs_stl_container.end();
2465*481dde66SAndroid Build Coastguard Worker ++it) {
2466*481dde66SAndroid Build Coastguard Worker if (internal::ArrayAwareFind(expected_.begin(), expected_.end(), *it) ==
2467*481dde66SAndroid Build Coastguard Worker expected_.end()) {
2468*481dde66SAndroid Build Coastguard Worker if (printed_header) {
2469*481dde66SAndroid Build Coastguard Worker *os << ", ";
2470*481dde66SAndroid Build Coastguard Worker } else {
2471*481dde66SAndroid Build Coastguard Worker *os << "which has these unexpected elements: ";
2472*481dde66SAndroid Build Coastguard Worker printed_header = true;
2473*481dde66SAndroid Build Coastguard Worker }
2474*481dde66SAndroid Build Coastguard Worker UniversalPrint(*it, os);
2475*481dde66SAndroid Build Coastguard Worker }
2476*481dde66SAndroid Build Coastguard Worker }
2477*481dde66SAndroid Build Coastguard Worker
2478*481dde66SAndroid Build Coastguard Worker // Now check for missing values.
2479*481dde66SAndroid Build Coastguard Worker bool printed_header2 = false;
2480*481dde66SAndroid Build Coastguard Worker for (auto it = expected_.begin(); it != expected_.end(); ++it) {
2481*481dde66SAndroid Build Coastguard Worker if (internal::ArrayAwareFind(lhs_stl_container.begin(),
2482*481dde66SAndroid Build Coastguard Worker lhs_stl_container.end(),
2483*481dde66SAndroid Build Coastguard Worker *it) == lhs_stl_container.end()) {
2484*481dde66SAndroid Build Coastguard Worker if (printed_header2) {
2485*481dde66SAndroid Build Coastguard Worker *os << ", ";
2486*481dde66SAndroid Build Coastguard Worker } else {
2487*481dde66SAndroid Build Coastguard Worker *os << (printed_header ? ",\nand" : "which")
2488*481dde66SAndroid Build Coastguard Worker << " doesn't have these expected elements: ";
2489*481dde66SAndroid Build Coastguard Worker printed_header2 = true;
2490*481dde66SAndroid Build Coastguard Worker }
2491*481dde66SAndroid Build Coastguard Worker UniversalPrint(*it, os);
2492*481dde66SAndroid Build Coastguard Worker }
2493*481dde66SAndroid Build Coastguard Worker }
2494*481dde66SAndroid Build Coastguard Worker }
2495*481dde66SAndroid Build Coastguard Worker
2496*481dde66SAndroid Build Coastguard Worker return false;
2497*481dde66SAndroid Build Coastguard Worker }
2498*481dde66SAndroid Build Coastguard Worker
2499*481dde66SAndroid Build Coastguard Worker private:
2500*481dde66SAndroid Build Coastguard Worker const StlContainer expected_;
2501*481dde66SAndroid Build Coastguard Worker };
2502*481dde66SAndroid Build Coastguard Worker
2503*481dde66SAndroid Build Coastguard Worker // A comparator functor that uses the < operator to compare two values.
2504*481dde66SAndroid Build Coastguard Worker struct LessComparator {
2505*481dde66SAndroid Build Coastguard Worker template <typename T, typename U>
2506*481dde66SAndroid Build Coastguard Worker bool operator()(const T& lhs, const U& rhs) const {
2507*481dde66SAndroid Build Coastguard Worker return lhs < rhs;
2508*481dde66SAndroid Build Coastguard Worker }
2509*481dde66SAndroid Build Coastguard Worker };
2510*481dde66SAndroid Build Coastguard Worker
2511*481dde66SAndroid Build Coastguard Worker // Implements WhenSortedBy(comparator, container_matcher).
2512*481dde66SAndroid Build Coastguard Worker template <typename Comparator, typename ContainerMatcher>
2513*481dde66SAndroid Build Coastguard Worker class WhenSortedByMatcher {
2514*481dde66SAndroid Build Coastguard Worker public:
2515*481dde66SAndroid Build Coastguard Worker WhenSortedByMatcher(const Comparator& comparator,
2516*481dde66SAndroid Build Coastguard Worker const ContainerMatcher& matcher)
2517*481dde66SAndroid Build Coastguard Worker : comparator_(comparator), matcher_(matcher) {}
2518*481dde66SAndroid Build Coastguard Worker
2519*481dde66SAndroid Build Coastguard Worker template <typename LhsContainer>
2520*481dde66SAndroid Build Coastguard Worker operator Matcher<LhsContainer>() const {
2521*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));
2522*481dde66SAndroid Build Coastguard Worker }
2523*481dde66SAndroid Build Coastguard Worker
2524*481dde66SAndroid Build Coastguard Worker template <typename LhsContainer>
2525*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<LhsContainer> {
2526*481dde66SAndroid Build Coastguard Worker public:
2527*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<GTEST_REMOVE_REFERENCE_AND_CONST_(
2528*481dde66SAndroid Build Coastguard Worker LhsContainer)>
2529*481dde66SAndroid Build Coastguard Worker LhsView;
2530*481dde66SAndroid Build Coastguard Worker typedef typename LhsView::type LhsStlContainer;
2531*481dde66SAndroid Build Coastguard Worker typedef typename LhsView::const_reference LhsStlContainerReference;
2532*481dde66SAndroid Build Coastguard Worker // Transforms std::pair<const Key, Value> into std::pair<Key, Value>
2533*481dde66SAndroid Build Coastguard Worker // so that we can match associative containers.
2534*481dde66SAndroid Build Coastguard Worker typedef
2535*481dde66SAndroid Build Coastguard Worker typename RemoveConstFromKey<typename LhsStlContainer::value_type>::type
2536*481dde66SAndroid Build Coastguard Worker LhsValue;
2537*481dde66SAndroid Build Coastguard Worker
2538*481dde66SAndroid Build Coastguard Worker Impl(const Comparator& comparator, const ContainerMatcher& matcher)
2539*481dde66SAndroid Build Coastguard Worker : comparator_(comparator), matcher_(matcher) {}
2540*481dde66SAndroid Build Coastguard Worker
2541*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2542*481dde66SAndroid Build Coastguard Worker *os << "(when sorted) ";
2543*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
2544*481dde66SAndroid Build Coastguard Worker }
2545*481dde66SAndroid Build Coastguard Worker
2546*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2547*481dde66SAndroid Build Coastguard Worker *os << "(when sorted) ";
2548*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
2549*481dde66SAndroid Build Coastguard Worker }
2550*481dde66SAndroid Build Coastguard Worker
2551*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(LhsContainer lhs,
2552*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2553*481dde66SAndroid Build Coastguard Worker LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2554*481dde66SAndroid Build Coastguard Worker ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),
2555*481dde66SAndroid Build Coastguard Worker lhs_stl_container.end());
2556*481dde66SAndroid Build Coastguard Worker ::std::sort(sorted_container.begin(), sorted_container.end(),
2557*481dde66SAndroid Build Coastguard Worker comparator_);
2558*481dde66SAndroid Build Coastguard Worker
2559*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
2560*481dde66SAndroid Build Coastguard Worker // If the listener is not interested, we do not need to
2561*481dde66SAndroid Build Coastguard Worker // construct the inner explanation.
2562*481dde66SAndroid Build Coastguard Worker return matcher_.Matches(sorted_container);
2563*481dde66SAndroid Build Coastguard Worker }
2564*481dde66SAndroid Build Coastguard Worker
2565*481dde66SAndroid Build Coastguard Worker *listener << "which is ";
2566*481dde66SAndroid Build Coastguard Worker UniversalPrint(sorted_container, listener->stream());
2567*481dde66SAndroid Build Coastguard Worker *listener << " when sorted";
2568*481dde66SAndroid Build Coastguard Worker
2569*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
2570*481dde66SAndroid Build Coastguard Worker const bool match =
2571*481dde66SAndroid Build Coastguard Worker matcher_.MatchAndExplain(sorted_container, &inner_listener);
2572*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener.str(), listener->stream());
2573*481dde66SAndroid Build Coastguard Worker return match;
2574*481dde66SAndroid Build Coastguard Worker }
2575*481dde66SAndroid Build Coastguard Worker
2576*481dde66SAndroid Build Coastguard Worker private:
2577*481dde66SAndroid Build Coastguard Worker const Comparator comparator_;
2578*481dde66SAndroid Build Coastguard Worker const Matcher<const ::std::vector<LhsValue>&> matcher_;
2579*481dde66SAndroid Build Coastguard Worker
2580*481dde66SAndroid Build Coastguard Worker Impl(const Impl&) = delete;
2581*481dde66SAndroid Build Coastguard Worker Impl& operator=(const Impl&) = delete;
2582*481dde66SAndroid Build Coastguard Worker };
2583*481dde66SAndroid Build Coastguard Worker
2584*481dde66SAndroid Build Coastguard Worker private:
2585*481dde66SAndroid Build Coastguard Worker const Comparator comparator_;
2586*481dde66SAndroid Build Coastguard Worker const ContainerMatcher matcher_;
2587*481dde66SAndroid Build Coastguard Worker };
2588*481dde66SAndroid Build Coastguard Worker
2589*481dde66SAndroid Build Coastguard Worker // Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
2590*481dde66SAndroid Build Coastguard Worker // must be able to be safely cast to Matcher<std::tuple<const T1&, const
2591*481dde66SAndroid Build Coastguard Worker // T2&> >, where T1 and T2 are the types of elements in the LHS
2592*481dde66SAndroid Build Coastguard Worker // container and the RHS container respectively.
2593*481dde66SAndroid Build Coastguard Worker template <typename TupleMatcher, typename RhsContainer>
2594*481dde66SAndroid Build Coastguard Worker class PointwiseMatcher {
2595*481dde66SAndroid Build Coastguard Worker static_assert(
2596*481dde66SAndroid Build Coastguard Worker !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>::value,
2597*481dde66SAndroid Build Coastguard Worker "use UnorderedPointwise with hash tables");
2598*481dde66SAndroid Build Coastguard Worker
2599*481dde66SAndroid Build Coastguard Worker public:
2600*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<RhsContainer> RhsView;
2601*481dde66SAndroid Build Coastguard Worker typedef typename RhsView::type RhsStlContainer;
2602*481dde66SAndroid Build Coastguard Worker typedef typename RhsStlContainer::value_type RhsValue;
2603*481dde66SAndroid Build Coastguard Worker
2604*481dde66SAndroid Build Coastguard Worker static_assert(!std::is_const<RhsContainer>::value,
2605*481dde66SAndroid Build Coastguard Worker "RhsContainer type must not be const");
2606*481dde66SAndroid Build Coastguard Worker static_assert(!std::is_reference<RhsContainer>::value,
2607*481dde66SAndroid Build Coastguard Worker "RhsContainer type must not be a reference");
2608*481dde66SAndroid Build Coastguard Worker
2609*481dde66SAndroid Build Coastguard Worker // Like ContainerEq, we make a copy of rhs in case the elements in
2610*481dde66SAndroid Build Coastguard Worker // it are modified after this matcher is created.
2611*481dde66SAndroid Build Coastguard Worker PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)
2612*481dde66SAndroid Build Coastguard Worker : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {}
2613*481dde66SAndroid Build Coastguard Worker
2614*481dde66SAndroid Build Coastguard Worker template <typename LhsContainer>
2615*481dde66SAndroid Build Coastguard Worker operator Matcher<LhsContainer>() const {
2616*481dde66SAndroid Build Coastguard Worker static_assert(
2617*481dde66SAndroid Build Coastguard Worker !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,
2618*481dde66SAndroid Build Coastguard Worker "use UnorderedPointwise with hash tables");
2619*481dde66SAndroid Build Coastguard Worker
2620*481dde66SAndroid Build Coastguard Worker return Matcher<LhsContainer>(
2621*481dde66SAndroid Build Coastguard Worker new Impl<const LhsContainer&>(tuple_matcher_, rhs_));
2622*481dde66SAndroid Build Coastguard Worker }
2623*481dde66SAndroid Build Coastguard Worker
2624*481dde66SAndroid Build Coastguard Worker template <typename LhsContainer>
2625*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<LhsContainer> {
2626*481dde66SAndroid Build Coastguard Worker public:
2627*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<GTEST_REMOVE_REFERENCE_AND_CONST_(
2628*481dde66SAndroid Build Coastguard Worker LhsContainer)>
2629*481dde66SAndroid Build Coastguard Worker LhsView;
2630*481dde66SAndroid Build Coastguard Worker typedef typename LhsView::type LhsStlContainer;
2631*481dde66SAndroid Build Coastguard Worker typedef typename LhsView::const_reference LhsStlContainerReference;
2632*481dde66SAndroid Build Coastguard Worker typedef typename LhsStlContainer::value_type LhsValue;
2633*481dde66SAndroid Build Coastguard Worker // We pass the LHS value and the RHS value to the inner matcher by
2634*481dde66SAndroid Build Coastguard Worker // reference, as they may be expensive to copy. We must use tuple
2635*481dde66SAndroid Build Coastguard Worker // instead of pair here, as a pair cannot hold references (C++ 98,
2636*481dde66SAndroid Build Coastguard Worker // 20.2.2 [lib.pairs]).
2637*481dde66SAndroid Build Coastguard Worker typedef ::std::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;
2638*481dde66SAndroid Build Coastguard Worker
2639*481dde66SAndroid Build Coastguard Worker Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)
2640*481dde66SAndroid Build Coastguard Worker // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
2641*481dde66SAndroid Build Coastguard Worker : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),
2642*481dde66SAndroid Build Coastguard Worker rhs_(rhs) {}
2643*481dde66SAndroid Build Coastguard Worker
2644*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2645*481dde66SAndroid Build Coastguard Worker *os << "contains " << rhs_.size()
2646*481dde66SAndroid Build Coastguard Worker << " values, where each value and its corresponding value in ";
2647*481dde66SAndroid Build Coastguard Worker UniversalPrinter<RhsStlContainer>::Print(rhs_, os);
2648*481dde66SAndroid Build Coastguard Worker *os << " ";
2649*481dde66SAndroid Build Coastguard Worker mono_tuple_matcher_.DescribeTo(os);
2650*481dde66SAndroid Build Coastguard Worker }
2651*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2652*481dde66SAndroid Build Coastguard Worker *os << "doesn't contain exactly " << rhs_.size()
2653*481dde66SAndroid Build Coastguard Worker << " values, or contains a value x at some index i"
2654*481dde66SAndroid Build Coastguard Worker << " where x and the i-th value of ";
2655*481dde66SAndroid Build Coastguard Worker UniversalPrint(rhs_, os);
2656*481dde66SAndroid Build Coastguard Worker *os << " ";
2657*481dde66SAndroid Build Coastguard Worker mono_tuple_matcher_.DescribeNegationTo(os);
2658*481dde66SAndroid Build Coastguard Worker }
2659*481dde66SAndroid Build Coastguard Worker
2660*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(LhsContainer lhs,
2661*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2662*481dde66SAndroid Build Coastguard Worker LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2663*481dde66SAndroid Build Coastguard Worker const size_t actual_size = lhs_stl_container.size();
2664*481dde66SAndroid Build Coastguard Worker if (actual_size != rhs_.size()) {
2665*481dde66SAndroid Build Coastguard Worker *listener << "which contains " << actual_size << " values";
2666*481dde66SAndroid Build Coastguard Worker return false;
2667*481dde66SAndroid Build Coastguard Worker }
2668*481dde66SAndroid Build Coastguard Worker
2669*481dde66SAndroid Build Coastguard Worker auto left = lhs_stl_container.begin();
2670*481dde66SAndroid Build Coastguard Worker auto right = rhs_.begin();
2671*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {
2672*481dde66SAndroid Build Coastguard Worker if (listener->IsInterested()) {
2673*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
2674*481dde66SAndroid Build Coastguard Worker // Create InnerMatcherArg as a temporarily object to avoid it outlives
2675*481dde66SAndroid Build Coastguard Worker // *left and *right. Dereference or the conversion to `const T&` may
2676*481dde66SAndroid Build Coastguard Worker // return temp objects, e.g. for vector<bool>.
2677*481dde66SAndroid Build Coastguard Worker if (!mono_tuple_matcher_.MatchAndExplain(
2678*481dde66SAndroid Build Coastguard Worker InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),
2679*481dde66SAndroid Build Coastguard Worker ImplicitCast_<const RhsValue&>(*right)),
2680*481dde66SAndroid Build Coastguard Worker &inner_listener)) {
2681*481dde66SAndroid Build Coastguard Worker *listener << "where the value pair (";
2682*481dde66SAndroid Build Coastguard Worker UniversalPrint(*left, listener->stream());
2683*481dde66SAndroid Build Coastguard Worker *listener << ", ";
2684*481dde66SAndroid Build Coastguard Worker UniversalPrint(*right, listener->stream());
2685*481dde66SAndroid Build Coastguard Worker *listener << ") at index #" << i << " don't match";
2686*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener.str(), listener->stream());
2687*481dde66SAndroid Build Coastguard Worker return false;
2688*481dde66SAndroid Build Coastguard Worker }
2689*481dde66SAndroid Build Coastguard Worker } else {
2690*481dde66SAndroid Build Coastguard Worker if (!mono_tuple_matcher_.Matches(
2691*481dde66SAndroid Build Coastguard Worker InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),
2692*481dde66SAndroid Build Coastguard Worker ImplicitCast_<const RhsValue&>(*right))))
2693*481dde66SAndroid Build Coastguard Worker return false;
2694*481dde66SAndroid Build Coastguard Worker }
2695*481dde66SAndroid Build Coastguard Worker }
2696*481dde66SAndroid Build Coastguard Worker
2697*481dde66SAndroid Build Coastguard Worker return true;
2698*481dde66SAndroid Build Coastguard Worker }
2699*481dde66SAndroid Build Coastguard Worker
2700*481dde66SAndroid Build Coastguard Worker private:
2701*481dde66SAndroid Build Coastguard Worker const Matcher<InnerMatcherArg> mono_tuple_matcher_;
2702*481dde66SAndroid Build Coastguard Worker const RhsStlContainer rhs_;
2703*481dde66SAndroid Build Coastguard Worker };
2704*481dde66SAndroid Build Coastguard Worker
2705*481dde66SAndroid Build Coastguard Worker private:
2706*481dde66SAndroid Build Coastguard Worker const TupleMatcher tuple_matcher_;
2707*481dde66SAndroid Build Coastguard Worker const RhsStlContainer rhs_;
2708*481dde66SAndroid Build Coastguard Worker };
2709*481dde66SAndroid Build Coastguard Worker
2710*481dde66SAndroid Build Coastguard Worker // Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
2711*481dde66SAndroid Build Coastguard Worker template <typename Container>
2712*481dde66SAndroid Build Coastguard Worker class QuantifierMatcherImpl : public MatcherInterface<Container> {
2713*481dde66SAndroid Build Coastguard Worker public:
2714*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2715*481dde66SAndroid Build Coastguard Worker typedef StlContainerView<RawContainer> View;
2716*481dde66SAndroid Build Coastguard Worker typedef typename View::type StlContainer;
2717*481dde66SAndroid Build Coastguard Worker typedef typename View::const_reference StlContainerReference;
2718*481dde66SAndroid Build Coastguard Worker typedef typename StlContainer::value_type Element;
2719*481dde66SAndroid Build Coastguard Worker
2720*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
2721*481dde66SAndroid Build Coastguard Worker explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)
2722*481dde66SAndroid Build Coastguard Worker : inner_matcher_(
2723*481dde66SAndroid Build Coastguard Worker testing::SafeMatcherCast<const Element&>(inner_matcher)) {}
2724*481dde66SAndroid Build Coastguard Worker
2725*481dde66SAndroid Build Coastguard Worker // Checks whether:
2726*481dde66SAndroid Build Coastguard Worker // * All elements in the container match, if all_elements_should_match.
2727*481dde66SAndroid Build Coastguard Worker // * Any element in the container matches, if !all_elements_should_match.
2728*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(bool all_elements_should_match, Container container,
2729*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2730*481dde66SAndroid Build Coastguard Worker StlContainerReference stl_container = View::ConstReference(container);
2731*481dde66SAndroid Build Coastguard Worker size_t i = 0;
2732*481dde66SAndroid Build Coastguard Worker for (auto it = stl_container.begin(); it != stl_container.end();
2733*481dde66SAndroid Build Coastguard Worker ++it, ++i) {
2734*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
2735*481dde66SAndroid Build Coastguard Worker const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
2736*481dde66SAndroid Build Coastguard Worker
2737*481dde66SAndroid Build Coastguard Worker if (matches != all_elements_should_match) {
2738*481dde66SAndroid Build Coastguard Worker *listener << "whose element #" << i
2739*481dde66SAndroid Build Coastguard Worker << (matches ? " matches" : " doesn't match");
2740*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener.str(), listener->stream());
2741*481dde66SAndroid Build Coastguard Worker return !all_elements_should_match;
2742*481dde66SAndroid Build Coastguard Worker }
2743*481dde66SAndroid Build Coastguard Worker }
2744*481dde66SAndroid Build Coastguard Worker return all_elements_should_match;
2745*481dde66SAndroid Build Coastguard Worker }
2746*481dde66SAndroid Build Coastguard Worker
2747*481dde66SAndroid Build Coastguard Worker bool MatchAndExplainImpl(const Matcher<size_t>& count_matcher,
2748*481dde66SAndroid Build Coastguard Worker Container container,
2749*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
2750*481dde66SAndroid Build Coastguard Worker StlContainerReference stl_container = View::ConstReference(container);
2751*481dde66SAndroid Build Coastguard Worker size_t i = 0;
2752*481dde66SAndroid Build Coastguard Worker std::vector<size_t> match_elements;
2753*481dde66SAndroid Build Coastguard Worker for (auto it = stl_container.begin(); it != stl_container.end();
2754*481dde66SAndroid Build Coastguard Worker ++it, ++i) {
2755*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
2756*481dde66SAndroid Build Coastguard Worker const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
2757*481dde66SAndroid Build Coastguard Worker if (matches) {
2758*481dde66SAndroid Build Coastguard Worker match_elements.push_back(i);
2759*481dde66SAndroid Build Coastguard Worker }
2760*481dde66SAndroid Build Coastguard Worker }
2761*481dde66SAndroid Build Coastguard Worker if (listener->IsInterested()) {
2762*481dde66SAndroid Build Coastguard Worker if (match_elements.empty()) {
2763*481dde66SAndroid Build Coastguard Worker *listener << "has no element that matches";
2764*481dde66SAndroid Build Coastguard Worker } else if (match_elements.size() == 1) {
2765*481dde66SAndroid Build Coastguard Worker *listener << "whose element #" << match_elements[0] << " matches";
2766*481dde66SAndroid Build Coastguard Worker } else {
2767*481dde66SAndroid Build Coastguard Worker *listener << "whose elements (";
2768*481dde66SAndroid Build Coastguard Worker std::string sep = "";
2769*481dde66SAndroid Build Coastguard Worker for (size_t e : match_elements) {
2770*481dde66SAndroid Build Coastguard Worker *listener << sep << e;
2771*481dde66SAndroid Build Coastguard Worker sep = ", ";
2772*481dde66SAndroid Build Coastguard Worker }
2773*481dde66SAndroid Build Coastguard Worker *listener << ") match";
2774*481dde66SAndroid Build Coastguard Worker }
2775*481dde66SAndroid Build Coastguard Worker }
2776*481dde66SAndroid Build Coastguard Worker StringMatchResultListener count_listener;
2777*481dde66SAndroid Build Coastguard Worker if (count_matcher.MatchAndExplain(match_elements.size(), &count_listener)) {
2778*481dde66SAndroid Build Coastguard Worker *listener << " and whose match quantity of " << match_elements.size()
2779*481dde66SAndroid Build Coastguard Worker << " matches";
2780*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(count_listener.str(), listener->stream());
2781*481dde66SAndroid Build Coastguard Worker return true;
2782*481dde66SAndroid Build Coastguard Worker } else {
2783*481dde66SAndroid Build Coastguard Worker if (match_elements.empty()) {
2784*481dde66SAndroid Build Coastguard Worker *listener << " and";
2785*481dde66SAndroid Build Coastguard Worker } else {
2786*481dde66SAndroid Build Coastguard Worker *listener << " but";
2787*481dde66SAndroid Build Coastguard Worker }
2788*481dde66SAndroid Build Coastguard Worker *listener << " whose match quantity of " << match_elements.size()
2789*481dde66SAndroid Build Coastguard Worker << " does not match";
2790*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(count_listener.str(), listener->stream());
2791*481dde66SAndroid Build Coastguard Worker return false;
2792*481dde66SAndroid Build Coastguard Worker }
2793*481dde66SAndroid Build Coastguard Worker }
2794*481dde66SAndroid Build Coastguard Worker
2795*481dde66SAndroid Build Coastguard Worker protected:
2796*481dde66SAndroid Build Coastguard Worker const Matcher<const Element&> inner_matcher_;
2797*481dde66SAndroid Build Coastguard Worker };
2798*481dde66SAndroid Build Coastguard Worker
2799*481dde66SAndroid Build Coastguard Worker // Implements Contains(element_matcher) for the given argument type Container.
2800*481dde66SAndroid Build Coastguard Worker // Symmetric to EachMatcherImpl.
2801*481dde66SAndroid Build Coastguard Worker template <typename Container>
2802*481dde66SAndroid Build Coastguard Worker class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {
2803*481dde66SAndroid Build Coastguard Worker public:
2804*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
2805*481dde66SAndroid Build Coastguard Worker explicit ContainsMatcherImpl(InnerMatcher inner_matcher)
2806*481dde66SAndroid Build Coastguard Worker : QuantifierMatcherImpl<Container>(inner_matcher) {}
2807*481dde66SAndroid Build Coastguard Worker
2808*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
2809*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2810*481dde66SAndroid Build Coastguard Worker *os << "contains at least one element that ";
2811*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeTo(os);
2812*481dde66SAndroid Build Coastguard Worker }
2813*481dde66SAndroid Build Coastguard Worker
2814*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2815*481dde66SAndroid Build Coastguard Worker *os << "doesn't contain any element that ";
2816*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeTo(os);
2817*481dde66SAndroid Build Coastguard Worker }
2818*481dde66SAndroid Build Coastguard Worker
2819*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
2820*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2821*481dde66SAndroid Build Coastguard Worker return this->MatchAndExplainImpl(false, container, listener);
2822*481dde66SAndroid Build Coastguard Worker }
2823*481dde66SAndroid Build Coastguard Worker };
2824*481dde66SAndroid Build Coastguard Worker
2825*481dde66SAndroid Build Coastguard Worker // Implements Each(element_matcher) for the given argument type Container.
2826*481dde66SAndroid Build Coastguard Worker // Symmetric to ContainsMatcherImpl.
2827*481dde66SAndroid Build Coastguard Worker template <typename Container>
2828*481dde66SAndroid Build Coastguard Worker class EachMatcherImpl : public QuantifierMatcherImpl<Container> {
2829*481dde66SAndroid Build Coastguard Worker public:
2830*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
2831*481dde66SAndroid Build Coastguard Worker explicit EachMatcherImpl(InnerMatcher inner_matcher)
2832*481dde66SAndroid Build Coastguard Worker : QuantifierMatcherImpl<Container>(inner_matcher) {}
2833*481dde66SAndroid Build Coastguard Worker
2834*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
2835*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2836*481dde66SAndroid Build Coastguard Worker *os << "only contains elements that ";
2837*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeTo(os);
2838*481dde66SAndroid Build Coastguard Worker }
2839*481dde66SAndroid Build Coastguard Worker
2840*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2841*481dde66SAndroid Build Coastguard Worker *os << "contains some element that ";
2842*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeNegationTo(os);
2843*481dde66SAndroid Build Coastguard Worker }
2844*481dde66SAndroid Build Coastguard Worker
2845*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
2846*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2847*481dde66SAndroid Build Coastguard Worker return this->MatchAndExplainImpl(true, container, listener);
2848*481dde66SAndroid Build Coastguard Worker }
2849*481dde66SAndroid Build Coastguard Worker };
2850*481dde66SAndroid Build Coastguard Worker
2851*481dde66SAndroid Build Coastguard Worker // Implements Contains(element_matcher).Times(n) for the given argument type
2852*481dde66SAndroid Build Coastguard Worker // Container.
2853*481dde66SAndroid Build Coastguard Worker template <typename Container>
2854*481dde66SAndroid Build Coastguard Worker class ContainsTimesMatcherImpl : public QuantifierMatcherImpl<Container> {
2855*481dde66SAndroid Build Coastguard Worker public:
2856*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
2857*481dde66SAndroid Build Coastguard Worker explicit ContainsTimesMatcherImpl(InnerMatcher inner_matcher,
2858*481dde66SAndroid Build Coastguard Worker Matcher<size_t> count_matcher)
2859*481dde66SAndroid Build Coastguard Worker : QuantifierMatcherImpl<Container>(inner_matcher),
2860*481dde66SAndroid Build Coastguard Worker count_matcher_(std::move(count_matcher)) {}
2861*481dde66SAndroid Build Coastguard Worker
2862*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2863*481dde66SAndroid Build Coastguard Worker *os << "quantity of elements that match ";
2864*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeTo(os);
2865*481dde66SAndroid Build Coastguard Worker *os << " ";
2866*481dde66SAndroid Build Coastguard Worker count_matcher_.DescribeTo(os);
2867*481dde66SAndroid Build Coastguard Worker }
2868*481dde66SAndroid Build Coastguard Worker
2869*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
2870*481dde66SAndroid Build Coastguard Worker *os << "quantity of elements that match ";
2871*481dde66SAndroid Build Coastguard Worker this->inner_matcher_.DescribeTo(os);
2872*481dde66SAndroid Build Coastguard Worker *os << " ";
2873*481dde66SAndroid Build Coastguard Worker count_matcher_.DescribeNegationTo(os);
2874*481dde66SAndroid Build Coastguard Worker }
2875*481dde66SAndroid Build Coastguard Worker
2876*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
2877*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2878*481dde66SAndroid Build Coastguard Worker return this->MatchAndExplainImpl(count_matcher_, container, listener);
2879*481dde66SAndroid Build Coastguard Worker }
2880*481dde66SAndroid Build Coastguard Worker
2881*481dde66SAndroid Build Coastguard Worker private:
2882*481dde66SAndroid Build Coastguard Worker const Matcher<size_t> count_matcher_;
2883*481dde66SAndroid Build Coastguard Worker };
2884*481dde66SAndroid Build Coastguard Worker
2885*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Contains(element_matcher).Times(n).
2886*481dde66SAndroid Build Coastguard Worker template <typename M>
2887*481dde66SAndroid Build Coastguard Worker class ContainsTimesMatcher {
2888*481dde66SAndroid Build Coastguard Worker public:
2889*481dde66SAndroid Build Coastguard Worker explicit ContainsTimesMatcher(M m, Matcher<size_t> count_matcher)
2890*481dde66SAndroid Build Coastguard Worker : inner_matcher_(m), count_matcher_(std::move(count_matcher)) {}
2891*481dde66SAndroid Build Coastguard Worker
2892*481dde66SAndroid Build Coastguard Worker template <typename Container>
2893*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const { // NOLINT
2894*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(new ContainsTimesMatcherImpl<const Container&>(
2895*481dde66SAndroid Build Coastguard Worker inner_matcher_, count_matcher_));
2896*481dde66SAndroid Build Coastguard Worker }
2897*481dde66SAndroid Build Coastguard Worker
2898*481dde66SAndroid Build Coastguard Worker private:
2899*481dde66SAndroid Build Coastguard Worker const M inner_matcher_;
2900*481dde66SAndroid Build Coastguard Worker const Matcher<size_t> count_matcher_;
2901*481dde66SAndroid Build Coastguard Worker };
2902*481dde66SAndroid Build Coastguard Worker
2903*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Contains(element_matcher).
2904*481dde66SAndroid Build Coastguard Worker template <typename M>
2905*481dde66SAndroid Build Coastguard Worker class ContainsMatcher {
2906*481dde66SAndroid Build Coastguard Worker public:
2907*481dde66SAndroid Build Coastguard Worker explicit ContainsMatcher(M m) : inner_matcher_(m) {}
2908*481dde66SAndroid Build Coastguard Worker
2909*481dde66SAndroid Build Coastguard Worker template <typename Container>
2910*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const { // NOLINT
2911*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(
2912*481dde66SAndroid Build Coastguard Worker new ContainsMatcherImpl<const Container&>(inner_matcher_));
2913*481dde66SAndroid Build Coastguard Worker }
2914*481dde66SAndroid Build Coastguard Worker
2915*481dde66SAndroid Build Coastguard Worker ContainsTimesMatcher<M> Times(Matcher<size_t> count_matcher) const {
2916*481dde66SAndroid Build Coastguard Worker return ContainsTimesMatcher<M>(inner_matcher_, std::move(count_matcher));
2917*481dde66SAndroid Build Coastguard Worker }
2918*481dde66SAndroid Build Coastguard Worker
2919*481dde66SAndroid Build Coastguard Worker private:
2920*481dde66SAndroid Build Coastguard Worker const M inner_matcher_;
2921*481dde66SAndroid Build Coastguard Worker };
2922*481dde66SAndroid Build Coastguard Worker
2923*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Each(element_matcher).
2924*481dde66SAndroid Build Coastguard Worker template <typename M>
2925*481dde66SAndroid Build Coastguard Worker class EachMatcher {
2926*481dde66SAndroid Build Coastguard Worker public:
2927*481dde66SAndroid Build Coastguard Worker explicit EachMatcher(M m) : inner_matcher_(m) {}
2928*481dde66SAndroid Build Coastguard Worker
2929*481dde66SAndroid Build Coastguard Worker template <typename Container>
2930*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const { // NOLINT
2931*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(
2932*481dde66SAndroid Build Coastguard Worker new EachMatcherImpl<const Container&>(inner_matcher_));
2933*481dde66SAndroid Build Coastguard Worker }
2934*481dde66SAndroid Build Coastguard Worker
2935*481dde66SAndroid Build Coastguard Worker private:
2936*481dde66SAndroid Build Coastguard Worker const M inner_matcher_;
2937*481dde66SAndroid Build Coastguard Worker };
2938*481dde66SAndroid Build Coastguard Worker
2939*481dde66SAndroid Build Coastguard Worker // Use go/ranked-overloads for dispatching.
2940*481dde66SAndroid Build Coastguard Worker struct Rank0 {};
2941*481dde66SAndroid Build Coastguard Worker struct Rank1 : Rank0 {};
2942*481dde66SAndroid Build Coastguard Worker
2943*481dde66SAndroid Build Coastguard Worker namespace pair_getters {
2944*481dde66SAndroid Build Coastguard Worker using std::get;
2945*481dde66SAndroid Build Coastguard Worker template <typename T>
2946*481dde66SAndroid Build Coastguard Worker auto First(T& x, Rank0) -> decltype(get<0>(x)) { // NOLINT
2947*481dde66SAndroid Build Coastguard Worker return get<0>(x);
2948*481dde66SAndroid Build Coastguard Worker }
2949*481dde66SAndroid Build Coastguard Worker template <typename T>
2950*481dde66SAndroid Build Coastguard Worker auto First(T& x, Rank1) -> decltype((x.first)) { // NOLINT
2951*481dde66SAndroid Build Coastguard Worker return x.first;
2952*481dde66SAndroid Build Coastguard Worker }
2953*481dde66SAndroid Build Coastguard Worker
2954*481dde66SAndroid Build Coastguard Worker template <typename T>
2955*481dde66SAndroid Build Coastguard Worker auto Second(T& x, Rank0) -> decltype(get<1>(x)) { // NOLINT
2956*481dde66SAndroid Build Coastguard Worker return get<1>(x);
2957*481dde66SAndroid Build Coastguard Worker }
2958*481dde66SAndroid Build Coastguard Worker template <typename T>
2959*481dde66SAndroid Build Coastguard Worker auto Second(T& x, Rank1) -> decltype((x.second)) { // NOLINT
2960*481dde66SAndroid Build Coastguard Worker return x.second;
2961*481dde66SAndroid Build Coastguard Worker }
2962*481dde66SAndroid Build Coastguard Worker } // namespace pair_getters
2963*481dde66SAndroid Build Coastguard Worker
2964*481dde66SAndroid Build Coastguard Worker // Implements Key(inner_matcher) for the given argument pair type.
2965*481dde66SAndroid Build Coastguard Worker // Key(inner_matcher) matches an std::pair whose 'first' field matches
2966*481dde66SAndroid Build Coastguard Worker // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
2967*481dde66SAndroid Build Coastguard Worker // std::map that contains at least one element whose key is >= 5.
2968*481dde66SAndroid Build Coastguard Worker template <typename PairType>
2969*481dde66SAndroid Build Coastguard Worker class KeyMatcherImpl : public MatcherInterface<PairType> {
2970*481dde66SAndroid Build Coastguard Worker public:
2971*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
2972*481dde66SAndroid Build Coastguard Worker typedef typename RawPairType::first_type KeyType;
2973*481dde66SAndroid Build Coastguard Worker
2974*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
2975*481dde66SAndroid Build Coastguard Worker explicit KeyMatcherImpl(InnerMatcher inner_matcher)
2976*481dde66SAndroid Build Coastguard Worker : inner_matcher_(
2977*481dde66SAndroid Build Coastguard Worker testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {}
2978*481dde66SAndroid Build Coastguard Worker
2979*481dde66SAndroid Build Coastguard Worker // Returns true if and only if 'key_value.first' (the key) matches the inner
2980*481dde66SAndroid Build Coastguard Worker // matcher.
2981*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(PairType key_value,
2982*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
2983*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
2984*481dde66SAndroid Build Coastguard Worker const bool match = inner_matcher_.MatchAndExplain(
2985*481dde66SAndroid Build Coastguard Worker pair_getters::First(key_value, Rank1()), &inner_listener);
2986*481dde66SAndroid Build Coastguard Worker const std::string explanation = inner_listener.str();
2987*481dde66SAndroid Build Coastguard Worker if (!explanation.empty()) {
2988*481dde66SAndroid Build Coastguard Worker *listener << "whose first field is a value " << explanation;
2989*481dde66SAndroid Build Coastguard Worker }
2990*481dde66SAndroid Build Coastguard Worker return match;
2991*481dde66SAndroid Build Coastguard Worker }
2992*481dde66SAndroid Build Coastguard Worker
2993*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
2994*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
2995*481dde66SAndroid Build Coastguard Worker *os << "has a key that ";
2996*481dde66SAndroid Build Coastguard Worker inner_matcher_.DescribeTo(os);
2997*481dde66SAndroid Build Coastguard Worker }
2998*481dde66SAndroid Build Coastguard Worker
2999*481dde66SAndroid Build Coastguard Worker // Describes what the negation of this matcher does.
3000*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3001*481dde66SAndroid Build Coastguard Worker *os << "doesn't have a key that ";
3002*481dde66SAndroid Build Coastguard Worker inner_matcher_.DescribeTo(os);
3003*481dde66SAndroid Build Coastguard Worker }
3004*481dde66SAndroid Build Coastguard Worker
3005*481dde66SAndroid Build Coastguard Worker private:
3006*481dde66SAndroid Build Coastguard Worker const Matcher<const KeyType&> inner_matcher_;
3007*481dde66SAndroid Build Coastguard Worker };
3008*481dde66SAndroid Build Coastguard Worker
3009*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Key(matcher_for_key).
3010*481dde66SAndroid Build Coastguard Worker template <typename M>
3011*481dde66SAndroid Build Coastguard Worker class KeyMatcher {
3012*481dde66SAndroid Build Coastguard Worker public:
3013*481dde66SAndroid Build Coastguard Worker explicit KeyMatcher(M m) : matcher_for_key_(m) {}
3014*481dde66SAndroid Build Coastguard Worker
3015*481dde66SAndroid Build Coastguard Worker template <typename PairType>
3016*481dde66SAndroid Build Coastguard Worker operator Matcher<PairType>() const {
3017*481dde66SAndroid Build Coastguard Worker return Matcher<PairType>(
3018*481dde66SAndroid Build Coastguard Worker new KeyMatcherImpl<const PairType&>(matcher_for_key_));
3019*481dde66SAndroid Build Coastguard Worker }
3020*481dde66SAndroid Build Coastguard Worker
3021*481dde66SAndroid Build Coastguard Worker private:
3022*481dde66SAndroid Build Coastguard Worker const M matcher_for_key_;
3023*481dde66SAndroid Build Coastguard Worker };
3024*481dde66SAndroid Build Coastguard Worker
3025*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Address(matcher_for_address).
3026*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
3027*481dde66SAndroid Build Coastguard Worker class AddressMatcher {
3028*481dde66SAndroid Build Coastguard Worker public:
3029*481dde66SAndroid Build Coastguard Worker explicit AddressMatcher(InnerMatcher m) : matcher_(m) {}
3030*481dde66SAndroid Build Coastguard Worker
3031*481dde66SAndroid Build Coastguard Worker template <typename Type>
3032*481dde66SAndroid Build Coastguard Worker operator Matcher<Type>() const { // NOLINT
3033*481dde66SAndroid Build Coastguard Worker return Matcher<Type>(new Impl<const Type&>(matcher_));
3034*481dde66SAndroid Build Coastguard Worker }
3035*481dde66SAndroid Build Coastguard Worker
3036*481dde66SAndroid Build Coastguard Worker private:
3037*481dde66SAndroid Build Coastguard Worker // The monomorphic implementation that works for a particular object type.
3038*481dde66SAndroid Build Coastguard Worker template <typename Type>
3039*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Type> {
3040*481dde66SAndroid Build Coastguard Worker public:
3041*481dde66SAndroid Build Coastguard Worker using Address = const GTEST_REMOVE_REFERENCE_AND_CONST_(Type) *;
3042*481dde66SAndroid Build Coastguard Worker explicit Impl(const InnerMatcher& matcher)
3043*481dde66SAndroid Build Coastguard Worker : matcher_(MatcherCast<Address>(matcher)) {}
3044*481dde66SAndroid Build Coastguard Worker
3045*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3046*481dde66SAndroid Build Coastguard Worker *os << "has address that ";
3047*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
3048*481dde66SAndroid Build Coastguard Worker }
3049*481dde66SAndroid Build Coastguard Worker
3050*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3051*481dde66SAndroid Build Coastguard Worker *os << "does not have address that ";
3052*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
3053*481dde66SAndroid Build Coastguard Worker }
3054*481dde66SAndroid Build Coastguard Worker
3055*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Type object,
3056*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
3057*481dde66SAndroid Build Coastguard Worker *listener << "which has address ";
3058*481dde66SAndroid Build Coastguard Worker Address address = std::addressof(object);
3059*481dde66SAndroid Build Coastguard Worker return MatchPrintAndExplain(address, matcher_, listener);
3060*481dde66SAndroid Build Coastguard Worker }
3061*481dde66SAndroid Build Coastguard Worker
3062*481dde66SAndroid Build Coastguard Worker private:
3063*481dde66SAndroid Build Coastguard Worker const Matcher<Address> matcher_;
3064*481dde66SAndroid Build Coastguard Worker };
3065*481dde66SAndroid Build Coastguard Worker const InnerMatcher matcher_;
3066*481dde66SAndroid Build Coastguard Worker };
3067*481dde66SAndroid Build Coastguard Worker
3068*481dde66SAndroid Build Coastguard Worker // Implements Pair(first_matcher, second_matcher) for the given argument pair
3069*481dde66SAndroid Build Coastguard Worker // type with its two matchers. See Pair() function below.
3070*481dde66SAndroid Build Coastguard Worker template <typename PairType>
3071*481dde66SAndroid Build Coastguard Worker class PairMatcherImpl : public MatcherInterface<PairType> {
3072*481dde66SAndroid Build Coastguard Worker public:
3073*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
3074*481dde66SAndroid Build Coastguard Worker typedef typename RawPairType::first_type FirstType;
3075*481dde66SAndroid Build Coastguard Worker typedef typename RawPairType::second_type SecondType;
3076*481dde66SAndroid Build Coastguard Worker
3077*481dde66SAndroid Build Coastguard Worker template <typename FirstMatcher, typename SecondMatcher>
3078*481dde66SAndroid Build Coastguard Worker PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)
3079*481dde66SAndroid Build Coastguard Worker : first_matcher_(
3080*481dde66SAndroid Build Coastguard Worker testing::SafeMatcherCast<const FirstType&>(first_matcher)),
3081*481dde66SAndroid Build Coastguard Worker second_matcher_(
3082*481dde66SAndroid Build Coastguard Worker testing::SafeMatcherCast<const SecondType&>(second_matcher)) {}
3083*481dde66SAndroid Build Coastguard Worker
3084*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
3085*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3086*481dde66SAndroid Build Coastguard Worker *os << "has a first field that ";
3087*481dde66SAndroid Build Coastguard Worker first_matcher_.DescribeTo(os);
3088*481dde66SAndroid Build Coastguard Worker *os << ", and has a second field that ";
3089*481dde66SAndroid Build Coastguard Worker second_matcher_.DescribeTo(os);
3090*481dde66SAndroid Build Coastguard Worker }
3091*481dde66SAndroid Build Coastguard Worker
3092*481dde66SAndroid Build Coastguard Worker // Describes what the negation of this matcher does.
3093*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3094*481dde66SAndroid Build Coastguard Worker *os << "has a first field that ";
3095*481dde66SAndroid Build Coastguard Worker first_matcher_.DescribeNegationTo(os);
3096*481dde66SAndroid Build Coastguard Worker *os << ", or has a second field that ";
3097*481dde66SAndroid Build Coastguard Worker second_matcher_.DescribeNegationTo(os);
3098*481dde66SAndroid Build Coastguard Worker }
3099*481dde66SAndroid Build Coastguard Worker
3100*481dde66SAndroid Build Coastguard Worker // Returns true if and only if 'a_pair.first' matches first_matcher and
3101*481dde66SAndroid Build Coastguard Worker // 'a_pair.second' matches second_matcher.
3102*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(PairType a_pair,
3103*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
3104*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
3105*481dde66SAndroid Build Coastguard Worker // If the listener is not interested, we don't need to construct the
3106*481dde66SAndroid Build Coastguard Worker // explanation.
3107*481dde66SAndroid Build Coastguard Worker return first_matcher_.Matches(pair_getters::First(a_pair, Rank1())) &&
3108*481dde66SAndroid Build Coastguard Worker second_matcher_.Matches(pair_getters::Second(a_pair, Rank1()));
3109*481dde66SAndroid Build Coastguard Worker }
3110*481dde66SAndroid Build Coastguard Worker StringMatchResultListener first_inner_listener;
3111*481dde66SAndroid Build Coastguard Worker if (!first_matcher_.MatchAndExplain(pair_getters::First(a_pair, Rank1()),
3112*481dde66SAndroid Build Coastguard Worker &first_inner_listener)) {
3113*481dde66SAndroid Build Coastguard Worker *listener << "whose first field does not match";
3114*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(first_inner_listener.str(), listener->stream());
3115*481dde66SAndroid Build Coastguard Worker return false;
3116*481dde66SAndroid Build Coastguard Worker }
3117*481dde66SAndroid Build Coastguard Worker StringMatchResultListener second_inner_listener;
3118*481dde66SAndroid Build Coastguard Worker if (!second_matcher_.MatchAndExplain(pair_getters::Second(a_pair, Rank1()),
3119*481dde66SAndroid Build Coastguard Worker &second_inner_listener)) {
3120*481dde66SAndroid Build Coastguard Worker *listener << "whose second field does not match";
3121*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(second_inner_listener.str(), listener->stream());
3122*481dde66SAndroid Build Coastguard Worker return false;
3123*481dde66SAndroid Build Coastguard Worker }
3124*481dde66SAndroid Build Coastguard Worker ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),
3125*481dde66SAndroid Build Coastguard Worker listener);
3126*481dde66SAndroid Build Coastguard Worker return true;
3127*481dde66SAndroid Build Coastguard Worker }
3128*481dde66SAndroid Build Coastguard Worker
3129*481dde66SAndroid Build Coastguard Worker private:
3130*481dde66SAndroid Build Coastguard Worker void ExplainSuccess(const std::string& first_explanation,
3131*481dde66SAndroid Build Coastguard Worker const std::string& second_explanation,
3132*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
3133*481dde66SAndroid Build Coastguard Worker *listener << "whose both fields match";
3134*481dde66SAndroid Build Coastguard Worker if (!first_explanation.empty()) {
3135*481dde66SAndroid Build Coastguard Worker *listener << ", where the first field is a value " << first_explanation;
3136*481dde66SAndroid Build Coastguard Worker }
3137*481dde66SAndroid Build Coastguard Worker if (!second_explanation.empty()) {
3138*481dde66SAndroid Build Coastguard Worker *listener << ", ";
3139*481dde66SAndroid Build Coastguard Worker if (!first_explanation.empty()) {
3140*481dde66SAndroid Build Coastguard Worker *listener << "and ";
3141*481dde66SAndroid Build Coastguard Worker } else {
3142*481dde66SAndroid Build Coastguard Worker *listener << "where ";
3143*481dde66SAndroid Build Coastguard Worker }
3144*481dde66SAndroid Build Coastguard Worker *listener << "the second field is a value " << second_explanation;
3145*481dde66SAndroid Build Coastguard Worker }
3146*481dde66SAndroid Build Coastguard Worker }
3147*481dde66SAndroid Build Coastguard Worker
3148*481dde66SAndroid Build Coastguard Worker const Matcher<const FirstType&> first_matcher_;
3149*481dde66SAndroid Build Coastguard Worker const Matcher<const SecondType&> second_matcher_;
3150*481dde66SAndroid Build Coastguard Worker };
3151*481dde66SAndroid Build Coastguard Worker
3152*481dde66SAndroid Build Coastguard Worker // Implements polymorphic Pair(first_matcher, second_matcher).
3153*481dde66SAndroid Build Coastguard Worker template <typename FirstMatcher, typename SecondMatcher>
3154*481dde66SAndroid Build Coastguard Worker class PairMatcher {
3155*481dde66SAndroid Build Coastguard Worker public:
3156*481dde66SAndroid Build Coastguard Worker PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)
3157*481dde66SAndroid Build Coastguard Worker : first_matcher_(first_matcher), second_matcher_(second_matcher) {}
3158*481dde66SAndroid Build Coastguard Worker
3159*481dde66SAndroid Build Coastguard Worker template <typename PairType>
3160*481dde66SAndroid Build Coastguard Worker operator Matcher<PairType>() const {
3161*481dde66SAndroid Build Coastguard Worker return Matcher<PairType>(
3162*481dde66SAndroid Build Coastguard Worker new PairMatcherImpl<const PairType&>(first_matcher_, second_matcher_));
3163*481dde66SAndroid Build Coastguard Worker }
3164*481dde66SAndroid Build Coastguard Worker
3165*481dde66SAndroid Build Coastguard Worker private:
3166*481dde66SAndroid Build Coastguard Worker const FirstMatcher first_matcher_;
3167*481dde66SAndroid Build Coastguard Worker const SecondMatcher second_matcher_;
3168*481dde66SAndroid Build Coastguard Worker };
3169*481dde66SAndroid Build Coastguard Worker
3170*481dde66SAndroid Build Coastguard Worker template <typename T, size_t... I>
3171*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::index_sequence<I...>,
3172*481dde66SAndroid Build Coastguard Worker int) -> decltype(std::tie(get<I>(t)...)) {
3173*481dde66SAndroid Build Coastguard Worker static_assert(std::tuple_size<T>::value == sizeof...(I),
3174*481dde66SAndroid Build Coastguard Worker "Number of arguments doesn't match the number of fields.");
3175*481dde66SAndroid Build Coastguard Worker return std::tie(get<I>(t)...);
3176*481dde66SAndroid Build Coastguard Worker }
3177*481dde66SAndroid Build Coastguard Worker
3178*481dde66SAndroid Build Coastguard Worker #if defined(__cpp_structured_bindings) && __cpp_structured_bindings >= 201606
3179*481dde66SAndroid Build Coastguard Worker template <typename T>
3180*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<1>, char) {
3181*481dde66SAndroid Build Coastguard Worker const auto& [a] = t;
3182*481dde66SAndroid Build Coastguard Worker return std::tie(a);
3183*481dde66SAndroid Build Coastguard Worker }
3184*481dde66SAndroid Build Coastguard Worker template <typename T>
3185*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<2>, char) {
3186*481dde66SAndroid Build Coastguard Worker const auto& [a, b] = t;
3187*481dde66SAndroid Build Coastguard Worker return std::tie(a, b);
3188*481dde66SAndroid Build Coastguard Worker }
3189*481dde66SAndroid Build Coastguard Worker template <typename T>
3190*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<3>, char) {
3191*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c] = t;
3192*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c);
3193*481dde66SAndroid Build Coastguard Worker }
3194*481dde66SAndroid Build Coastguard Worker template <typename T>
3195*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<4>, char) {
3196*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d] = t;
3197*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d);
3198*481dde66SAndroid Build Coastguard Worker }
3199*481dde66SAndroid Build Coastguard Worker template <typename T>
3200*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<5>, char) {
3201*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e] = t;
3202*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e);
3203*481dde66SAndroid Build Coastguard Worker }
3204*481dde66SAndroid Build Coastguard Worker template <typename T>
3205*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<6>, char) {
3206*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f] = t;
3207*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f);
3208*481dde66SAndroid Build Coastguard Worker }
3209*481dde66SAndroid Build Coastguard Worker template <typename T>
3210*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<7>, char) {
3211*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g] = t;
3212*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g);
3213*481dde66SAndroid Build Coastguard Worker }
3214*481dde66SAndroid Build Coastguard Worker template <typename T>
3215*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<8>, char) {
3216*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h] = t;
3217*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h);
3218*481dde66SAndroid Build Coastguard Worker }
3219*481dde66SAndroid Build Coastguard Worker template <typename T>
3220*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<9>, char) {
3221*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i] = t;
3222*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i);
3223*481dde66SAndroid Build Coastguard Worker }
3224*481dde66SAndroid Build Coastguard Worker template <typename T>
3225*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<10>, char) {
3226*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j] = t;
3227*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j);
3228*481dde66SAndroid Build Coastguard Worker }
3229*481dde66SAndroid Build Coastguard Worker template <typename T>
3230*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<11>, char) {
3231*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k] = t;
3232*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k);
3233*481dde66SAndroid Build Coastguard Worker }
3234*481dde66SAndroid Build Coastguard Worker template <typename T>
3235*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<12>, char) {
3236*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l] = t;
3237*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l);
3238*481dde66SAndroid Build Coastguard Worker }
3239*481dde66SAndroid Build Coastguard Worker template <typename T>
3240*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<13>, char) {
3241*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m] = t;
3242*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m);
3243*481dde66SAndroid Build Coastguard Worker }
3244*481dde66SAndroid Build Coastguard Worker template <typename T>
3245*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<14>, char) {
3246*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n] = t;
3247*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
3248*481dde66SAndroid Build Coastguard Worker }
3249*481dde66SAndroid Build Coastguard Worker template <typename T>
3250*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<15>, char) {
3251*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o] = t;
3252*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
3253*481dde66SAndroid Build Coastguard Worker }
3254*481dde66SAndroid Build Coastguard Worker template <typename T>
3255*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<16>, char) {
3256*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] = t;
3257*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);
3258*481dde66SAndroid Build Coastguard Worker }
3259*481dde66SAndroid Build Coastguard Worker template <typename T>
3260*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<17>, char) {
3261*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q] = t;
3262*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q);
3263*481dde66SAndroid Build Coastguard Worker }
3264*481dde66SAndroid Build Coastguard Worker template <typename T>
3265*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<18>, char) {
3266*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r] = t;
3267*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r);
3268*481dde66SAndroid Build Coastguard Worker }
3269*481dde66SAndroid Build Coastguard Worker template <typename T>
3270*481dde66SAndroid Build Coastguard Worker auto UnpackStructImpl(const T& t, std::make_index_sequence<19>, char) {
3271*481dde66SAndroid Build Coastguard Worker const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s] = t;
3272*481dde66SAndroid Build Coastguard Worker return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s);
3273*481dde66SAndroid Build Coastguard Worker }
3274*481dde66SAndroid Build Coastguard Worker #endif // defined(__cpp_structured_bindings)
3275*481dde66SAndroid Build Coastguard Worker
3276*481dde66SAndroid Build Coastguard Worker template <size_t I, typename T>
3277*481dde66SAndroid Build Coastguard Worker auto UnpackStruct(const T& t)
3278*481dde66SAndroid Build Coastguard Worker -> decltype((UnpackStructImpl)(t, std::make_index_sequence<I>{}, 0)) {
3279*481dde66SAndroid Build Coastguard Worker return (UnpackStructImpl)(t, std::make_index_sequence<I>{}, 0);
3280*481dde66SAndroid Build Coastguard Worker }
3281*481dde66SAndroid Build Coastguard Worker
3282*481dde66SAndroid Build Coastguard Worker // Helper function to do comma folding in C++11.
3283*481dde66SAndroid Build Coastguard Worker // The array ensures left-to-right order of evaluation.
3284*481dde66SAndroid Build Coastguard Worker // Usage: VariadicExpand({expr...});
3285*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
3286*481dde66SAndroid Build Coastguard Worker void VariadicExpand(const T (&)[N]) {}
3287*481dde66SAndroid Build Coastguard Worker
3288*481dde66SAndroid Build Coastguard Worker template <typename Struct, typename StructSize>
3289*481dde66SAndroid Build Coastguard Worker class FieldsAreMatcherImpl;
3290*481dde66SAndroid Build Coastguard Worker
3291*481dde66SAndroid Build Coastguard Worker template <typename Struct, size_t... I>
3292*481dde66SAndroid Build Coastguard Worker class FieldsAreMatcherImpl<Struct, std::index_sequence<I...>>
3293*481dde66SAndroid Build Coastguard Worker : public MatcherInterface<Struct> {
3294*481dde66SAndroid Build Coastguard Worker using UnpackedType =
3295*481dde66SAndroid Build Coastguard Worker decltype(UnpackStruct<sizeof...(I)>(std::declval<const Struct&>()));
3296*481dde66SAndroid Build Coastguard Worker using MatchersType = std::tuple<
3297*481dde66SAndroid Build Coastguard Worker Matcher<const typename std::tuple_element<I, UnpackedType>::type&>...>;
3298*481dde66SAndroid Build Coastguard Worker
3299*481dde66SAndroid Build Coastguard Worker public:
3300*481dde66SAndroid Build Coastguard Worker template <typename Inner>
3301*481dde66SAndroid Build Coastguard Worker explicit FieldsAreMatcherImpl(const Inner& matchers)
3302*481dde66SAndroid Build Coastguard Worker : matchers_(testing::SafeMatcherCast<
3303*481dde66SAndroid Build Coastguard Worker const typename std::tuple_element<I, UnpackedType>::type&>(
3304*481dde66SAndroid Build Coastguard Worker std::get<I>(matchers))...) {}
3305*481dde66SAndroid Build Coastguard Worker
3306*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3307*481dde66SAndroid Build Coastguard Worker const char* separator = "";
3308*481dde66SAndroid Build Coastguard Worker VariadicExpand(
3309*481dde66SAndroid Build Coastguard Worker {(*os << separator << "has field #" << I << " that ",
3310*481dde66SAndroid Build Coastguard Worker std::get<I>(matchers_).DescribeTo(os), separator = ", and ")...});
3311*481dde66SAndroid Build Coastguard Worker }
3312*481dde66SAndroid Build Coastguard Worker
3313*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3314*481dde66SAndroid Build Coastguard Worker const char* separator = "";
3315*481dde66SAndroid Build Coastguard Worker VariadicExpand({(*os << separator << "has field #" << I << " that ",
3316*481dde66SAndroid Build Coastguard Worker std::get<I>(matchers_).DescribeNegationTo(os),
3317*481dde66SAndroid Build Coastguard Worker separator = ", or ")...});
3318*481dde66SAndroid Build Coastguard Worker }
3319*481dde66SAndroid Build Coastguard Worker
3320*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Struct t, MatchResultListener* listener) const override {
3321*481dde66SAndroid Build Coastguard Worker return MatchInternal((UnpackStruct<sizeof...(I)>)(t), listener);
3322*481dde66SAndroid Build Coastguard Worker }
3323*481dde66SAndroid Build Coastguard Worker
3324*481dde66SAndroid Build Coastguard Worker private:
3325*481dde66SAndroid Build Coastguard Worker bool MatchInternal(UnpackedType tuple, MatchResultListener* listener) const {
3326*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
3327*481dde66SAndroid Build Coastguard Worker // If the listener is not interested, we don't need to construct the
3328*481dde66SAndroid Build Coastguard Worker // explanation.
3329*481dde66SAndroid Build Coastguard Worker bool good = true;
3330*481dde66SAndroid Build Coastguard Worker VariadicExpand({good = good && std::get<I>(matchers_).Matches(
3331*481dde66SAndroid Build Coastguard Worker std::get<I>(tuple))...});
3332*481dde66SAndroid Build Coastguard Worker return good;
3333*481dde66SAndroid Build Coastguard Worker }
3334*481dde66SAndroid Build Coastguard Worker
3335*481dde66SAndroid Build Coastguard Worker size_t failed_pos = ~size_t{};
3336*481dde66SAndroid Build Coastguard Worker
3337*481dde66SAndroid Build Coastguard Worker std::vector<StringMatchResultListener> inner_listener(sizeof...(I));
3338*481dde66SAndroid Build Coastguard Worker
3339*481dde66SAndroid Build Coastguard Worker VariadicExpand(
3340*481dde66SAndroid Build Coastguard Worker {failed_pos == ~size_t{} && !std::get<I>(matchers_).MatchAndExplain(
3341*481dde66SAndroid Build Coastguard Worker std::get<I>(tuple), &inner_listener[I])
3342*481dde66SAndroid Build Coastguard Worker ? failed_pos = I
3343*481dde66SAndroid Build Coastguard Worker : 0 ...});
3344*481dde66SAndroid Build Coastguard Worker if (failed_pos != ~size_t{}) {
3345*481dde66SAndroid Build Coastguard Worker *listener << "whose field #" << failed_pos << " does not match";
3346*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener[failed_pos].str(), listener->stream());
3347*481dde66SAndroid Build Coastguard Worker return false;
3348*481dde66SAndroid Build Coastguard Worker }
3349*481dde66SAndroid Build Coastguard Worker
3350*481dde66SAndroid Build Coastguard Worker *listener << "whose all elements match";
3351*481dde66SAndroid Build Coastguard Worker const char* separator = ", where";
3352*481dde66SAndroid Build Coastguard Worker for (size_t index = 0; index < sizeof...(I); ++index) {
3353*481dde66SAndroid Build Coastguard Worker const std::string str = inner_listener[index].str();
3354*481dde66SAndroid Build Coastguard Worker if (!str.empty()) {
3355*481dde66SAndroid Build Coastguard Worker *listener << separator << " field #" << index << " is a value " << str;
3356*481dde66SAndroid Build Coastguard Worker separator = ", and";
3357*481dde66SAndroid Build Coastguard Worker }
3358*481dde66SAndroid Build Coastguard Worker }
3359*481dde66SAndroid Build Coastguard Worker
3360*481dde66SAndroid Build Coastguard Worker return true;
3361*481dde66SAndroid Build Coastguard Worker }
3362*481dde66SAndroid Build Coastguard Worker
3363*481dde66SAndroid Build Coastguard Worker MatchersType matchers_;
3364*481dde66SAndroid Build Coastguard Worker };
3365*481dde66SAndroid Build Coastguard Worker
3366*481dde66SAndroid Build Coastguard Worker template <typename... Inner>
3367*481dde66SAndroid Build Coastguard Worker class FieldsAreMatcher {
3368*481dde66SAndroid Build Coastguard Worker public:
3369*481dde66SAndroid Build Coastguard Worker explicit FieldsAreMatcher(Inner... inner) : matchers_(std::move(inner)...) {}
3370*481dde66SAndroid Build Coastguard Worker
3371*481dde66SAndroid Build Coastguard Worker template <typename Struct>
3372*481dde66SAndroid Build Coastguard Worker operator Matcher<Struct>() const { // NOLINT
3373*481dde66SAndroid Build Coastguard Worker return Matcher<Struct>(
3374*481dde66SAndroid Build Coastguard Worker new FieldsAreMatcherImpl<const Struct&,
3375*481dde66SAndroid Build Coastguard Worker std::index_sequence_for<Inner...>>(matchers_));
3376*481dde66SAndroid Build Coastguard Worker }
3377*481dde66SAndroid Build Coastguard Worker
3378*481dde66SAndroid Build Coastguard Worker private:
3379*481dde66SAndroid Build Coastguard Worker std::tuple<Inner...> matchers_;
3380*481dde66SAndroid Build Coastguard Worker };
3381*481dde66SAndroid Build Coastguard Worker
3382*481dde66SAndroid Build Coastguard Worker // Implements ElementsAre() and ElementsAreArray().
3383*481dde66SAndroid Build Coastguard Worker template <typename Container>
3384*481dde66SAndroid Build Coastguard Worker class ElementsAreMatcherImpl : public MatcherInterface<Container> {
3385*481dde66SAndroid Build Coastguard Worker public:
3386*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3387*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<RawContainer> View;
3388*481dde66SAndroid Build Coastguard Worker typedef typename View::type StlContainer;
3389*481dde66SAndroid Build Coastguard Worker typedef typename View::const_reference StlContainerReference;
3390*481dde66SAndroid Build Coastguard Worker typedef typename StlContainer::value_type Element;
3391*481dde66SAndroid Build Coastguard Worker
3392*481dde66SAndroid Build Coastguard Worker // Constructs the matcher from a sequence of element values or
3393*481dde66SAndroid Build Coastguard Worker // element matchers.
3394*481dde66SAndroid Build Coastguard Worker template <typename InputIter>
3395*481dde66SAndroid Build Coastguard Worker ElementsAreMatcherImpl(InputIter first, InputIter last) {
3396*481dde66SAndroid Build Coastguard Worker while (first != last) {
3397*481dde66SAndroid Build Coastguard Worker matchers_.push_back(MatcherCast<const Element&>(*first++));
3398*481dde66SAndroid Build Coastguard Worker }
3399*481dde66SAndroid Build Coastguard Worker }
3400*481dde66SAndroid Build Coastguard Worker
3401*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
3402*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3403*481dde66SAndroid Build Coastguard Worker if (count() == 0) {
3404*481dde66SAndroid Build Coastguard Worker *os << "is empty";
3405*481dde66SAndroid Build Coastguard Worker } else if (count() == 1) {
3406*481dde66SAndroid Build Coastguard Worker *os << "has 1 element that ";
3407*481dde66SAndroid Build Coastguard Worker matchers_[0].DescribeTo(os);
3408*481dde66SAndroid Build Coastguard Worker } else {
3409*481dde66SAndroid Build Coastguard Worker *os << "has " << Elements(count()) << " where\n";
3410*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i != count(); ++i) {
3411*481dde66SAndroid Build Coastguard Worker *os << "element #" << i << " ";
3412*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeTo(os);
3413*481dde66SAndroid Build Coastguard Worker if (i + 1 < count()) {
3414*481dde66SAndroid Build Coastguard Worker *os << ",\n";
3415*481dde66SAndroid Build Coastguard Worker }
3416*481dde66SAndroid Build Coastguard Worker }
3417*481dde66SAndroid Build Coastguard Worker }
3418*481dde66SAndroid Build Coastguard Worker }
3419*481dde66SAndroid Build Coastguard Worker
3420*481dde66SAndroid Build Coastguard Worker // Describes what the negation of this matcher does.
3421*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3422*481dde66SAndroid Build Coastguard Worker if (count() == 0) {
3423*481dde66SAndroid Build Coastguard Worker *os << "isn't empty";
3424*481dde66SAndroid Build Coastguard Worker return;
3425*481dde66SAndroid Build Coastguard Worker }
3426*481dde66SAndroid Build Coastguard Worker
3427*481dde66SAndroid Build Coastguard Worker *os << "doesn't have " << Elements(count()) << ", or\n";
3428*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i != count(); ++i) {
3429*481dde66SAndroid Build Coastguard Worker *os << "element #" << i << " ";
3430*481dde66SAndroid Build Coastguard Worker matchers_[i].DescribeNegationTo(os);
3431*481dde66SAndroid Build Coastguard Worker if (i + 1 < count()) {
3432*481dde66SAndroid Build Coastguard Worker *os << ", or\n";
3433*481dde66SAndroid Build Coastguard Worker }
3434*481dde66SAndroid Build Coastguard Worker }
3435*481dde66SAndroid Build Coastguard Worker }
3436*481dde66SAndroid Build Coastguard Worker
3437*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
3438*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
3439*481dde66SAndroid Build Coastguard Worker // To work with stream-like "containers", we must only walk
3440*481dde66SAndroid Build Coastguard Worker // through the elements in one pass.
3441*481dde66SAndroid Build Coastguard Worker
3442*481dde66SAndroid Build Coastguard Worker const bool listener_interested = listener->IsInterested();
3443*481dde66SAndroid Build Coastguard Worker
3444*481dde66SAndroid Build Coastguard Worker // explanations[i] is the explanation of the element at index i.
3445*481dde66SAndroid Build Coastguard Worker ::std::vector<std::string> explanations(count());
3446*481dde66SAndroid Build Coastguard Worker StlContainerReference stl_container = View::ConstReference(container);
3447*481dde66SAndroid Build Coastguard Worker auto it = stl_container.begin();
3448*481dde66SAndroid Build Coastguard Worker size_t exam_pos = 0;
3449*481dde66SAndroid Build Coastguard Worker bool mismatch_found = false; // Have we found a mismatched element yet?
3450*481dde66SAndroid Build Coastguard Worker
3451*481dde66SAndroid Build Coastguard Worker // Go through the elements and matchers in pairs, until we reach
3452*481dde66SAndroid Build Coastguard Worker // the end of either the elements or the matchers, or until we find a
3453*481dde66SAndroid Build Coastguard Worker // mismatch.
3454*481dde66SAndroid Build Coastguard Worker for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {
3455*481dde66SAndroid Build Coastguard Worker bool match; // Does the current element match the current matcher?
3456*481dde66SAndroid Build Coastguard Worker if (listener_interested) {
3457*481dde66SAndroid Build Coastguard Worker StringMatchResultListener s;
3458*481dde66SAndroid Build Coastguard Worker match = matchers_[exam_pos].MatchAndExplain(*it, &s);
3459*481dde66SAndroid Build Coastguard Worker explanations[exam_pos] = s.str();
3460*481dde66SAndroid Build Coastguard Worker } else {
3461*481dde66SAndroid Build Coastguard Worker match = matchers_[exam_pos].Matches(*it);
3462*481dde66SAndroid Build Coastguard Worker }
3463*481dde66SAndroid Build Coastguard Worker
3464*481dde66SAndroid Build Coastguard Worker if (!match) {
3465*481dde66SAndroid Build Coastguard Worker mismatch_found = true;
3466*481dde66SAndroid Build Coastguard Worker break;
3467*481dde66SAndroid Build Coastguard Worker }
3468*481dde66SAndroid Build Coastguard Worker }
3469*481dde66SAndroid Build Coastguard Worker // If mismatch_found is true, 'exam_pos' is the index of the mismatch.
3470*481dde66SAndroid Build Coastguard Worker
3471*481dde66SAndroid Build Coastguard Worker // Find how many elements the actual container has. We avoid
3472*481dde66SAndroid Build Coastguard Worker // calling size() s.t. this code works for stream-like "containers"
3473*481dde66SAndroid Build Coastguard Worker // that don't define size().
3474*481dde66SAndroid Build Coastguard Worker size_t actual_count = exam_pos;
3475*481dde66SAndroid Build Coastguard Worker for (; it != stl_container.end(); ++it) {
3476*481dde66SAndroid Build Coastguard Worker ++actual_count;
3477*481dde66SAndroid Build Coastguard Worker }
3478*481dde66SAndroid Build Coastguard Worker
3479*481dde66SAndroid Build Coastguard Worker if (actual_count != count()) {
3480*481dde66SAndroid Build Coastguard Worker // The element count doesn't match. If the container is empty,
3481*481dde66SAndroid Build Coastguard Worker // there's no need to explain anything as Google Mock already
3482*481dde66SAndroid Build Coastguard Worker // prints the empty container. Otherwise we just need to show
3483*481dde66SAndroid Build Coastguard Worker // how many elements there actually are.
3484*481dde66SAndroid Build Coastguard Worker if (listener_interested && (actual_count != 0)) {
3485*481dde66SAndroid Build Coastguard Worker *listener << "which has " << Elements(actual_count);
3486*481dde66SAndroid Build Coastguard Worker }
3487*481dde66SAndroid Build Coastguard Worker return false;
3488*481dde66SAndroid Build Coastguard Worker }
3489*481dde66SAndroid Build Coastguard Worker
3490*481dde66SAndroid Build Coastguard Worker if (mismatch_found) {
3491*481dde66SAndroid Build Coastguard Worker // The element count matches, but the exam_pos-th element doesn't match.
3492*481dde66SAndroid Build Coastguard Worker if (listener_interested) {
3493*481dde66SAndroid Build Coastguard Worker *listener << "whose element #" << exam_pos << " doesn't match";
3494*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(explanations[exam_pos], listener->stream());
3495*481dde66SAndroid Build Coastguard Worker }
3496*481dde66SAndroid Build Coastguard Worker return false;
3497*481dde66SAndroid Build Coastguard Worker }
3498*481dde66SAndroid Build Coastguard Worker
3499*481dde66SAndroid Build Coastguard Worker // Every element matches its expectation. We need to explain why
3500*481dde66SAndroid Build Coastguard Worker // (the obvious ones can be skipped).
3501*481dde66SAndroid Build Coastguard Worker if (listener_interested) {
3502*481dde66SAndroid Build Coastguard Worker bool reason_printed = false;
3503*481dde66SAndroid Build Coastguard Worker for (size_t i = 0; i != count(); ++i) {
3504*481dde66SAndroid Build Coastguard Worker const std::string& s = explanations[i];
3505*481dde66SAndroid Build Coastguard Worker if (!s.empty()) {
3506*481dde66SAndroid Build Coastguard Worker if (reason_printed) {
3507*481dde66SAndroid Build Coastguard Worker *listener << ",\nand ";
3508*481dde66SAndroid Build Coastguard Worker }
3509*481dde66SAndroid Build Coastguard Worker *listener << "whose element #" << i << " matches, " << s;
3510*481dde66SAndroid Build Coastguard Worker reason_printed = true;
3511*481dde66SAndroid Build Coastguard Worker }
3512*481dde66SAndroid Build Coastguard Worker }
3513*481dde66SAndroid Build Coastguard Worker }
3514*481dde66SAndroid Build Coastguard Worker return true;
3515*481dde66SAndroid Build Coastguard Worker }
3516*481dde66SAndroid Build Coastguard Worker
3517*481dde66SAndroid Build Coastguard Worker private:
3518*481dde66SAndroid Build Coastguard Worker static Message Elements(size_t count) {
3519*481dde66SAndroid Build Coastguard Worker return Message() << count << (count == 1 ? " element" : " elements");
3520*481dde66SAndroid Build Coastguard Worker }
3521*481dde66SAndroid Build Coastguard Worker
3522*481dde66SAndroid Build Coastguard Worker size_t count() const { return matchers_.size(); }
3523*481dde66SAndroid Build Coastguard Worker
3524*481dde66SAndroid Build Coastguard Worker ::std::vector<Matcher<const Element&>> matchers_;
3525*481dde66SAndroid Build Coastguard Worker };
3526*481dde66SAndroid Build Coastguard Worker
3527*481dde66SAndroid Build Coastguard Worker // Connectivity matrix of (elements X matchers), in element-major order.
3528*481dde66SAndroid Build Coastguard Worker // Initially, there are no edges.
3529*481dde66SAndroid Build Coastguard Worker // Use NextGraph() to iterate over all possible edge configurations.
3530*481dde66SAndroid Build Coastguard Worker // Use Randomize() to generate a random edge configuration.
3531*481dde66SAndroid Build Coastguard Worker class GTEST_API_ MatchMatrix {
3532*481dde66SAndroid Build Coastguard Worker public:
3533*481dde66SAndroid Build Coastguard Worker MatchMatrix(size_t num_elements, size_t num_matchers)
3534*481dde66SAndroid Build Coastguard Worker : num_elements_(num_elements),
3535*481dde66SAndroid Build Coastguard Worker num_matchers_(num_matchers),
3536*481dde66SAndroid Build Coastguard Worker matched_(num_elements_ * num_matchers_, 0) {}
3537*481dde66SAndroid Build Coastguard Worker
3538*481dde66SAndroid Build Coastguard Worker size_t LhsSize() const { return num_elements_; }
3539*481dde66SAndroid Build Coastguard Worker size_t RhsSize() const { return num_matchers_; }
3540*481dde66SAndroid Build Coastguard Worker bool HasEdge(size_t ilhs, size_t irhs) const {
3541*481dde66SAndroid Build Coastguard Worker return matched_[SpaceIndex(ilhs, irhs)] == 1;
3542*481dde66SAndroid Build Coastguard Worker }
3543*481dde66SAndroid Build Coastguard Worker void SetEdge(size_t ilhs, size_t irhs, bool b) {
3544*481dde66SAndroid Build Coastguard Worker matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;
3545*481dde66SAndroid Build Coastguard Worker }
3546*481dde66SAndroid Build Coastguard Worker
3547*481dde66SAndroid Build Coastguard Worker // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
3548*481dde66SAndroid Build Coastguard Worker // adds 1 to that number; returns false if incrementing the graph left it
3549*481dde66SAndroid Build Coastguard Worker // empty.
3550*481dde66SAndroid Build Coastguard Worker bool NextGraph();
3551*481dde66SAndroid Build Coastguard Worker
3552*481dde66SAndroid Build Coastguard Worker void Randomize();
3553*481dde66SAndroid Build Coastguard Worker
3554*481dde66SAndroid Build Coastguard Worker std::string DebugString() const;
3555*481dde66SAndroid Build Coastguard Worker
3556*481dde66SAndroid Build Coastguard Worker private:
3557*481dde66SAndroid Build Coastguard Worker size_t SpaceIndex(size_t ilhs, size_t irhs) const {
3558*481dde66SAndroid Build Coastguard Worker return ilhs * num_matchers_ + irhs;
3559*481dde66SAndroid Build Coastguard Worker }
3560*481dde66SAndroid Build Coastguard Worker
3561*481dde66SAndroid Build Coastguard Worker size_t num_elements_;
3562*481dde66SAndroid Build Coastguard Worker size_t num_matchers_;
3563*481dde66SAndroid Build Coastguard Worker
3564*481dde66SAndroid Build Coastguard Worker // Each element is a char interpreted as bool. They are stored as a
3565*481dde66SAndroid Build Coastguard Worker // flattened array in lhs-major order, use 'SpaceIndex()' to translate
3566*481dde66SAndroid Build Coastguard Worker // a (ilhs, irhs) matrix coordinate into an offset.
3567*481dde66SAndroid Build Coastguard Worker ::std::vector<char> matched_;
3568*481dde66SAndroid Build Coastguard Worker };
3569*481dde66SAndroid Build Coastguard Worker
3570*481dde66SAndroid Build Coastguard Worker typedef ::std::pair<size_t, size_t> ElementMatcherPair;
3571*481dde66SAndroid Build Coastguard Worker typedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;
3572*481dde66SAndroid Build Coastguard Worker
3573*481dde66SAndroid Build Coastguard Worker // Returns a maximum bipartite matching for the specified graph 'g'.
3574*481dde66SAndroid Build Coastguard Worker // The matching is represented as a vector of {element, matcher} pairs.
3575*481dde66SAndroid Build Coastguard Worker GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchMatrix& g);
3576*481dde66SAndroid Build Coastguard Worker
3577*481dde66SAndroid Build Coastguard Worker struct UnorderedMatcherRequire {
3578*481dde66SAndroid Build Coastguard Worker enum Flags {
3579*481dde66SAndroid Build Coastguard Worker Superset = 1 << 0,
3580*481dde66SAndroid Build Coastguard Worker Subset = 1 << 1,
3581*481dde66SAndroid Build Coastguard Worker ExactMatch = Superset | Subset,
3582*481dde66SAndroid Build Coastguard Worker };
3583*481dde66SAndroid Build Coastguard Worker };
3584*481dde66SAndroid Build Coastguard Worker
3585*481dde66SAndroid Build Coastguard Worker // Untyped base class for implementing UnorderedElementsAre. By
3586*481dde66SAndroid Build Coastguard Worker // putting logic that's not specific to the element type here, we
3587*481dde66SAndroid Build Coastguard Worker // reduce binary bloat and increase compilation speed.
3588*481dde66SAndroid Build Coastguard Worker class GTEST_API_ UnorderedElementsAreMatcherImplBase {
3589*481dde66SAndroid Build Coastguard Worker protected:
3590*481dde66SAndroid Build Coastguard Worker explicit UnorderedElementsAreMatcherImplBase(
3591*481dde66SAndroid Build Coastguard Worker UnorderedMatcherRequire::Flags matcher_flags)
3592*481dde66SAndroid Build Coastguard Worker : match_flags_(matcher_flags) {}
3593*481dde66SAndroid Build Coastguard Worker
3594*481dde66SAndroid Build Coastguard Worker // A vector of matcher describers, one for each element matcher.
3595*481dde66SAndroid Build Coastguard Worker // Does not own the describers (and thus can be used only when the
3596*481dde66SAndroid Build Coastguard Worker // element matchers are alive).
3597*481dde66SAndroid Build Coastguard Worker typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;
3598*481dde66SAndroid Build Coastguard Worker
3599*481dde66SAndroid Build Coastguard Worker // Describes this UnorderedElementsAre matcher.
3600*481dde66SAndroid Build Coastguard Worker void DescribeToImpl(::std::ostream* os) const;
3601*481dde66SAndroid Build Coastguard Worker
3602*481dde66SAndroid Build Coastguard Worker // Describes the negation of this UnorderedElementsAre matcher.
3603*481dde66SAndroid Build Coastguard Worker void DescribeNegationToImpl(::std::ostream* os) const;
3604*481dde66SAndroid Build Coastguard Worker
3605*481dde66SAndroid Build Coastguard Worker bool VerifyMatchMatrix(const ::std::vector<std::string>& element_printouts,
3606*481dde66SAndroid Build Coastguard Worker const MatchMatrix& matrix,
3607*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const;
3608*481dde66SAndroid Build Coastguard Worker
3609*481dde66SAndroid Build Coastguard Worker bool FindPairing(const MatchMatrix& matrix,
3610*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const;
3611*481dde66SAndroid Build Coastguard Worker
3612*481dde66SAndroid Build Coastguard Worker MatcherDescriberVec& matcher_describers() { return matcher_describers_; }
3613*481dde66SAndroid Build Coastguard Worker
3614*481dde66SAndroid Build Coastguard Worker static Message Elements(size_t n) {
3615*481dde66SAndroid Build Coastguard Worker return Message() << n << " element" << (n == 1 ? "" : "s");
3616*481dde66SAndroid Build Coastguard Worker }
3617*481dde66SAndroid Build Coastguard Worker
3618*481dde66SAndroid Build Coastguard Worker UnorderedMatcherRequire::Flags match_flags() const { return match_flags_; }
3619*481dde66SAndroid Build Coastguard Worker
3620*481dde66SAndroid Build Coastguard Worker private:
3621*481dde66SAndroid Build Coastguard Worker UnorderedMatcherRequire::Flags match_flags_;
3622*481dde66SAndroid Build Coastguard Worker MatcherDescriberVec matcher_describers_;
3623*481dde66SAndroid Build Coastguard Worker };
3624*481dde66SAndroid Build Coastguard Worker
3625*481dde66SAndroid Build Coastguard Worker // Implements UnorderedElementsAre, UnorderedElementsAreArray, IsSubsetOf, and
3626*481dde66SAndroid Build Coastguard Worker // IsSupersetOf.
3627*481dde66SAndroid Build Coastguard Worker template <typename Container>
3628*481dde66SAndroid Build Coastguard Worker class UnorderedElementsAreMatcherImpl
3629*481dde66SAndroid Build Coastguard Worker : public MatcherInterface<Container>,
3630*481dde66SAndroid Build Coastguard Worker public UnorderedElementsAreMatcherImplBase {
3631*481dde66SAndroid Build Coastguard Worker public:
3632*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3633*481dde66SAndroid Build Coastguard Worker typedef internal::StlContainerView<RawContainer> View;
3634*481dde66SAndroid Build Coastguard Worker typedef typename View::type StlContainer;
3635*481dde66SAndroid Build Coastguard Worker typedef typename View::const_reference StlContainerReference;
3636*481dde66SAndroid Build Coastguard Worker typedef typename StlContainer::value_type Element;
3637*481dde66SAndroid Build Coastguard Worker
3638*481dde66SAndroid Build Coastguard Worker template <typename InputIter>
3639*481dde66SAndroid Build Coastguard Worker UnorderedElementsAreMatcherImpl(UnorderedMatcherRequire::Flags matcher_flags,
3640*481dde66SAndroid Build Coastguard Worker InputIter first, InputIter last)
3641*481dde66SAndroid Build Coastguard Worker : UnorderedElementsAreMatcherImplBase(matcher_flags) {
3642*481dde66SAndroid Build Coastguard Worker for (; first != last; ++first) {
3643*481dde66SAndroid Build Coastguard Worker matchers_.push_back(MatcherCast<const Element&>(*first));
3644*481dde66SAndroid Build Coastguard Worker }
3645*481dde66SAndroid Build Coastguard Worker for (const auto& m : matchers_) {
3646*481dde66SAndroid Build Coastguard Worker matcher_describers().push_back(m.GetDescriber());
3647*481dde66SAndroid Build Coastguard Worker }
3648*481dde66SAndroid Build Coastguard Worker }
3649*481dde66SAndroid Build Coastguard Worker
3650*481dde66SAndroid Build Coastguard Worker // Describes what this matcher does.
3651*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3652*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);
3653*481dde66SAndroid Build Coastguard Worker }
3654*481dde66SAndroid Build Coastguard Worker
3655*481dde66SAndroid Build Coastguard Worker // Describes what the negation of this matcher does.
3656*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3657*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);
3658*481dde66SAndroid Build Coastguard Worker }
3659*481dde66SAndroid Build Coastguard Worker
3660*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Container container,
3661*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
3662*481dde66SAndroid Build Coastguard Worker StlContainerReference stl_container = View::ConstReference(container);
3663*481dde66SAndroid Build Coastguard Worker ::std::vector<std::string> element_printouts;
3664*481dde66SAndroid Build Coastguard Worker MatchMatrix matrix =
3665*481dde66SAndroid Build Coastguard Worker AnalyzeElements(stl_container.begin(), stl_container.end(),
3666*481dde66SAndroid Build Coastguard Worker &element_printouts, listener);
3667*481dde66SAndroid Build Coastguard Worker
3668*481dde66SAndroid Build Coastguard Worker return VerifyMatchMatrix(element_printouts, matrix, listener) &&
3669*481dde66SAndroid Build Coastguard Worker FindPairing(matrix, listener);
3670*481dde66SAndroid Build Coastguard Worker }
3671*481dde66SAndroid Build Coastguard Worker
3672*481dde66SAndroid Build Coastguard Worker private:
3673*481dde66SAndroid Build Coastguard Worker template <typename ElementIter>
3674*481dde66SAndroid Build Coastguard Worker MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,
3675*481dde66SAndroid Build Coastguard Worker ::std::vector<std::string>* element_printouts,
3676*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const {
3677*481dde66SAndroid Build Coastguard Worker element_printouts->clear();
3678*481dde66SAndroid Build Coastguard Worker ::std::vector<char> did_match;
3679*481dde66SAndroid Build Coastguard Worker size_t num_elements = 0;
3680*481dde66SAndroid Build Coastguard Worker DummyMatchResultListener dummy;
3681*481dde66SAndroid Build Coastguard Worker for (; elem_first != elem_last; ++num_elements, ++elem_first) {
3682*481dde66SAndroid Build Coastguard Worker if (listener->IsInterested()) {
3683*481dde66SAndroid Build Coastguard Worker element_printouts->push_back(PrintToString(*elem_first));
3684*481dde66SAndroid Build Coastguard Worker }
3685*481dde66SAndroid Build Coastguard Worker for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3686*481dde66SAndroid Build Coastguard Worker did_match.push_back(
3687*481dde66SAndroid Build Coastguard Worker matchers_[irhs].MatchAndExplain(*elem_first, &dummy));
3688*481dde66SAndroid Build Coastguard Worker }
3689*481dde66SAndroid Build Coastguard Worker }
3690*481dde66SAndroid Build Coastguard Worker
3691*481dde66SAndroid Build Coastguard Worker MatchMatrix matrix(num_elements, matchers_.size());
3692*481dde66SAndroid Build Coastguard Worker ::std::vector<char>::const_iterator did_match_iter = did_match.begin();
3693*481dde66SAndroid Build Coastguard Worker for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {
3694*481dde66SAndroid Build Coastguard Worker for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3695*481dde66SAndroid Build Coastguard Worker matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);
3696*481dde66SAndroid Build Coastguard Worker }
3697*481dde66SAndroid Build Coastguard Worker }
3698*481dde66SAndroid Build Coastguard Worker return matrix;
3699*481dde66SAndroid Build Coastguard Worker }
3700*481dde66SAndroid Build Coastguard Worker
3701*481dde66SAndroid Build Coastguard Worker ::std::vector<Matcher<const Element&>> matchers_;
3702*481dde66SAndroid Build Coastguard Worker };
3703*481dde66SAndroid Build Coastguard Worker
3704*481dde66SAndroid Build Coastguard Worker // Functor for use in TransformTuple.
3705*481dde66SAndroid Build Coastguard Worker // Performs MatcherCast<Target> on an input argument of any type.
3706*481dde66SAndroid Build Coastguard Worker template <typename Target>
3707*481dde66SAndroid Build Coastguard Worker struct CastAndAppendTransform {
3708*481dde66SAndroid Build Coastguard Worker template <typename Arg>
3709*481dde66SAndroid Build Coastguard Worker Matcher<Target> operator()(const Arg& a) const {
3710*481dde66SAndroid Build Coastguard Worker return MatcherCast<Target>(a);
3711*481dde66SAndroid Build Coastguard Worker }
3712*481dde66SAndroid Build Coastguard Worker };
3713*481dde66SAndroid Build Coastguard Worker
3714*481dde66SAndroid Build Coastguard Worker // Implements UnorderedElementsAre.
3715*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple>
3716*481dde66SAndroid Build Coastguard Worker class UnorderedElementsAreMatcher {
3717*481dde66SAndroid Build Coastguard Worker public:
3718*481dde66SAndroid Build Coastguard Worker explicit UnorderedElementsAreMatcher(const MatcherTuple& args)
3719*481dde66SAndroid Build Coastguard Worker : matchers_(args) {}
3720*481dde66SAndroid Build Coastguard Worker
3721*481dde66SAndroid Build Coastguard Worker template <typename Container>
3722*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
3723*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3724*481dde66SAndroid Build Coastguard Worker typedef typename internal::StlContainerView<RawContainer>::type View;
3725*481dde66SAndroid Build Coastguard Worker typedef typename View::value_type Element;
3726*481dde66SAndroid Build Coastguard Worker typedef ::std::vector<Matcher<const Element&>> MatcherVec;
3727*481dde66SAndroid Build Coastguard Worker MatcherVec matchers;
3728*481dde66SAndroid Build Coastguard Worker matchers.reserve(::std::tuple_size<MatcherTuple>::value);
3729*481dde66SAndroid Build Coastguard Worker TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3730*481dde66SAndroid Build Coastguard Worker ::std::back_inserter(matchers));
3731*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(
3732*481dde66SAndroid Build Coastguard Worker new UnorderedElementsAreMatcherImpl<const Container&>(
3733*481dde66SAndroid Build Coastguard Worker UnorderedMatcherRequire::ExactMatch, matchers.begin(),
3734*481dde66SAndroid Build Coastguard Worker matchers.end()));
3735*481dde66SAndroid Build Coastguard Worker }
3736*481dde66SAndroid Build Coastguard Worker
3737*481dde66SAndroid Build Coastguard Worker private:
3738*481dde66SAndroid Build Coastguard Worker const MatcherTuple matchers_;
3739*481dde66SAndroid Build Coastguard Worker };
3740*481dde66SAndroid Build Coastguard Worker
3741*481dde66SAndroid Build Coastguard Worker // Implements ElementsAre.
3742*481dde66SAndroid Build Coastguard Worker template <typename MatcherTuple>
3743*481dde66SAndroid Build Coastguard Worker class ElementsAreMatcher {
3744*481dde66SAndroid Build Coastguard Worker public:
3745*481dde66SAndroid Build Coastguard Worker explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}
3746*481dde66SAndroid Build Coastguard Worker
3747*481dde66SAndroid Build Coastguard Worker template <typename Container>
3748*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
3749*481dde66SAndroid Build Coastguard Worker static_assert(
3750*481dde66SAndroid Build Coastguard Worker !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||
3751*481dde66SAndroid Build Coastguard Worker ::std::tuple_size<MatcherTuple>::value < 2,
3752*481dde66SAndroid Build Coastguard Worker "use UnorderedElementsAre with hash tables");
3753*481dde66SAndroid Build Coastguard Worker
3754*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3755*481dde66SAndroid Build Coastguard Worker typedef typename internal::StlContainerView<RawContainer>::type View;
3756*481dde66SAndroid Build Coastguard Worker typedef typename View::value_type Element;
3757*481dde66SAndroid Build Coastguard Worker typedef ::std::vector<Matcher<const Element&>> MatcherVec;
3758*481dde66SAndroid Build Coastguard Worker MatcherVec matchers;
3759*481dde66SAndroid Build Coastguard Worker matchers.reserve(::std::tuple_size<MatcherTuple>::value);
3760*481dde66SAndroid Build Coastguard Worker TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3761*481dde66SAndroid Build Coastguard Worker ::std::back_inserter(matchers));
3762*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(
3763*481dde66SAndroid Build Coastguard Worker matchers.begin(), matchers.end()));
3764*481dde66SAndroid Build Coastguard Worker }
3765*481dde66SAndroid Build Coastguard Worker
3766*481dde66SAndroid Build Coastguard Worker private:
3767*481dde66SAndroid Build Coastguard Worker const MatcherTuple matchers_;
3768*481dde66SAndroid Build Coastguard Worker };
3769*481dde66SAndroid Build Coastguard Worker
3770*481dde66SAndroid Build Coastguard Worker // Implements UnorderedElementsAreArray(), IsSubsetOf(), and IsSupersetOf().
3771*481dde66SAndroid Build Coastguard Worker template <typename T>
3772*481dde66SAndroid Build Coastguard Worker class UnorderedElementsAreArrayMatcher {
3773*481dde66SAndroid Build Coastguard Worker public:
3774*481dde66SAndroid Build Coastguard Worker template <typename Iter>
3775*481dde66SAndroid Build Coastguard Worker UnorderedElementsAreArrayMatcher(UnorderedMatcherRequire::Flags match_flags,
3776*481dde66SAndroid Build Coastguard Worker Iter first, Iter last)
3777*481dde66SAndroid Build Coastguard Worker : match_flags_(match_flags), matchers_(first, last) {}
3778*481dde66SAndroid Build Coastguard Worker
3779*481dde66SAndroid Build Coastguard Worker template <typename Container>
3780*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
3781*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(
3782*481dde66SAndroid Build Coastguard Worker new UnorderedElementsAreMatcherImpl<const Container&>(
3783*481dde66SAndroid Build Coastguard Worker match_flags_, matchers_.begin(), matchers_.end()));
3784*481dde66SAndroid Build Coastguard Worker }
3785*481dde66SAndroid Build Coastguard Worker
3786*481dde66SAndroid Build Coastguard Worker private:
3787*481dde66SAndroid Build Coastguard Worker UnorderedMatcherRequire::Flags match_flags_;
3788*481dde66SAndroid Build Coastguard Worker ::std::vector<T> matchers_;
3789*481dde66SAndroid Build Coastguard Worker };
3790*481dde66SAndroid Build Coastguard Worker
3791*481dde66SAndroid Build Coastguard Worker // Implements ElementsAreArray().
3792*481dde66SAndroid Build Coastguard Worker template <typename T>
3793*481dde66SAndroid Build Coastguard Worker class ElementsAreArrayMatcher {
3794*481dde66SAndroid Build Coastguard Worker public:
3795*481dde66SAndroid Build Coastguard Worker template <typename Iter>
3796*481dde66SAndroid Build Coastguard Worker ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
3797*481dde66SAndroid Build Coastguard Worker
3798*481dde66SAndroid Build Coastguard Worker template <typename Container>
3799*481dde66SAndroid Build Coastguard Worker operator Matcher<Container>() const {
3800*481dde66SAndroid Build Coastguard Worker static_assert(
3801*481dde66SAndroid Build Coastguard Worker !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,
3802*481dde66SAndroid Build Coastguard Worker "use UnorderedElementsAreArray with hash tables");
3803*481dde66SAndroid Build Coastguard Worker
3804*481dde66SAndroid Build Coastguard Worker return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(
3805*481dde66SAndroid Build Coastguard Worker matchers_.begin(), matchers_.end()));
3806*481dde66SAndroid Build Coastguard Worker }
3807*481dde66SAndroid Build Coastguard Worker
3808*481dde66SAndroid Build Coastguard Worker private:
3809*481dde66SAndroid Build Coastguard Worker const ::std::vector<T> matchers_;
3810*481dde66SAndroid Build Coastguard Worker };
3811*481dde66SAndroid Build Coastguard Worker
3812*481dde66SAndroid Build Coastguard Worker // Given a 2-tuple matcher tm of type Tuple2Matcher and a value second
3813*481dde66SAndroid Build Coastguard Worker // of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,
3814*481dde66SAndroid Build Coastguard Worker // second) is a polymorphic matcher that matches a value x if and only if
3815*481dde66SAndroid Build Coastguard Worker // tm matches tuple (x, second). Useful for implementing
3816*481dde66SAndroid Build Coastguard Worker // UnorderedPointwise() in terms of UnorderedElementsAreArray().
3817*481dde66SAndroid Build Coastguard Worker //
3818*481dde66SAndroid Build Coastguard Worker // BoundSecondMatcher is copyable and assignable, as we need to put
3819*481dde66SAndroid Build Coastguard Worker // instances of this class in a vector when implementing
3820*481dde66SAndroid Build Coastguard Worker // UnorderedPointwise().
3821*481dde66SAndroid Build Coastguard Worker template <typename Tuple2Matcher, typename Second>
3822*481dde66SAndroid Build Coastguard Worker class BoundSecondMatcher {
3823*481dde66SAndroid Build Coastguard Worker public:
3824*481dde66SAndroid Build Coastguard Worker BoundSecondMatcher(const Tuple2Matcher& tm, const Second& second)
3825*481dde66SAndroid Build Coastguard Worker : tuple2_matcher_(tm), second_value_(second) {}
3826*481dde66SAndroid Build Coastguard Worker
3827*481dde66SAndroid Build Coastguard Worker BoundSecondMatcher(const BoundSecondMatcher& other) = default;
3828*481dde66SAndroid Build Coastguard Worker
3829*481dde66SAndroid Build Coastguard Worker template <typename T>
3830*481dde66SAndroid Build Coastguard Worker operator Matcher<T>() const {
3831*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new Impl<T>(tuple2_matcher_, second_value_));
3832*481dde66SAndroid Build Coastguard Worker }
3833*481dde66SAndroid Build Coastguard Worker
3834*481dde66SAndroid Build Coastguard Worker // We have to define this for UnorderedPointwise() to compile in
3835*481dde66SAndroid Build Coastguard Worker // C++98 mode, as it puts BoundSecondMatcher instances in a vector,
3836*481dde66SAndroid Build Coastguard Worker // which requires the elements to be assignable in C++98. The
3837*481dde66SAndroid Build Coastguard Worker // compiler cannot generate the operator= for us, as Tuple2Matcher
3838*481dde66SAndroid Build Coastguard Worker // and Second may not be assignable.
3839*481dde66SAndroid Build Coastguard Worker //
3840*481dde66SAndroid Build Coastguard Worker // However, this should never be called, so the implementation just
3841*481dde66SAndroid Build Coastguard Worker // need to assert.
3842*481dde66SAndroid Build Coastguard Worker void operator=(const BoundSecondMatcher& /*rhs*/) {
3843*481dde66SAndroid Build Coastguard Worker GTEST_LOG_(FATAL) << "BoundSecondMatcher should never be assigned.";
3844*481dde66SAndroid Build Coastguard Worker }
3845*481dde66SAndroid Build Coastguard Worker
3846*481dde66SAndroid Build Coastguard Worker private:
3847*481dde66SAndroid Build Coastguard Worker template <typename T>
3848*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<T> {
3849*481dde66SAndroid Build Coastguard Worker public:
3850*481dde66SAndroid Build Coastguard Worker typedef ::std::tuple<T, Second> ArgTuple;
3851*481dde66SAndroid Build Coastguard Worker
3852*481dde66SAndroid Build Coastguard Worker Impl(const Tuple2Matcher& tm, const Second& second)
3853*481dde66SAndroid Build Coastguard Worker : mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),
3854*481dde66SAndroid Build Coastguard Worker second_value_(second) {}
3855*481dde66SAndroid Build Coastguard Worker
3856*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3857*481dde66SAndroid Build Coastguard Worker *os << "and ";
3858*481dde66SAndroid Build Coastguard Worker UniversalPrint(second_value_, os);
3859*481dde66SAndroid Build Coastguard Worker *os << " ";
3860*481dde66SAndroid Build Coastguard Worker mono_tuple2_matcher_.DescribeTo(os);
3861*481dde66SAndroid Build Coastguard Worker }
3862*481dde66SAndroid Build Coastguard Worker
3863*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T x, MatchResultListener* listener) const override {
3864*481dde66SAndroid Build Coastguard Worker return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),
3865*481dde66SAndroid Build Coastguard Worker listener);
3866*481dde66SAndroid Build Coastguard Worker }
3867*481dde66SAndroid Build Coastguard Worker
3868*481dde66SAndroid Build Coastguard Worker private:
3869*481dde66SAndroid Build Coastguard Worker const Matcher<const ArgTuple&> mono_tuple2_matcher_;
3870*481dde66SAndroid Build Coastguard Worker const Second second_value_;
3871*481dde66SAndroid Build Coastguard Worker };
3872*481dde66SAndroid Build Coastguard Worker
3873*481dde66SAndroid Build Coastguard Worker const Tuple2Matcher tuple2_matcher_;
3874*481dde66SAndroid Build Coastguard Worker const Second second_value_;
3875*481dde66SAndroid Build Coastguard Worker };
3876*481dde66SAndroid Build Coastguard Worker
3877*481dde66SAndroid Build Coastguard Worker // Given a 2-tuple matcher tm and a value second,
3878*481dde66SAndroid Build Coastguard Worker // MatcherBindSecond(tm, second) returns a matcher that matches a
3879*481dde66SAndroid Build Coastguard Worker // value x if and only if tm matches tuple (x, second). Useful for
3880*481dde66SAndroid Build Coastguard Worker // implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().
3881*481dde66SAndroid Build Coastguard Worker template <typename Tuple2Matcher, typename Second>
3882*481dde66SAndroid Build Coastguard Worker BoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(
3883*481dde66SAndroid Build Coastguard Worker const Tuple2Matcher& tm, const Second& second) {
3884*481dde66SAndroid Build Coastguard Worker return BoundSecondMatcher<Tuple2Matcher, Second>(tm, second);
3885*481dde66SAndroid Build Coastguard Worker }
3886*481dde66SAndroid Build Coastguard Worker
3887*481dde66SAndroid Build Coastguard Worker // Returns the description for a matcher defined using the MATCHER*()
3888*481dde66SAndroid Build Coastguard Worker // macro where the user-supplied description string is "", if
3889*481dde66SAndroid Build Coastguard Worker // 'negation' is false; otherwise returns the description of the
3890*481dde66SAndroid Build Coastguard Worker // negation of the matcher. 'param_values' contains a list of strings
3891*481dde66SAndroid Build Coastguard Worker // that are the print-out of the matcher's parameters.
3892*481dde66SAndroid Build Coastguard Worker GTEST_API_ std::string FormatMatcherDescription(
3893*481dde66SAndroid Build Coastguard Worker bool negation, const char* matcher_name,
3894*481dde66SAndroid Build Coastguard Worker const std::vector<const char*>& param_names, const Strings& param_values);
3895*481dde66SAndroid Build Coastguard Worker
3896*481dde66SAndroid Build Coastguard Worker // Implements a matcher that checks the value of a optional<> type variable.
3897*481dde66SAndroid Build Coastguard Worker template <typename ValueMatcher>
3898*481dde66SAndroid Build Coastguard Worker class OptionalMatcher {
3899*481dde66SAndroid Build Coastguard Worker public:
3900*481dde66SAndroid Build Coastguard Worker explicit OptionalMatcher(const ValueMatcher& value_matcher)
3901*481dde66SAndroid Build Coastguard Worker : value_matcher_(value_matcher) {}
3902*481dde66SAndroid Build Coastguard Worker
3903*481dde66SAndroid Build Coastguard Worker template <typename Optional>
3904*481dde66SAndroid Build Coastguard Worker operator Matcher<Optional>() const {
3905*481dde66SAndroid Build Coastguard Worker return Matcher<Optional>(new Impl<const Optional&>(value_matcher_));
3906*481dde66SAndroid Build Coastguard Worker }
3907*481dde66SAndroid Build Coastguard Worker
3908*481dde66SAndroid Build Coastguard Worker template <typename Optional>
3909*481dde66SAndroid Build Coastguard Worker class Impl : public MatcherInterface<Optional> {
3910*481dde66SAndroid Build Coastguard Worker public:
3911*481dde66SAndroid Build Coastguard Worker typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional) OptionalView;
3912*481dde66SAndroid Build Coastguard Worker typedef typename OptionalView::value_type ValueType;
3913*481dde66SAndroid Build Coastguard Worker explicit Impl(const ValueMatcher& value_matcher)
3914*481dde66SAndroid Build Coastguard Worker : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}
3915*481dde66SAndroid Build Coastguard Worker
3916*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
3917*481dde66SAndroid Build Coastguard Worker *os << "value ";
3918*481dde66SAndroid Build Coastguard Worker value_matcher_.DescribeTo(os);
3919*481dde66SAndroid Build Coastguard Worker }
3920*481dde66SAndroid Build Coastguard Worker
3921*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
3922*481dde66SAndroid Build Coastguard Worker *os << "value ";
3923*481dde66SAndroid Build Coastguard Worker value_matcher_.DescribeNegationTo(os);
3924*481dde66SAndroid Build Coastguard Worker }
3925*481dde66SAndroid Build Coastguard Worker
3926*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(Optional optional,
3927*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
3928*481dde66SAndroid Build Coastguard Worker if (!optional) {
3929*481dde66SAndroid Build Coastguard Worker *listener << "which is not engaged";
3930*481dde66SAndroid Build Coastguard Worker return false;
3931*481dde66SAndroid Build Coastguard Worker }
3932*481dde66SAndroid Build Coastguard Worker const ValueType& value = *optional;
3933*481dde66SAndroid Build Coastguard Worker StringMatchResultListener value_listener;
3934*481dde66SAndroid Build Coastguard Worker const bool match = value_matcher_.MatchAndExplain(value, &value_listener);
3935*481dde66SAndroid Build Coastguard Worker *listener << "whose value " << PrintToString(value)
3936*481dde66SAndroid Build Coastguard Worker << (match ? " matches" : " doesn't match");
3937*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(value_listener.str(), listener->stream());
3938*481dde66SAndroid Build Coastguard Worker return match;
3939*481dde66SAndroid Build Coastguard Worker }
3940*481dde66SAndroid Build Coastguard Worker
3941*481dde66SAndroid Build Coastguard Worker private:
3942*481dde66SAndroid Build Coastguard Worker const Matcher<ValueType> value_matcher_;
3943*481dde66SAndroid Build Coastguard Worker };
3944*481dde66SAndroid Build Coastguard Worker
3945*481dde66SAndroid Build Coastguard Worker private:
3946*481dde66SAndroid Build Coastguard Worker const ValueMatcher value_matcher_;
3947*481dde66SAndroid Build Coastguard Worker };
3948*481dde66SAndroid Build Coastguard Worker
3949*481dde66SAndroid Build Coastguard Worker namespace variant_matcher {
3950*481dde66SAndroid Build Coastguard Worker // Overloads to allow VariantMatcher to do proper ADL lookup.
3951*481dde66SAndroid Build Coastguard Worker template <typename T>
3952*481dde66SAndroid Build Coastguard Worker void holds_alternative() {}
3953*481dde66SAndroid Build Coastguard Worker template <typename T>
3954*481dde66SAndroid Build Coastguard Worker void get() {}
3955*481dde66SAndroid Build Coastguard Worker
3956*481dde66SAndroid Build Coastguard Worker // Implements a matcher that checks the value of a variant<> type variable.
3957*481dde66SAndroid Build Coastguard Worker template <typename T>
3958*481dde66SAndroid Build Coastguard Worker class VariantMatcher {
3959*481dde66SAndroid Build Coastguard Worker public:
3960*481dde66SAndroid Build Coastguard Worker explicit VariantMatcher(::testing::Matcher<const T&> matcher)
3961*481dde66SAndroid Build Coastguard Worker : matcher_(std::move(matcher)) {}
3962*481dde66SAndroid Build Coastguard Worker
3963*481dde66SAndroid Build Coastguard Worker template <typename Variant>
3964*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const Variant& value,
3965*481dde66SAndroid Build Coastguard Worker ::testing::MatchResultListener* listener) const {
3966*481dde66SAndroid Build Coastguard Worker using std::get;
3967*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
3968*481dde66SAndroid Build Coastguard Worker return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));
3969*481dde66SAndroid Build Coastguard Worker }
3970*481dde66SAndroid Build Coastguard Worker
3971*481dde66SAndroid Build Coastguard Worker if (!holds_alternative<T>(value)) {
3972*481dde66SAndroid Build Coastguard Worker *listener << "whose value is not of type '" << GetTypeName() << "'";
3973*481dde66SAndroid Build Coastguard Worker return false;
3974*481dde66SAndroid Build Coastguard Worker }
3975*481dde66SAndroid Build Coastguard Worker
3976*481dde66SAndroid Build Coastguard Worker const T& elem = get<T>(value);
3977*481dde66SAndroid Build Coastguard Worker StringMatchResultListener elem_listener;
3978*481dde66SAndroid Build Coastguard Worker const bool match = matcher_.MatchAndExplain(elem, &elem_listener);
3979*481dde66SAndroid Build Coastguard Worker *listener << "whose value " << PrintToString(elem)
3980*481dde66SAndroid Build Coastguard Worker << (match ? " matches" : " doesn't match");
3981*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(elem_listener.str(), listener->stream());
3982*481dde66SAndroid Build Coastguard Worker return match;
3983*481dde66SAndroid Build Coastguard Worker }
3984*481dde66SAndroid Build Coastguard Worker
3985*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const {
3986*481dde66SAndroid Build Coastguard Worker *os << "is a variant<> with value of type '" << GetTypeName()
3987*481dde66SAndroid Build Coastguard Worker << "' and the value ";
3988*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
3989*481dde66SAndroid Build Coastguard Worker }
3990*481dde66SAndroid Build Coastguard Worker
3991*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const {
3992*481dde66SAndroid Build Coastguard Worker *os << "is a variant<> with value of type other than '" << GetTypeName()
3993*481dde66SAndroid Build Coastguard Worker << "' or the value ";
3994*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
3995*481dde66SAndroid Build Coastguard Worker }
3996*481dde66SAndroid Build Coastguard Worker
3997*481dde66SAndroid Build Coastguard Worker private:
3998*481dde66SAndroid Build Coastguard Worker static std::string GetTypeName() {
3999*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
4000*481dde66SAndroid Build Coastguard Worker GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
4001*481dde66SAndroid Build Coastguard Worker return internal::GetTypeName<T>());
4002*481dde66SAndroid Build Coastguard Worker #endif
4003*481dde66SAndroid Build Coastguard Worker return "the element type";
4004*481dde66SAndroid Build Coastguard Worker }
4005*481dde66SAndroid Build Coastguard Worker
4006*481dde66SAndroid Build Coastguard Worker const ::testing::Matcher<const T&> matcher_;
4007*481dde66SAndroid Build Coastguard Worker };
4008*481dde66SAndroid Build Coastguard Worker
4009*481dde66SAndroid Build Coastguard Worker } // namespace variant_matcher
4010*481dde66SAndroid Build Coastguard Worker
4011*481dde66SAndroid Build Coastguard Worker namespace any_cast_matcher {
4012*481dde66SAndroid Build Coastguard Worker
4013*481dde66SAndroid Build Coastguard Worker // Overloads to allow AnyCastMatcher to do proper ADL lookup.
4014*481dde66SAndroid Build Coastguard Worker template <typename T>
4015*481dde66SAndroid Build Coastguard Worker void any_cast() {}
4016*481dde66SAndroid Build Coastguard Worker
4017*481dde66SAndroid Build Coastguard Worker // Implements a matcher that any_casts the value.
4018*481dde66SAndroid Build Coastguard Worker template <typename T>
4019*481dde66SAndroid Build Coastguard Worker class AnyCastMatcher {
4020*481dde66SAndroid Build Coastguard Worker public:
4021*481dde66SAndroid Build Coastguard Worker explicit AnyCastMatcher(const ::testing::Matcher<const T&>& matcher)
4022*481dde66SAndroid Build Coastguard Worker : matcher_(matcher) {}
4023*481dde66SAndroid Build Coastguard Worker
4024*481dde66SAndroid Build Coastguard Worker template <typename AnyType>
4025*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const AnyType& value,
4026*481dde66SAndroid Build Coastguard Worker ::testing::MatchResultListener* listener) const {
4027*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) {
4028*481dde66SAndroid Build Coastguard Worker const T* ptr = any_cast<T>(&value);
4029*481dde66SAndroid Build Coastguard Worker return ptr != nullptr && matcher_.Matches(*ptr);
4030*481dde66SAndroid Build Coastguard Worker }
4031*481dde66SAndroid Build Coastguard Worker
4032*481dde66SAndroid Build Coastguard Worker const T* elem = any_cast<T>(&value);
4033*481dde66SAndroid Build Coastguard Worker if (elem == nullptr) {
4034*481dde66SAndroid Build Coastguard Worker *listener << "whose value is not of type '" << GetTypeName() << "'";
4035*481dde66SAndroid Build Coastguard Worker return false;
4036*481dde66SAndroid Build Coastguard Worker }
4037*481dde66SAndroid Build Coastguard Worker
4038*481dde66SAndroid Build Coastguard Worker StringMatchResultListener elem_listener;
4039*481dde66SAndroid Build Coastguard Worker const bool match = matcher_.MatchAndExplain(*elem, &elem_listener);
4040*481dde66SAndroid Build Coastguard Worker *listener << "whose value " << PrintToString(*elem)
4041*481dde66SAndroid Build Coastguard Worker << (match ? " matches" : " doesn't match");
4042*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(elem_listener.str(), listener->stream());
4043*481dde66SAndroid Build Coastguard Worker return match;
4044*481dde66SAndroid Build Coastguard Worker }
4045*481dde66SAndroid Build Coastguard Worker
4046*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const {
4047*481dde66SAndroid Build Coastguard Worker *os << "is an 'any' type with value of type '" << GetTypeName()
4048*481dde66SAndroid Build Coastguard Worker << "' and the value ";
4049*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
4050*481dde66SAndroid Build Coastguard Worker }
4051*481dde66SAndroid Build Coastguard Worker
4052*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const {
4053*481dde66SAndroid Build Coastguard Worker *os << "is an 'any' type with value of type other than '" << GetTypeName()
4054*481dde66SAndroid Build Coastguard Worker << "' or the value ";
4055*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
4056*481dde66SAndroid Build Coastguard Worker }
4057*481dde66SAndroid Build Coastguard Worker
4058*481dde66SAndroid Build Coastguard Worker private:
4059*481dde66SAndroid Build Coastguard Worker static std::string GetTypeName() {
4060*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
4061*481dde66SAndroid Build Coastguard Worker GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
4062*481dde66SAndroid Build Coastguard Worker return internal::GetTypeName<T>());
4063*481dde66SAndroid Build Coastguard Worker #endif
4064*481dde66SAndroid Build Coastguard Worker return "the element type";
4065*481dde66SAndroid Build Coastguard Worker }
4066*481dde66SAndroid Build Coastguard Worker
4067*481dde66SAndroid Build Coastguard Worker const ::testing::Matcher<const T&> matcher_;
4068*481dde66SAndroid Build Coastguard Worker };
4069*481dde66SAndroid Build Coastguard Worker
4070*481dde66SAndroid Build Coastguard Worker } // namespace any_cast_matcher
4071*481dde66SAndroid Build Coastguard Worker
4072*481dde66SAndroid Build Coastguard Worker // Implements the Args() matcher.
4073*481dde66SAndroid Build Coastguard Worker template <class ArgsTuple, size_t... k>
4074*481dde66SAndroid Build Coastguard Worker class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
4075*481dde66SAndroid Build Coastguard Worker public:
4076*481dde66SAndroid Build Coastguard Worker using RawArgsTuple = typename std::decay<ArgsTuple>::type;
4077*481dde66SAndroid Build Coastguard Worker using SelectedArgs =
4078*481dde66SAndroid Build Coastguard Worker std::tuple<typename std::tuple_element<k, RawArgsTuple>::type...>;
4079*481dde66SAndroid Build Coastguard Worker using MonomorphicInnerMatcher = Matcher<const SelectedArgs&>;
4080*481dde66SAndroid Build Coastguard Worker
4081*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
4082*481dde66SAndroid Build Coastguard Worker explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
4083*481dde66SAndroid Build Coastguard Worker : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
4084*481dde66SAndroid Build Coastguard Worker
4085*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(ArgsTuple args,
4086*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) const override {
4087*481dde66SAndroid Build Coastguard Worker // Workaround spurious C4100 on MSVC<=15.7 when k is empty.
4088*481dde66SAndroid Build Coastguard Worker (void)args;
4089*481dde66SAndroid Build Coastguard Worker const SelectedArgs& selected_args =
4090*481dde66SAndroid Build Coastguard Worker std::forward_as_tuple(std::get<k>(args)...);
4091*481dde66SAndroid Build Coastguard Worker if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args);
4092*481dde66SAndroid Build Coastguard Worker
4093*481dde66SAndroid Build Coastguard Worker PrintIndices(listener->stream());
4094*481dde66SAndroid Build Coastguard Worker *listener << "are " << PrintToString(selected_args);
4095*481dde66SAndroid Build Coastguard Worker
4096*481dde66SAndroid Build Coastguard Worker StringMatchResultListener inner_listener;
4097*481dde66SAndroid Build Coastguard Worker const bool match =
4098*481dde66SAndroid Build Coastguard Worker inner_matcher_.MatchAndExplain(selected_args, &inner_listener);
4099*481dde66SAndroid Build Coastguard Worker PrintIfNotEmpty(inner_listener.str(), listener->stream());
4100*481dde66SAndroid Build Coastguard Worker return match;
4101*481dde66SAndroid Build Coastguard Worker }
4102*481dde66SAndroid Build Coastguard Worker
4103*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const override {
4104*481dde66SAndroid Build Coastguard Worker *os << "are a tuple ";
4105*481dde66SAndroid Build Coastguard Worker PrintIndices(os);
4106*481dde66SAndroid Build Coastguard Worker inner_matcher_.DescribeTo(os);
4107*481dde66SAndroid Build Coastguard Worker }
4108*481dde66SAndroid Build Coastguard Worker
4109*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* os) const override {
4110*481dde66SAndroid Build Coastguard Worker *os << "are a tuple ";
4111*481dde66SAndroid Build Coastguard Worker PrintIndices(os);
4112*481dde66SAndroid Build Coastguard Worker inner_matcher_.DescribeNegationTo(os);
4113*481dde66SAndroid Build Coastguard Worker }
4114*481dde66SAndroid Build Coastguard Worker
4115*481dde66SAndroid Build Coastguard Worker private:
4116*481dde66SAndroid Build Coastguard Worker // Prints the indices of the selected fields.
4117*481dde66SAndroid Build Coastguard Worker static void PrintIndices(::std::ostream* os) {
4118*481dde66SAndroid Build Coastguard Worker *os << "whose fields (";
4119*481dde66SAndroid Build Coastguard Worker const char* sep = "";
4120*481dde66SAndroid Build Coastguard Worker // Workaround spurious C4189 on MSVC<=15.7 when k is empty.
4121*481dde66SAndroid Build Coastguard Worker (void)sep;
4122*481dde66SAndroid Build Coastguard Worker // The static_cast to void is needed to silence Clang's -Wcomma warning.
4123*481dde66SAndroid Build Coastguard Worker // This pattern looks suspiciously like we may have mismatched parentheses
4124*481dde66SAndroid Build Coastguard Worker // and may have been trying to use the first operation of the comma operator
4125*481dde66SAndroid Build Coastguard Worker // as a member of the array, so Clang warns that we may have made a mistake.
4126*481dde66SAndroid Build Coastguard Worker const char* dummy[] = {
4127*481dde66SAndroid Build Coastguard Worker "", (static_cast<void>(*os << sep << "#" << k), sep = ", ")...};
4128*481dde66SAndroid Build Coastguard Worker (void)dummy;
4129*481dde66SAndroid Build Coastguard Worker *os << ") ";
4130*481dde66SAndroid Build Coastguard Worker }
4131*481dde66SAndroid Build Coastguard Worker
4132*481dde66SAndroid Build Coastguard Worker MonomorphicInnerMatcher inner_matcher_;
4133*481dde66SAndroid Build Coastguard Worker };
4134*481dde66SAndroid Build Coastguard Worker
4135*481dde66SAndroid Build Coastguard Worker template <class InnerMatcher, size_t... k>
4136*481dde66SAndroid Build Coastguard Worker class ArgsMatcher {
4137*481dde66SAndroid Build Coastguard Worker public:
4138*481dde66SAndroid Build Coastguard Worker explicit ArgsMatcher(InnerMatcher inner_matcher)
4139*481dde66SAndroid Build Coastguard Worker : inner_matcher_(std::move(inner_matcher)) {}
4140*481dde66SAndroid Build Coastguard Worker
4141*481dde66SAndroid Build Coastguard Worker template <typename ArgsTuple>
4142*481dde66SAndroid Build Coastguard Worker operator Matcher<ArgsTuple>() const { // NOLINT
4143*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k...>(inner_matcher_));
4144*481dde66SAndroid Build Coastguard Worker }
4145*481dde66SAndroid Build Coastguard Worker
4146*481dde66SAndroid Build Coastguard Worker private:
4147*481dde66SAndroid Build Coastguard Worker InnerMatcher inner_matcher_;
4148*481dde66SAndroid Build Coastguard Worker };
4149*481dde66SAndroid Build Coastguard Worker
4150*481dde66SAndroid Build Coastguard Worker } // namespace internal
4151*481dde66SAndroid Build Coastguard Worker
4152*481dde66SAndroid Build Coastguard Worker // ElementsAreArray(iterator_first, iterator_last)
4153*481dde66SAndroid Build Coastguard Worker // ElementsAreArray(pointer, count)
4154*481dde66SAndroid Build Coastguard Worker // ElementsAreArray(array)
4155*481dde66SAndroid Build Coastguard Worker // ElementsAreArray(container)
4156*481dde66SAndroid Build Coastguard Worker // ElementsAreArray({ e1, e2, ..., en })
4157*481dde66SAndroid Build Coastguard Worker //
4158*481dde66SAndroid Build Coastguard Worker // The ElementsAreArray() functions are like ElementsAre(...), except
4159*481dde66SAndroid Build Coastguard Worker // that they are given a homogeneous sequence rather than taking each
4160*481dde66SAndroid Build Coastguard Worker // element as a function argument. The sequence can be specified as an
4161*481dde66SAndroid Build Coastguard Worker // array, a pointer and count, a vector, an initializer list, or an
4162*481dde66SAndroid Build Coastguard Worker // STL iterator range. In each of these cases, the underlying sequence
4163*481dde66SAndroid Build Coastguard Worker // can be either a sequence of values or a sequence of matchers.
4164*481dde66SAndroid Build Coastguard Worker //
4165*481dde66SAndroid Build Coastguard Worker // All forms of ElementsAreArray() make a copy of the input matcher sequence.
4166*481dde66SAndroid Build Coastguard Worker
4167*481dde66SAndroid Build Coastguard Worker template <typename Iter>
4168*481dde66SAndroid Build Coastguard Worker inline internal::ElementsAreArrayMatcher<
4169*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
4170*481dde66SAndroid Build Coastguard Worker ElementsAreArray(Iter first, Iter last) {
4171*481dde66SAndroid Build Coastguard Worker typedef typename ::std::iterator_traits<Iter>::value_type T;
4172*481dde66SAndroid Build Coastguard Worker return internal::ElementsAreArrayMatcher<T>(first, last);
4173*481dde66SAndroid Build Coastguard Worker }
4174*481dde66SAndroid Build Coastguard Worker
4175*481dde66SAndroid Build Coastguard Worker template <typename T>
4176*481dde66SAndroid Build Coastguard Worker inline auto ElementsAreArray(const T* pointer, size_t count)
4177*481dde66SAndroid Build Coastguard Worker -> decltype(ElementsAreArray(pointer, pointer + count)) {
4178*481dde66SAndroid Build Coastguard Worker return ElementsAreArray(pointer, pointer + count);
4179*481dde66SAndroid Build Coastguard Worker }
4180*481dde66SAndroid Build Coastguard Worker
4181*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
4182*481dde66SAndroid Build Coastguard Worker inline auto ElementsAreArray(const T (&array)[N])
4183*481dde66SAndroid Build Coastguard Worker -> decltype(ElementsAreArray(array, N)) {
4184*481dde66SAndroid Build Coastguard Worker return ElementsAreArray(array, N);
4185*481dde66SAndroid Build Coastguard Worker }
4186*481dde66SAndroid Build Coastguard Worker
4187*481dde66SAndroid Build Coastguard Worker template <typename Container>
4188*481dde66SAndroid Build Coastguard Worker inline auto ElementsAreArray(const Container& container)
4189*481dde66SAndroid Build Coastguard Worker -> decltype(ElementsAreArray(container.begin(), container.end())) {
4190*481dde66SAndroid Build Coastguard Worker return ElementsAreArray(container.begin(), container.end());
4191*481dde66SAndroid Build Coastguard Worker }
4192*481dde66SAndroid Build Coastguard Worker
4193*481dde66SAndroid Build Coastguard Worker template <typename T>
4194*481dde66SAndroid Build Coastguard Worker inline auto ElementsAreArray(::std::initializer_list<T> xs)
4195*481dde66SAndroid Build Coastguard Worker -> decltype(ElementsAreArray(xs.begin(), xs.end())) {
4196*481dde66SAndroid Build Coastguard Worker return ElementsAreArray(xs.begin(), xs.end());
4197*481dde66SAndroid Build Coastguard Worker }
4198*481dde66SAndroid Build Coastguard Worker
4199*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray(iterator_first, iterator_last)
4200*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray(pointer, count)
4201*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray(array)
4202*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray(container)
4203*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray({ e1, e2, ..., en })
4204*481dde66SAndroid Build Coastguard Worker //
4205*481dde66SAndroid Build Coastguard Worker // UnorderedElementsAreArray() verifies that a bijective mapping onto a
4206*481dde66SAndroid Build Coastguard Worker // collection of matchers exists.
4207*481dde66SAndroid Build Coastguard Worker //
4208*481dde66SAndroid Build Coastguard Worker // The matchers can be specified as an array, a pointer and count, a container,
4209*481dde66SAndroid Build Coastguard Worker // an initializer list, or an STL iterator range. In each of these cases, the
4210*481dde66SAndroid Build Coastguard Worker // underlying matchers can be either values or matchers.
4211*481dde66SAndroid Build Coastguard Worker
4212*481dde66SAndroid Build Coastguard Worker template <typename Iter>
4213*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4214*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
4215*481dde66SAndroid Build Coastguard Worker UnorderedElementsAreArray(Iter first, Iter last) {
4216*481dde66SAndroid Build Coastguard Worker typedef typename ::std::iterator_traits<Iter>::value_type T;
4217*481dde66SAndroid Build Coastguard Worker return internal::UnorderedElementsAreArrayMatcher<T>(
4218*481dde66SAndroid Build Coastguard Worker internal::UnorderedMatcherRequire::ExactMatch, first, last);
4219*481dde66SAndroid Build Coastguard Worker }
4220*481dde66SAndroid Build Coastguard Worker
4221*481dde66SAndroid Build Coastguard Worker template <typename T>
4222*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> UnorderedElementsAreArray(
4223*481dde66SAndroid Build Coastguard Worker const T* pointer, size_t count) {
4224*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreArray(pointer, pointer + count);
4225*481dde66SAndroid Build Coastguard Worker }
4226*481dde66SAndroid Build Coastguard Worker
4227*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
4228*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> UnorderedElementsAreArray(
4229*481dde66SAndroid Build Coastguard Worker const T (&array)[N]) {
4230*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreArray(array, N);
4231*481dde66SAndroid Build Coastguard Worker }
4232*481dde66SAndroid Build Coastguard Worker
4233*481dde66SAndroid Build Coastguard Worker template <typename Container>
4234*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4235*481dde66SAndroid Build Coastguard Worker typename Container::value_type>
4236*481dde66SAndroid Build Coastguard Worker UnorderedElementsAreArray(const Container& container) {
4237*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreArray(container.begin(), container.end());
4238*481dde66SAndroid Build Coastguard Worker }
4239*481dde66SAndroid Build Coastguard Worker
4240*481dde66SAndroid Build Coastguard Worker template <typename T>
4241*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> UnorderedElementsAreArray(
4242*481dde66SAndroid Build Coastguard Worker ::std::initializer_list<T> xs) {
4243*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreArray(xs.begin(), xs.end());
4244*481dde66SAndroid Build Coastguard Worker }
4245*481dde66SAndroid Build Coastguard Worker
4246*481dde66SAndroid Build Coastguard Worker // _ is a matcher that matches anything of any type.
4247*481dde66SAndroid Build Coastguard Worker //
4248*481dde66SAndroid Build Coastguard Worker // This definition is fine as:
4249*481dde66SAndroid Build Coastguard Worker //
4250*481dde66SAndroid Build Coastguard Worker // 1. The C++ standard permits using the name _ in a namespace that
4251*481dde66SAndroid Build Coastguard Worker // is not the global namespace or ::std.
4252*481dde66SAndroid Build Coastguard Worker // 2. The AnythingMatcher class has no data member or constructor,
4253*481dde66SAndroid Build Coastguard Worker // so it's OK to create global variables of this type.
4254*481dde66SAndroid Build Coastguard Worker // 3. c-style has approved of using _ in this case.
4255*481dde66SAndroid Build Coastguard Worker const internal::AnythingMatcher _ = {};
4256*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any value of the given type T.
4257*481dde66SAndroid Build Coastguard Worker template <typename T>
4258*481dde66SAndroid Build Coastguard Worker inline Matcher<T> A() {
4259*481dde66SAndroid Build Coastguard Worker return _;
4260*481dde66SAndroid Build Coastguard Worker }
4261*481dde66SAndroid Build Coastguard Worker
4262*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any value of the given type T.
4263*481dde66SAndroid Build Coastguard Worker template <typename T>
4264*481dde66SAndroid Build Coastguard Worker inline Matcher<T> An() {
4265*481dde66SAndroid Build Coastguard Worker return _;
4266*481dde66SAndroid Build Coastguard Worker }
4267*481dde66SAndroid Build Coastguard Worker
4268*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
4269*481dde66SAndroid Build Coastguard Worker Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(
4270*481dde66SAndroid Build Coastguard Worker const M& value, std::false_type /* convertible_to_matcher */,
4271*481dde66SAndroid Build Coastguard Worker std::false_type /* convertible_to_T */) {
4272*481dde66SAndroid Build Coastguard Worker return Eq(value);
4273*481dde66SAndroid Build Coastguard Worker }
4274*481dde66SAndroid Build Coastguard Worker
4275*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches any NULL pointer.
4276*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::IsNullMatcher> IsNull() {
4277*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::IsNullMatcher());
4278*481dde66SAndroid Build Coastguard Worker }
4279*481dde66SAndroid Build Coastguard Worker
4280*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches any non-NULL pointer.
4281*481dde66SAndroid Build Coastguard Worker // This is convenient as Not(NULL) doesn't compile (the compiler
4282*481dde66SAndroid Build Coastguard Worker // thinks that that expression is comparing a pointer with an integer).
4283*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::NotNullMatcher> NotNull() {
4284*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::NotNullMatcher());
4285*481dde66SAndroid Build Coastguard Worker }
4286*481dde66SAndroid Build Coastguard Worker
4287*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches any argument that
4288*481dde66SAndroid Build Coastguard Worker // references variable x.
4289*481dde66SAndroid Build Coastguard Worker template <typename T>
4290*481dde66SAndroid Build Coastguard Worker inline internal::RefMatcher<T&> Ref(T& x) { // NOLINT
4291*481dde66SAndroid Build Coastguard Worker return internal::RefMatcher<T&>(x);
4292*481dde66SAndroid Build Coastguard Worker }
4293*481dde66SAndroid Build Coastguard Worker
4294*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches any NaN floating point.
4295*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::IsNanMatcher> IsNan() {
4296*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::IsNanMatcher());
4297*481dde66SAndroid Build Coastguard Worker }
4298*481dde66SAndroid Build Coastguard Worker
4299*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any double argument approximately
4300*481dde66SAndroid Build Coastguard Worker // equal to rhs, where two NANs are considered unequal.
4301*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {
4302*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<double>(rhs, false);
4303*481dde66SAndroid Build Coastguard Worker }
4304*481dde66SAndroid Build Coastguard Worker
4305*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any double argument approximately
4306*481dde66SAndroid Build Coastguard Worker // equal to rhs, including NaN values when rhs is NaN.
4307*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {
4308*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<double>(rhs, true);
4309*481dde66SAndroid Build Coastguard Worker }
4310*481dde66SAndroid Build Coastguard Worker
4311*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any double argument approximately equal to
4312*481dde66SAndroid Build Coastguard Worker // rhs, up to the specified max absolute error bound, where two NANs are
4313*481dde66SAndroid Build Coastguard Worker // considered unequal. The max absolute error bound must be non-negative.
4314*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<double> DoubleNear(double rhs,
4315*481dde66SAndroid Build Coastguard Worker double max_abs_error) {
4316*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);
4317*481dde66SAndroid Build Coastguard Worker }
4318*481dde66SAndroid Build Coastguard Worker
4319*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any double argument approximately equal to
4320*481dde66SAndroid Build Coastguard Worker // rhs, up to the specified max absolute error bound, including NaN values when
4321*481dde66SAndroid Build Coastguard Worker // rhs is NaN. The max absolute error bound must be non-negative.
4322*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(
4323*481dde66SAndroid Build Coastguard Worker double rhs, double max_abs_error) {
4324*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);
4325*481dde66SAndroid Build Coastguard Worker }
4326*481dde66SAndroid Build Coastguard Worker
4327*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any float argument approximately
4328*481dde66SAndroid Build Coastguard Worker // equal to rhs, where two NANs are considered unequal.
4329*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<float> FloatEq(float rhs) {
4330*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<float>(rhs, false);
4331*481dde66SAndroid Build Coastguard Worker }
4332*481dde66SAndroid Build Coastguard Worker
4333*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any float argument approximately
4334*481dde66SAndroid Build Coastguard Worker // equal to rhs, including NaN values when rhs is NaN.
4335*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {
4336*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<float>(rhs, true);
4337*481dde66SAndroid Build Coastguard Worker }
4338*481dde66SAndroid Build Coastguard Worker
4339*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any float argument approximately equal to
4340*481dde66SAndroid Build Coastguard Worker // rhs, up to the specified max absolute error bound, where two NANs are
4341*481dde66SAndroid Build Coastguard Worker // considered unequal. The max absolute error bound must be non-negative.
4342*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<float> FloatNear(float rhs,
4343*481dde66SAndroid Build Coastguard Worker float max_abs_error) {
4344*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);
4345*481dde66SAndroid Build Coastguard Worker }
4346*481dde66SAndroid Build Coastguard Worker
4347*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any float argument approximately equal to
4348*481dde66SAndroid Build Coastguard Worker // rhs, up to the specified max absolute error bound, including NaN values when
4349*481dde66SAndroid Build Coastguard Worker // rhs is NaN. The max absolute error bound must be non-negative.
4350*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(
4351*481dde66SAndroid Build Coastguard Worker float rhs, float max_abs_error) {
4352*481dde66SAndroid Build Coastguard Worker return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);
4353*481dde66SAndroid Build Coastguard Worker }
4354*481dde66SAndroid Build Coastguard Worker
4355*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches a pointer (raw or smart) that points
4356*481dde66SAndroid Build Coastguard Worker // to a value that matches inner_matcher.
4357*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
4358*481dde66SAndroid Build Coastguard Worker inline internal::PointeeMatcher<InnerMatcher> Pointee(
4359*481dde66SAndroid Build Coastguard Worker const InnerMatcher& inner_matcher) {
4360*481dde66SAndroid Build Coastguard Worker return internal::PointeeMatcher<InnerMatcher>(inner_matcher);
4361*481dde66SAndroid Build Coastguard Worker }
4362*481dde66SAndroid Build Coastguard Worker
4363*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
4364*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches a pointer or reference that matches
4365*481dde66SAndroid Build Coastguard Worker // inner_matcher when dynamic_cast<To> is applied.
4366*481dde66SAndroid Build Coastguard Worker // The result of dynamic_cast<To> is forwarded to the inner matcher.
4367*481dde66SAndroid Build Coastguard Worker // If To is a pointer and the cast fails, the inner matcher will receive NULL.
4368*481dde66SAndroid Build Coastguard Worker // If To is a reference and the cast fails, this matcher returns false
4369*481dde66SAndroid Build Coastguard Worker // immediately.
4370*481dde66SAndroid Build Coastguard Worker template <typename To>
4371*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::WhenDynamicCastToMatcher<To>>
4372*481dde66SAndroid Build Coastguard Worker WhenDynamicCastTo(const Matcher<To>& inner_matcher) {
4373*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4374*481dde66SAndroid Build Coastguard Worker internal::WhenDynamicCastToMatcher<To>(inner_matcher));
4375*481dde66SAndroid Build Coastguard Worker }
4376*481dde66SAndroid Build Coastguard Worker #endif // GTEST_HAS_RTTI
4377*481dde66SAndroid Build Coastguard Worker
4378*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches an object whose given field matches
4379*481dde66SAndroid Build Coastguard Worker // 'matcher'. For example,
4380*481dde66SAndroid Build Coastguard Worker // Field(&Foo::number, Ge(5))
4381*481dde66SAndroid Build Coastguard Worker // matches a Foo object x if and only if x.number >= 5.
4382*481dde66SAndroid Build Coastguard Worker template <typename Class, typename FieldType, typename FieldMatcher>
4383*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType>> Field(
4384*481dde66SAndroid Build Coastguard Worker FieldType Class::*field, const FieldMatcher& matcher) {
4385*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(
4386*481dde66SAndroid Build Coastguard Worker field, MatcherCast<const FieldType&>(matcher)));
4387*481dde66SAndroid Build Coastguard Worker // The call to MatcherCast() is required for supporting inner
4388*481dde66SAndroid Build Coastguard Worker // matchers of compatible types. For example, it allows
4389*481dde66SAndroid Build Coastguard Worker // Field(&Foo::bar, m)
4390*481dde66SAndroid Build Coastguard Worker // to compile where bar is an int32 and m is a matcher for int64.
4391*481dde66SAndroid Build Coastguard Worker }
4392*481dde66SAndroid Build Coastguard Worker
4393*481dde66SAndroid Build Coastguard Worker // Same as Field() but also takes the name of the field to provide better error
4394*481dde66SAndroid Build Coastguard Worker // messages.
4395*481dde66SAndroid Build Coastguard Worker template <typename Class, typename FieldType, typename FieldMatcher>
4396*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType>> Field(
4397*481dde66SAndroid Build Coastguard Worker const std::string& field_name, FieldType Class::*field,
4398*481dde66SAndroid Build Coastguard Worker const FieldMatcher& matcher) {
4399*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(
4400*481dde66SAndroid Build Coastguard Worker field_name, field, MatcherCast<const FieldType&>(matcher)));
4401*481dde66SAndroid Build Coastguard Worker }
4402*481dde66SAndroid Build Coastguard Worker
4403*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches an object whose given property
4404*481dde66SAndroid Build Coastguard Worker // matches 'matcher'. For example,
4405*481dde66SAndroid Build Coastguard Worker // Property(&Foo::str, StartsWith("hi"))
4406*481dde66SAndroid Build Coastguard Worker // matches a Foo object x if and only if x.str() starts with "hi".
4407*481dde66SAndroid Build Coastguard Worker template <typename Class, typename PropertyType, typename PropertyMatcher>
4408*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::PropertyMatcher<
4409*481dde66SAndroid Build Coastguard Worker Class, PropertyType, PropertyType (Class::*)() const>>
4410*481dde66SAndroid Build Coastguard Worker Property(PropertyType (Class::*property)() const,
4411*481dde66SAndroid Build Coastguard Worker const PropertyMatcher& matcher) {
4412*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4413*481dde66SAndroid Build Coastguard Worker internal::PropertyMatcher<Class, PropertyType,
4414*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*)() const>(
4415*481dde66SAndroid Build Coastguard Worker property, MatcherCast<const PropertyType&>(matcher)));
4416*481dde66SAndroid Build Coastguard Worker // The call to MatcherCast() is required for supporting inner
4417*481dde66SAndroid Build Coastguard Worker // matchers of compatible types. For example, it allows
4418*481dde66SAndroid Build Coastguard Worker // Property(&Foo::bar, m)
4419*481dde66SAndroid Build Coastguard Worker // to compile where bar() returns an int32 and m is a matcher for int64.
4420*481dde66SAndroid Build Coastguard Worker }
4421*481dde66SAndroid Build Coastguard Worker
4422*481dde66SAndroid Build Coastguard Worker // Same as Property() above, but also takes the name of the property to provide
4423*481dde66SAndroid Build Coastguard Worker // better error messages.
4424*481dde66SAndroid Build Coastguard Worker template <typename Class, typename PropertyType, typename PropertyMatcher>
4425*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::PropertyMatcher<
4426*481dde66SAndroid Build Coastguard Worker Class, PropertyType, PropertyType (Class::*)() const>>
4427*481dde66SAndroid Build Coastguard Worker Property(const std::string& property_name,
4428*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*property)() const,
4429*481dde66SAndroid Build Coastguard Worker const PropertyMatcher& matcher) {
4430*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4431*481dde66SAndroid Build Coastguard Worker internal::PropertyMatcher<Class, PropertyType,
4432*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*)() const>(
4433*481dde66SAndroid Build Coastguard Worker property_name, property, MatcherCast<const PropertyType&>(matcher)));
4434*481dde66SAndroid Build Coastguard Worker }
4435*481dde66SAndroid Build Coastguard Worker
4436*481dde66SAndroid Build Coastguard Worker // The same as above but for reference-qualified member functions.
4437*481dde66SAndroid Build Coastguard Worker template <typename Class, typename PropertyType, typename PropertyMatcher>
4438*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::PropertyMatcher<
4439*481dde66SAndroid Build Coastguard Worker Class, PropertyType, PropertyType (Class::*)() const&>>
4440*481dde66SAndroid Build Coastguard Worker Property(PropertyType (Class::*property)() const&,
4441*481dde66SAndroid Build Coastguard Worker const PropertyMatcher& matcher) {
4442*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4443*481dde66SAndroid Build Coastguard Worker internal::PropertyMatcher<Class, PropertyType,
4444*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*)() const&>(
4445*481dde66SAndroid Build Coastguard Worker property, MatcherCast<const PropertyType&>(matcher)));
4446*481dde66SAndroid Build Coastguard Worker }
4447*481dde66SAndroid Build Coastguard Worker
4448*481dde66SAndroid Build Coastguard Worker // Three-argument form for reference-qualified member functions.
4449*481dde66SAndroid Build Coastguard Worker template <typename Class, typename PropertyType, typename PropertyMatcher>
4450*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::PropertyMatcher<
4451*481dde66SAndroid Build Coastguard Worker Class, PropertyType, PropertyType (Class::*)() const&>>
4452*481dde66SAndroid Build Coastguard Worker Property(const std::string& property_name,
4453*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*property)() const&,
4454*481dde66SAndroid Build Coastguard Worker const PropertyMatcher& matcher) {
4455*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4456*481dde66SAndroid Build Coastguard Worker internal::PropertyMatcher<Class, PropertyType,
4457*481dde66SAndroid Build Coastguard Worker PropertyType (Class::*)() const&>(
4458*481dde66SAndroid Build Coastguard Worker property_name, property, MatcherCast<const PropertyType&>(matcher)));
4459*481dde66SAndroid Build Coastguard Worker }
4460*481dde66SAndroid Build Coastguard Worker
4461*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches an object if and only if the result of
4462*481dde66SAndroid Build Coastguard Worker // applying a callable to x matches 'matcher'. For example,
4463*481dde66SAndroid Build Coastguard Worker // ResultOf(f, StartsWith("hi"))
4464*481dde66SAndroid Build Coastguard Worker // matches a Foo object x if and only if f(x) starts with "hi".
4465*481dde66SAndroid Build Coastguard Worker // `callable` parameter can be a function, function pointer, or a functor. It is
4466*481dde66SAndroid Build Coastguard Worker // required to keep no state affecting the results of the calls on it and make
4467*481dde66SAndroid Build Coastguard Worker // no assumptions about how many calls will be made. Any state it keeps must be
4468*481dde66SAndroid Build Coastguard Worker // protected from the concurrent access.
4469*481dde66SAndroid Build Coastguard Worker template <typename Callable, typename InnerMatcher>
4470*481dde66SAndroid Build Coastguard Worker internal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(
4471*481dde66SAndroid Build Coastguard Worker Callable callable, InnerMatcher matcher) {
4472*481dde66SAndroid Build Coastguard Worker return internal::ResultOfMatcher<Callable, InnerMatcher>(std::move(callable),
4473*481dde66SAndroid Build Coastguard Worker std::move(matcher));
4474*481dde66SAndroid Build Coastguard Worker }
4475*481dde66SAndroid Build Coastguard Worker
4476*481dde66SAndroid Build Coastguard Worker // Same as ResultOf() above, but also takes a description of the `callable`
4477*481dde66SAndroid Build Coastguard Worker // result to provide better error messages.
4478*481dde66SAndroid Build Coastguard Worker template <typename Callable, typename InnerMatcher>
4479*481dde66SAndroid Build Coastguard Worker internal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(
4480*481dde66SAndroid Build Coastguard Worker const std::string& result_description, Callable callable,
4481*481dde66SAndroid Build Coastguard Worker InnerMatcher matcher) {
4482*481dde66SAndroid Build Coastguard Worker return internal::ResultOfMatcher<Callable, InnerMatcher>(
4483*481dde66SAndroid Build Coastguard Worker result_description, std::move(callable), std::move(matcher));
4484*481dde66SAndroid Build Coastguard Worker }
4485*481dde66SAndroid Build Coastguard Worker
4486*481dde66SAndroid Build Coastguard Worker // String matchers.
4487*481dde66SAndroid Build Coastguard Worker
4488*481dde66SAndroid Build Coastguard Worker // Matches a string equal to str.
4489*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4490*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::StrEqualityMatcher<std::string>> StrEq(
4491*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& str) {
4492*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4493*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::string>(std::string(str), true, true));
4494*481dde66SAndroid Build Coastguard Worker }
4495*481dde66SAndroid Build Coastguard Worker
4496*481dde66SAndroid Build Coastguard Worker // Matches a string not equal to str.
4497*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4498*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::StrEqualityMatcher<std::string>> StrNe(
4499*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& str) {
4500*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4501*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::string>(std::string(str), false, true));
4502*481dde66SAndroid Build Coastguard Worker }
4503*481dde66SAndroid Build Coastguard Worker
4504*481dde66SAndroid Build Coastguard Worker // Matches a string equal to str, ignoring case.
4505*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4506*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::StrEqualityMatcher<std::string>> StrCaseEq(
4507*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& str) {
4508*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4509*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::string>(std::string(str), true, false));
4510*481dde66SAndroid Build Coastguard Worker }
4511*481dde66SAndroid Build Coastguard Worker
4512*481dde66SAndroid Build Coastguard Worker // Matches a string not equal to str, ignoring case.
4513*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4514*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::StrEqualityMatcher<std::string>> StrCaseNe(
4515*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& str) {
4516*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::StrEqualityMatcher<std::string>(
4517*481dde66SAndroid Build Coastguard Worker std::string(str), false, false));
4518*481dde66SAndroid Build Coastguard Worker }
4519*481dde66SAndroid Build Coastguard Worker
4520*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any string, std::string, or C string
4521*481dde66SAndroid Build Coastguard Worker // that contains the given substring.
4522*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4523*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::HasSubstrMatcher<std::string>> HasSubstr(
4524*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& substring) {
4525*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4526*481dde66SAndroid Build Coastguard Worker internal::HasSubstrMatcher<std::string>(std::string(substring)));
4527*481dde66SAndroid Build Coastguard Worker }
4528*481dde66SAndroid Build Coastguard Worker
4529*481dde66SAndroid Build Coastguard Worker // Matches a string that starts with 'prefix' (case-sensitive).
4530*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4531*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::StartsWithMatcher<std::string>> StartsWith(
4532*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& prefix) {
4533*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4534*481dde66SAndroid Build Coastguard Worker internal::StartsWithMatcher<std::string>(std::string(prefix)));
4535*481dde66SAndroid Build Coastguard Worker }
4536*481dde66SAndroid Build Coastguard Worker
4537*481dde66SAndroid Build Coastguard Worker // Matches a string that ends with 'suffix' (case-sensitive).
4538*481dde66SAndroid Build Coastguard Worker template <typename T = std::string>
4539*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::EndsWithMatcher<std::string>> EndsWith(
4540*481dde66SAndroid Build Coastguard Worker const internal::StringLike<T>& suffix) {
4541*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4542*481dde66SAndroid Build Coastguard Worker internal::EndsWithMatcher<std::string>(std::string(suffix)));
4543*481dde66SAndroid Build Coastguard Worker }
4544*481dde66SAndroid Build Coastguard Worker
4545*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STD_WSTRING
4546*481dde66SAndroid Build Coastguard Worker // Wide string matchers.
4547*481dde66SAndroid Build Coastguard Worker
4548*481dde66SAndroid Build Coastguard Worker // Matches a string equal to str.
4549*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrEq(
4550*481dde66SAndroid Build Coastguard Worker const std::wstring& str) {
4551*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4552*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::wstring>(str, true, true));
4553*481dde66SAndroid Build Coastguard Worker }
4554*481dde66SAndroid Build Coastguard Worker
4555*481dde66SAndroid Build Coastguard Worker // Matches a string not equal to str.
4556*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrNe(
4557*481dde66SAndroid Build Coastguard Worker const std::wstring& str) {
4558*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4559*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::wstring>(str, false, true));
4560*481dde66SAndroid Build Coastguard Worker }
4561*481dde66SAndroid Build Coastguard Worker
4562*481dde66SAndroid Build Coastguard Worker // Matches a string equal to str, ignoring case.
4563*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrCaseEq(
4564*481dde66SAndroid Build Coastguard Worker const std::wstring& str) {
4565*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4566*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::wstring>(str, true, false));
4567*481dde66SAndroid Build Coastguard Worker }
4568*481dde66SAndroid Build Coastguard Worker
4569*481dde66SAndroid Build Coastguard Worker // Matches a string not equal to str, ignoring case.
4570*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrCaseNe(
4571*481dde66SAndroid Build Coastguard Worker const std::wstring& str) {
4572*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4573*481dde66SAndroid Build Coastguard Worker internal::StrEqualityMatcher<std::wstring>(str, false, false));
4574*481dde66SAndroid Build Coastguard Worker }
4575*481dde66SAndroid Build Coastguard Worker
4576*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any ::wstring, std::wstring, or C wide string
4577*481dde66SAndroid Build Coastguard Worker // that contains the given substring.
4578*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring>> HasSubstr(
4579*481dde66SAndroid Build Coastguard Worker const std::wstring& substring) {
4580*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4581*481dde66SAndroid Build Coastguard Worker internal::HasSubstrMatcher<std::wstring>(substring));
4582*481dde66SAndroid Build Coastguard Worker }
4583*481dde66SAndroid Build Coastguard Worker
4584*481dde66SAndroid Build Coastguard Worker // Matches a string that starts with 'prefix' (case-sensitive).
4585*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring>> StartsWith(
4586*481dde66SAndroid Build Coastguard Worker const std::wstring& prefix) {
4587*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4588*481dde66SAndroid Build Coastguard Worker internal::StartsWithMatcher<std::wstring>(prefix));
4589*481dde66SAndroid Build Coastguard Worker }
4590*481dde66SAndroid Build Coastguard Worker
4591*481dde66SAndroid Build Coastguard Worker // Matches a string that ends with 'suffix' (case-sensitive).
4592*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring>> EndsWith(
4593*481dde66SAndroid Build Coastguard Worker const std::wstring& suffix) {
4594*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
4595*481dde66SAndroid Build Coastguard Worker internal::EndsWithMatcher<std::wstring>(suffix));
4596*481dde66SAndroid Build Coastguard Worker }
4597*481dde66SAndroid Build Coastguard Worker
4598*481dde66SAndroid Build Coastguard Worker #endif // GTEST_HAS_STD_WSTRING
4599*481dde66SAndroid Build Coastguard Worker
4600*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4601*481dde66SAndroid Build Coastguard Worker // first field == the second field.
4602*481dde66SAndroid Build Coastguard Worker inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }
4603*481dde66SAndroid Build Coastguard Worker
4604*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4605*481dde66SAndroid Build Coastguard Worker // first field >= the second field.
4606*481dde66SAndroid Build Coastguard Worker inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }
4607*481dde66SAndroid Build Coastguard Worker
4608*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4609*481dde66SAndroid Build Coastguard Worker // first field > the second field.
4610*481dde66SAndroid Build Coastguard Worker inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }
4611*481dde66SAndroid Build Coastguard Worker
4612*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4613*481dde66SAndroid Build Coastguard Worker // first field <= the second field.
4614*481dde66SAndroid Build Coastguard Worker inline internal::Le2Matcher Le() { return internal::Le2Matcher(); }
4615*481dde66SAndroid Build Coastguard Worker
4616*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4617*481dde66SAndroid Build Coastguard Worker // first field < the second field.
4618*481dde66SAndroid Build Coastguard Worker inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
4619*481dde66SAndroid Build Coastguard Worker
4620*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where the
4621*481dde66SAndroid Build Coastguard Worker // first field != the second field.
4622*481dde66SAndroid Build Coastguard Worker inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
4623*481dde66SAndroid Build Coastguard Worker
4624*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4625*481dde66SAndroid Build Coastguard Worker // FloatEq(first field) matches the second field.
4626*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<float> FloatEq() {
4627*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<float>();
4628*481dde66SAndroid Build Coastguard Worker }
4629*481dde66SAndroid Build Coastguard Worker
4630*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4631*481dde66SAndroid Build Coastguard Worker // DoubleEq(first field) matches the second field.
4632*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<double> DoubleEq() {
4633*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<double>();
4634*481dde66SAndroid Build Coastguard Worker }
4635*481dde66SAndroid Build Coastguard Worker
4636*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4637*481dde66SAndroid Build Coastguard Worker // FloatEq(first field) matches the second field with NaN equality.
4638*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<float> NanSensitiveFloatEq() {
4639*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<float>(true);
4640*481dde66SAndroid Build Coastguard Worker }
4641*481dde66SAndroid Build Coastguard Worker
4642*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4643*481dde66SAndroid Build Coastguard Worker // DoubleEq(first field) matches the second field with NaN equality.
4644*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleEq() {
4645*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<double>(true);
4646*481dde66SAndroid Build Coastguard Worker }
4647*481dde66SAndroid Build Coastguard Worker
4648*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4649*481dde66SAndroid Build Coastguard Worker // FloatNear(first field, max_abs_error) matches the second field.
4650*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<float> FloatNear(float max_abs_error) {
4651*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<float>(max_abs_error);
4652*481dde66SAndroid Build Coastguard Worker }
4653*481dde66SAndroid Build Coastguard Worker
4654*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4655*481dde66SAndroid Build Coastguard Worker // DoubleNear(first field, max_abs_error) matches the second field.
4656*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<double> DoubleNear(double max_abs_error) {
4657*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<double>(max_abs_error);
4658*481dde66SAndroid Build Coastguard Worker }
4659*481dde66SAndroid Build Coastguard Worker
4660*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4661*481dde66SAndroid Build Coastguard Worker // FloatNear(first field, max_abs_error) matches the second field with NaN
4662*481dde66SAndroid Build Coastguard Worker // equality.
4663*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<float> NanSensitiveFloatNear(
4664*481dde66SAndroid Build Coastguard Worker float max_abs_error) {
4665*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<float>(max_abs_error, true);
4666*481dde66SAndroid Build Coastguard Worker }
4667*481dde66SAndroid Build Coastguard Worker
4668*481dde66SAndroid Build Coastguard Worker // Creates a polymorphic matcher that matches a 2-tuple where
4669*481dde66SAndroid Build Coastguard Worker // DoubleNear(first field, max_abs_error) matches the second field with NaN
4670*481dde66SAndroid Build Coastguard Worker // equality.
4671*481dde66SAndroid Build Coastguard Worker inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleNear(
4672*481dde66SAndroid Build Coastguard Worker double max_abs_error) {
4673*481dde66SAndroid Build Coastguard Worker return internal::FloatingEq2Matcher<double>(max_abs_error, true);
4674*481dde66SAndroid Build Coastguard Worker }
4675*481dde66SAndroid Build Coastguard Worker
4676*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches any value of type T that m doesn't
4677*481dde66SAndroid Build Coastguard Worker // match.
4678*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
4679*481dde66SAndroid Build Coastguard Worker inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {
4680*481dde66SAndroid Build Coastguard Worker return internal::NotMatcher<InnerMatcher>(m);
4681*481dde66SAndroid Build Coastguard Worker }
4682*481dde66SAndroid Build Coastguard Worker
4683*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches anything that satisfies the given
4684*481dde66SAndroid Build Coastguard Worker // predicate. The predicate can be any unary function or functor
4685*481dde66SAndroid Build Coastguard Worker // whose return type can be implicitly converted to bool.
4686*481dde66SAndroid Build Coastguard Worker template <typename Predicate>
4687*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<internal::TrulyMatcher<Predicate>> Truly(
4688*481dde66SAndroid Build Coastguard Worker Predicate pred) {
4689*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));
4690*481dde66SAndroid Build Coastguard Worker }
4691*481dde66SAndroid Build Coastguard Worker
4692*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches the container size. The container must
4693*481dde66SAndroid Build Coastguard Worker // support both size() and size_type which all STL-like containers provide.
4694*481dde66SAndroid Build Coastguard Worker // Note that the parameter 'size' can be a value of type size_type as well as
4695*481dde66SAndroid Build Coastguard Worker // matcher. For instance:
4696*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
4697*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
4698*481dde66SAndroid Build Coastguard Worker template <typename SizeMatcher>
4699*481dde66SAndroid Build Coastguard Worker inline internal::SizeIsMatcher<SizeMatcher> SizeIs(
4700*481dde66SAndroid Build Coastguard Worker const SizeMatcher& size_matcher) {
4701*481dde66SAndroid Build Coastguard Worker return internal::SizeIsMatcher<SizeMatcher>(size_matcher);
4702*481dde66SAndroid Build Coastguard Worker }
4703*481dde66SAndroid Build Coastguard Worker
4704*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches the distance between the container's begin()
4705*481dde66SAndroid Build Coastguard Worker // iterator and its end() iterator, i.e. the size of the container. This matcher
4706*481dde66SAndroid Build Coastguard Worker // can be used instead of SizeIs with containers such as std::forward_list which
4707*481dde66SAndroid Build Coastguard Worker // do not implement size(). The container must provide const_iterator (with
4708*481dde66SAndroid Build Coastguard Worker // valid iterator_traits), begin() and end().
4709*481dde66SAndroid Build Coastguard Worker template <typename DistanceMatcher>
4710*481dde66SAndroid Build Coastguard Worker inline internal::BeginEndDistanceIsMatcher<DistanceMatcher> BeginEndDistanceIs(
4711*481dde66SAndroid Build Coastguard Worker const DistanceMatcher& distance_matcher) {
4712*481dde66SAndroid Build Coastguard Worker return internal::BeginEndDistanceIsMatcher<DistanceMatcher>(distance_matcher);
4713*481dde66SAndroid Build Coastguard Worker }
4714*481dde66SAndroid Build Coastguard Worker
4715*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches an equal container.
4716*481dde66SAndroid Build Coastguard Worker // This matcher behaves like Eq(), but in the event of mismatch lists the
4717*481dde66SAndroid Build Coastguard Worker // values that are included in one container but not the other. (Duplicate
4718*481dde66SAndroid Build Coastguard Worker // values and order differences are not explained.)
4719*481dde66SAndroid Build Coastguard Worker template <typename Container>
4720*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<
4721*481dde66SAndroid Build Coastguard Worker internal::ContainerEqMatcher<typename std::remove_const<Container>::type>>
4722*481dde66SAndroid Build Coastguard Worker ContainerEq(const Container& rhs) {
4723*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::ContainerEqMatcher<Container>(rhs));
4724*481dde66SAndroid Build Coastguard Worker }
4725*481dde66SAndroid Build Coastguard Worker
4726*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches a container that, when sorted using
4727*481dde66SAndroid Build Coastguard Worker // the given comparator, matches container_matcher.
4728*481dde66SAndroid Build Coastguard Worker template <typename Comparator, typename ContainerMatcher>
4729*481dde66SAndroid Build Coastguard Worker inline internal::WhenSortedByMatcher<Comparator, ContainerMatcher> WhenSortedBy(
4730*481dde66SAndroid Build Coastguard Worker const Comparator& comparator, const ContainerMatcher& container_matcher) {
4731*481dde66SAndroid Build Coastguard Worker return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(
4732*481dde66SAndroid Build Coastguard Worker comparator, container_matcher);
4733*481dde66SAndroid Build Coastguard Worker }
4734*481dde66SAndroid Build Coastguard Worker
4735*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches a container that, when sorted using
4736*481dde66SAndroid Build Coastguard Worker // the < operator, matches container_matcher.
4737*481dde66SAndroid Build Coastguard Worker template <typename ContainerMatcher>
4738*481dde66SAndroid Build Coastguard Worker inline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>
4739*481dde66SAndroid Build Coastguard Worker WhenSorted(const ContainerMatcher& container_matcher) {
4740*481dde66SAndroid Build Coastguard Worker return internal::WhenSortedByMatcher<internal::LessComparator,
4741*481dde66SAndroid Build Coastguard Worker ContainerMatcher>(
4742*481dde66SAndroid Build Coastguard Worker internal::LessComparator(), container_matcher);
4743*481dde66SAndroid Build Coastguard Worker }
4744*481dde66SAndroid Build Coastguard Worker
4745*481dde66SAndroid Build Coastguard Worker // Matches an STL-style container or a native array that contains the
4746*481dde66SAndroid Build Coastguard Worker // same number of elements as in rhs, where its i-th element and rhs's
4747*481dde66SAndroid Build Coastguard Worker // i-th element (as a pair) satisfy the given pair matcher, for all i.
4748*481dde66SAndroid Build Coastguard Worker // TupleMatcher must be able to be safely cast to Matcher<std::tuple<const
4749*481dde66SAndroid Build Coastguard Worker // T1&, const T2&> >, where T1 and T2 are the types of elements in the
4750*481dde66SAndroid Build Coastguard Worker // LHS container and the RHS container respectively.
4751*481dde66SAndroid Build Coastguard Worker template <typename TupleMatcher, typename Container>
4752*481dde66SAndroid Build Coastguard Worker inline internal::PointwiseMatcher<TupleMatcher,
4753*481dde66SAndroid Build Coastguard Worker typename std::remove_const<Container>::type>
4754*481dde66SAndroid Build Coastguard Worker Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {
4755*481dde66SAndroid Build Coastguard Worker return internal::PointwiseMatcher<TupleMatcher, Container>(tuple_matcher,
4756*481dde66SAndroid Build Coastguard Worker rhs);
4757*481dde66SAndroid Build Coastguard Worker }
4758*481dde66SAndroid Build Coastguard Worker
4759*481dde66SAndroid Build Coastguard Worker // Supports the Pointwise(m, {a, b, c}) syntax.
4760*481dde66SAndroid Build Coastguard Worker template <typename TupleMatcher, typename T>
4761*481dde66SAndroid Build Coastguard Worker inline internal::PointwiseMatcher<TupleMatcher, std::vector<T>> Pointwise(
4762*481dde66SAndroid Build Coastguard Worker const TupleMatcher& tuple_matcher, std::initializer_list<T> rhs) {
4763*481dde66SAndroid Build Coastguard Worker return Pointwise(tuple_matcher, std::vector<T>(rhs));
4764*481dde66SAndroid Build Coastguard Worker }
4765*481dde66SAndroid Build Coastguard Worker
4766*481dde66SAndroid Build Coastguard Worker // UnorderedPointwise(pair_matcher, rhs) matches an STL-style
4767*481dde66SAndroid Build Coastguard Worker // container or a native array that contains the same number of
4768*481dde66SAndroid Build Coastguard Worker // elements as in rhs, where in some permutation of the container, its
4769*481dde66SAndroid Build Coastguard Worker // i-th element and rhs's i-th element (as a pair) satisfy the given
4770*481dde66SAndroid Build Coastguard Worker // pair matcher, for all i. Tuple2Matcher must be able to be safely
4771*481dde66SAndroid Build Coastguard Worker // cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are
4772*481dde66SAndroid Build Coastguard Worker // the types of elements in the LHS container and the RHS container
4773*481dde66SAndroid Build Coastguard Worker // respectively.
4774*481dde66SAndroid Build Coastguard Worker //
4775*481dde66SAndroid Build Coastguard Worker // This is like Pointwise(pair_matcher, rhs), except that the element
4776*481dde66SAndroid Build Coastguard Worker // order doesn't matter.
4777*481dde66SAndroid Build Coastguard Worker template <typename Tuple2Matcher, typename RhsContainer>
4778*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4779*481dde66SAndroid Build Coastguard Worker typename internal::BoundSecondMatcher<
4780*481dde66SAndroid Build Coastguard Worker Tuple2Matcher,
4781*481dde66SAndroid Build Coastguard Worker typename internal::StlContainerView<
4782*481dde66SAndroid Build Coastguard Worker typename std::remove_const<RhsContainer>::type>::type::value_type>>
4783*481dde66SAndroid Build Coastguard Worker UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,
4784*481dde66SAndroid Build Coastguard Worker const RhsContainer& rhs_container) {
4785*481dde66SAndroid Build Coastguard Worker // RhsView allows the same code to handle RhsContainer being a
4786*481dde66SAndroid Build Coastguard Worker // STL-style container and it being a native C-style array.
4787*481dde66SAndroid Build Coastguard Worker typedef typename internal::StlContainerView<RhsContainer> RhsView;
4788*481dde66SAndroid Build Coastguard Worker typedef typename RhsView::type RhsStlContainer;
4789*481dde66SAndroid Build Coastguard Worker typedef typename RhsStlContainer::value_type Second;
4790*481dde66SAndroid Build Coastguard Worker const RhsStlContainer& rhs_stl_container =
4791*481dde66SAndroid Build Coastguard Worker RhsView::ConstReference(rhs_container);
4792*481dde66SAndroid Build Coastguard Worker
4793*481dde66SAndroid Build Coastguard Worker // Create a matcher for each element in rhs_container.
4794*481dde66SAndroid Build Coastguard Worker ::std::vector<internal::BoundSecondMatcher<Tuple2Matcher, Second>> matchers;
4795*481dde66SAndroid Build Coastguard Worker for (auto it = rhs_stl_container.begin(); it != rhs_stl_container.end();
4796*481dde66SAndroid Build Coastguard Worker ++it) {
4797*481dde66SAndroid Build Coastguard Worker matchers.push_back(internal::MatcherBindSecond(tuple2_matcher, *it));
4798*481dde66SAndroid Build Coastguard Worker }
4799*481dde66SAndroid Build Coastguard Worker
4800*481dde66SAndroid Build Coastguard Worker // Delegate the work to UnorderedElementsAreArray().
4801*481dde66SAndroid Build Coastguard Worker return UnorderedElementsAreArray(matchers);
4802*481dde66SAndroid Build Coastguard Worker }
4803*481dde66SAndroid Build Coastguard Worker
4804*481dde66SAndroid Build Coastguard Worker // Supports the UnorderedPointwise(m, {a, b, c}) syntax.
4805*481dde66SAndroid Build Coastguard Worker template <typename Tuple2Matcher, typename T>
4806*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4807*481dde66SAndroid Build Coastguard Worker typename internal::BoundSecondMatcher<Tuple2Matcher, T>>
4808*481dde66SAndroid Build Coastguard Worker UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,
4809*481dde66SAndroid Build Coastguard Worker std::initializer_list<T> rhs) {
4810*481dde66SAndroid Build Coastguard Worker return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));
4811*481dde66SAndroid Build Coastguard Worker }
4812*481dde66SAndroid Build Coastguard Worker
4813*481dde66SAndroid Build Coastguard Worker // Matches an STL-style container or a native array that contains at
4814*481dde66SAndroid Build Coastguard Worker // least one element matching the given value or matcher.
4815*481dde66SAndroid Build Coastguard Worker //
4816*481dde66SAndroid Build Coastguard Worker // Examples:
4817*481dde66SAndroid Build Coastguard Worker // ::std::set<int> page_ids;
4818*481dde66SAndroid Build Coastguard Worker // page_ids.insert(3);
4819*481dde66SAndroid Build Coastguard Worker // page_ids.insert(1);
4820*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Contains(1));
4821*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Contains(Gt(2)));
4822*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Not(Contains(4))); // See below for Times(0)
4823*481dde66SAndroid Build Coastguard Worker //
4824*481dde66SAndroid Build Coastguard Worker // ::std::map<int, size_t> page_lengths;
4825*481dde66SAndroid Build Coastguard Worker // page_lengths[1] = 100;
4826*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_lengths,
4827*481dde66SAndroid Build Coastguard Worker // Contains(::std::pair<const int, size_t>(1, 100)));
4828*481dde66SAndroid Build Coastguard Worker //
4829*481dde66SAndroid Build Coastguard Worker // const char* user_ids[] = { "joe", "mike", "tom" };
4830*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
4831*481dde66SAndroid Build Coastguard Worker //
4832*481dde66SAndroid Build Coastguard Worker // The matcher supports a modifier `Times` that allows to check for arbitrary
4833*481dde66SAndroid Build Coastguard Worker // occurrences including testing for absence with Times(0).
4834*481dde66SAndroid Build Coastguard Worker //
4835*481dde66SAndroid Build Coastguard Worker // Examples:
4836*481dde66SAndroid Build Coastguard Worker // ::std::vector<int> ids;
4837*481dde66SAndroid Build Coastguard Worker // ids.insert(1);
4838*481dde66SAndroid Build Coastguard Worker // ids.insert(1);
4839*481dde66SAndroid Build Coastguard Worker // ids.insert(3);
4840*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(ids, Contains(1).Times(2)); // 1 occurs 2 times
4841*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(ids, Contains(2).Times(0)); // 2 is not present
4842*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(ids, Contains(3).Times(Ge(1))); // 3 occurs at least once
4843*481dde66SAndroid Build Coastguard Worker
4844*481dde66SAndroid Build Coastguard Worker template <typename M>
4845*481dde66SAndroid Build Coastguard Worker inline internal::ContainsMatcher<M> Contains(M matcher) {
4846*481dde66SAndroid Build Coastguard Worker return internal::ContainsMatcher<M>(matcher);
4847*481dde66SAndroid Build Coastguard Worker }
4848*481dde66SAndroid Build Coastguard Worker
4849*481dde66SAndroid Build Coastguard Worker // IsSupersetOf(iterator_first, iterator_last)
4850*481dde66SAndroid Build Coastguard Worker // IsSupersetOf(pointer, count)
4851*481dde66SAndroid Build Coastguard Worker // IsSupersetOf(array)
4852*481dde66SAndroid Build Coastguard Worker // IsSupersetOf(container)
4853*481dde66SAndroid Build Coastguard Worker // IsSupersetOf({e1, e2, ..., en})
4854*481dde66SAndroid Build Coastguard Worker //
4855*481dde66SAndroid Build Coastguard Worker // IsSupersetOf() verifies that a surjective partial mapping onto a collection
4856*481dde66SAndroid Build Coastguard Worker // of matchers exists. In other words, a container matches
4857*481dde66SAndroid Build Coastguard Worker // IsSupersetOf({e1, ..., en}) if and only if there is a permutation
4858*481dde66SAndroid Build Coastguard Worker // {y1, ..., yn} of some of the container's elements where y1 matches e1,
4859*481dde66SAndroid Build Coastguard Worker // ..., and yn matches en. Obviously, the size of the container must be >= n
4860*481dde66SAndroid Build Coastguard Worker // in order to have a match. Examples:
4861*481dde66SAndroid Build Coastguard Worker //
4862*481dde66SAndroid Build Coastguard Worker // - {1, 2, 3} matches IsSupersetOf({Ge(3), Ne(0)}), as 3 matches Ge(3) and
4863*481dde66SAndroid Build Coastguard Worker // 1 matches Ne(0).
4864*481dde66SAndroid Build Coastguard Worker // - {1, 2} doesn't match IsSupersetOf({Eq(1), Lt(2)}), even though 1 matches
4865*481dde66SAndroid Build Coastguard Worker // both Eq(1) and Lt(2). The reason is that different matchers must be used
4866*481dde66SAndroid Build Coastguard Worker // for elements in different slots of the container.
4867*481dde66SAndroid Build Coastguard Worker // - {1, 1, 2} matches IsSupersetOf({Eq(1), Lt(2)}), as (the first) 1 matches
4868*481dde66SAndroid Build Coastguard Worker // Eq(1) and (the second) 1 matches Lt(2).
4869*481dde66SAndroid Build Coastguard Worker // - {1, 2, 3} matches IsSupersetOf(Gt(1), Gt(1)), as 2 matches (the first)
4870*481dde66SAndroid Build Coastguard Worker // Gt(1) and 3 matches (the second) Gt(1).
4871*481dde66SAndroid Build Coastguard Worker //
4872*481dde66SAndroid Build Coastguard Worker // The matchers can be specified as an array, a pointer and count, a container,
4873*481dde66SAndroid Build Coastguard Worker // an initializer list, or an STL iterator range. In each of these cases, the
4874*481dde66SAndroid Build Coastguard Worker // underlying matchers can be either values or matchers.
4875*481dde66SAndroid Build Coastguard Worker
4876*481dde66SAndroid Build Coastguard Worker template <typename Iter>
4877*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4878*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
4879*481dde66SAndroid Build Coastguard Worker IsSupersetOf(Iter first, Iter last) {
4880*481dde66SAndroid Build Coastguard Worker typedef typename ::std::iterator_traits<Iter>::value_type T;
4881*481dde66SAndroid Build Coastguard Worker return internal::UnorderedElementsAreArrayMatcher<T>(
4882*481dde66SAndroid Build Coastguard Worker internal::UnorderedMatcherRequire::Superset, first, last);
4883*481dde66SAndroid Build Coastguard Worker }
4884*481dde66SAndroid Build Coastguard Worker
4885*481dde66SAndroid Build Coastguard Worker template <typename T>
4886*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4887*481dde66SAndroid Build Coastguard Worker const T* pointer, size_t count) {
4888*481dde66SAndroid Build Coastguard Worker return IsSupersetOf(pointer, pointer + count);
4889*481dde66SAndroid Build Coastguard Worker }
4890*481dde66SAndroid Build Coastguard Worker
4891*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
4892*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4893*481dde66SAndroid Build Coastguard Worker const T (&array)[N]) {
4894*481dde66SAndroid Build Coastguard Worker return IsSupersetOf(array, N);
4895*481dde66SAndroid Build Coastguard Worker }
4896*481dde66SAndroid Build Coastguard Worker
4897*481dde66SAndroid Build Coastguard Worker template <typename Container>
4898*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4899*481dde66SAndroid Build Coastguard Worker typename Container::value_type>
4900*481dde66SAndroid Build Coastguard Worker IsSupersetOf(const Container& container) {
4901*481dde66SAndroid Build Coastguard Worker return IsSupersetOf(container.begin(), container.end());
4902*481dde66SAndroid Build Coastguard Worker }
4903*481dde66SAndroid Build Coastguard Worker
4904*481dde66SAndroid Build Coastguard Worker template <typename T>
4905*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4906*481dde66SAndroid Build Coastguard Worker ::std::initializer_list<T> xs) {
4907*481dde66SAndroid Build Coastguard Worker return IsSupersetOf(xs.begin(), xs.end());
4908*481dde66SAndroid Build Coastguard Worker }
4909*481dde66SAndroid Build Coastguard Worker
4910*481dde66SAndroid Build Coastguard Worker // IsSubsetOf(iterator_first, iterator_last)
4911*481dde66SAndroid Build Coastguard Worker // IsSubsetOf(pointer, count)
4912*481dde66SAndroid Build Coastguard Worker // IsSubsetOf(array)
4913*481dde66SAndroid Build Coastguard Worker // IsSubsetOf(container)
4914*481dde66SAndroid Build Coastguard Worker // IsSubsetOf({e1, e2, ..., en})
4915*481dde66SAndroid Build Coastguard Worker //
4916*481dde66SAndroid Build Coastguard Worker // IsSubsetOf() verifies that an injective mapping onto a collection of matchers
4917*481dde66SAndroid Build Coastguard Worker // exists. In other words, a container matches IsSubsetOf({e1, ..., en}) if and
4918*481dde66SAndroid Build Coastguard Worker // only if there is a subset of matchers {m1, ..., mk} which would match the
4919*481dde66SAndroid Build Coastguard Worker // container using UnorderedElementsAre. Obviously, the size of the container
4920*481dde66SAndroid Build Coastguard Worker // must be <= n in order to have a match. Examples:
4921*481dde66SAndroid Build Coastguard Worker //
4922*481dde66SAndroid Build Coastguard Worker // - {1} matches IsSubsetOf({Gt(0), Lt(0)}), as 1 matches Gt(0).
4923*481dde66SAndroid Build Coastguard Worker // - {1, -1} matches IsSubsetOf({Lt(0), Gt(0)}), as 1 matches Gt(0) and -1
4924*481dde66SAndroid Build Coastguard Worker // matches Lt(0).
4925*481dde66SAndroid Build Coastguard Worker // - {1, 2} doesn't matches IsSubsetOf({Gt(0), Lt(0)}), even though 1 and 2 both
4926*481dde66SAndroid Build Coastguard Worker // match Gt(0). The reason is that different matchers must be used for
4927*481dde66SAndroid Build Coastguard Worker // elements in different slots of the container.
4928*481dde66SAndroid Build Coastguard Worker //
4929*481dde66SAndroid Build Coastguard Worker // The matchers can be specified as an array, a pointer and count, a container,
4930*481dde66SAndroid Build Coastguard Worker // an initializer list, or an STL iterator range. In each of these cases, the
4931*481dde66SAndroid Build Coastguard Worker // underlying matchers can be either values or matchers.
4932*481dde66SAndroid Build Coastguard Worker
4933*481dde66SAndroid Build Coastguard Worker template <typename Iter>
4934*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4935*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
4936*481dde66SAndroid Build Coastguard Worker IsSubsetOf(Iter first, Iter last) {
4937*481dde66SAndroid Build Coastguard Worker typedef typename ::std::iterator_traits<Iter>::value_type T;
4938*481dde66SAndroid Build Coastguard Worker return internal::UnorderedElementsAreArrayMatcher<T>(
4939*481dde66SAndroid Build Coastguard Worker internal::UnorderedMatcherRequire::Subset, first, last);
4940*481dde66SAndroid Build Coastguard Worker }
4941*481dde66SAndroid Build Coastguard Worker
4942*481dde66SAndroid Build Coastguard Worker template <typename T>
4943*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4944*481dde66SAndroid Build Coastguard Worker const T* pointer, size_t count) {
4945*481dde66SAndroid Build Coastguard Worker return IsSubsetOf(pointer, pointer + count);
4946*481dde66SAndroid Build Coastguard Worker }
4947*481dde66SAndroid Build Coastguard Worker
4948*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
4949*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4950*481dde66SAndroid Build Coastguard Worker const T (&array)[N]) {
4951*481dde66SAndroid Build Coastguard Worker return IsSubsetOf(array, N);
4952*481dde66SAndroid Build Coastguard Worker }
4953*481dde66SAndroid Build Coastguard Worker
4954*481dde66SAndroid Build Coastguard Worker template <typename Container>
4955*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<
4956*481dde66SAndroid Build Coastguard Worker typename Container::value_type>
4957*481dde66SAndroid Build Coastguard Worker IsSubsetOf(const Container& container) {
4958*481dde66SAndroid Build Coastguard Worker return IsSubsetOf(container.begin(), container.end());
4959*481dde66SAndroid Build Coastguard Worker }
4960*481dde66SAndroid Build Coastguard Worker
4961*481dde66SAndroid Build Coastguard Worker template <typename T>
4962*481dde66SAndroid Build Coastguard Worker inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4963*481dde66SAndroid Build Coastguard Worker ::std::initializer_list<T> xs) {
4964*481dde66SAndroid Build Coastguard Worker return IsSubsetOf(xs.begin(), xs.end());
4965*481dde66SAndroid Build Coastguard Worker }
4966*481dde66SAndroid Build Coastguard Worker
4967*481dde66SAndroid Build Coastguard Worker // Matches an STL-style container or a native array that contains only
4968*481dde66SAndroid Build Coastguard Worker // elements matching the given value or matcher.
4969*481dde66SAndroid Build Coastguard Worker //
4970*481dde66SAndroid Build Coastguard Worker // Each(m) is semantically equivalent to `Not(Contains(Not(m)))`. Only
4971*481dde66SAndroid Build Coastguard Worker // the messages are different.
4972*481dde66SAndroid Build Coastguard Worker //
4973*481dde66SAndroid Build Coastguard Worker // Examples:
4974*481dde66SAndroid Build Coastguard Worker // ::std::set<int> page_ids;
4975*481dde66SAndroid Build Coastguard Worker // // Each(m) matches an empty container, regardless of what m is.
4976*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Each(Eq(1)));
4977*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Each(Eq(77)));
4978*481dde66SAndroid Build Coastguard Worker //
4979*481dde66SAndroid Build Coastguard Worker // page_ids.insert(3);
4980*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Each(Gt(0)));
4981*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Not(Each(Gt(4))));
4982*481dde66SAndroid Build Coastguard Worker // page_ids.insert(1);
4983*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_ids, Not(Each(Lt(2))));
4984*481dde66SAndroid Build Coastguard Worker //
4985*481dde66SAndroid Build Coastguard Worker // ::std::map<int, size_t> page_lengths;
4986*481dde66SAndroid Build Coastguard Worker // page_lengths[1] = 100;
4987*481dde66SAndroid Build Coastguard Worker // page_lengths[2] = 200;
4988*481dde66SAndroid Build Coastguard Worker // page_lengths[3] = 300;
4989*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
4990*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(page_lengths, Each(Key(Le(3))));
4991*481dde66SAndroid Build Coastguard Worker //
4992*481dde66SAndroid Build Coastguard Worker // const char* user_ids[] = { "joe", "mike", "tom" };
4993*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
4994*481dde66SAndroid Build Coastguard Worker template <typename M>
4995*481dde66SAndroid Build Coastguard Worker inline internal::EachMatcher<M> Each(M matcher) {
4996*481dde66SAndroid Build Coastguard Worker return internal::EachMatcher<M>(matcher);
4997*481dde66SAndroid Build Coastguard Worker }
4998*481dde66SAndroid Build Coastguard Worker
4999*481dde66SAndroid Build Coastguard Worker // Key(inner_matcher) matches an std::pair whose 'first' field matches
5000*481dde66SAndroid Build Coastguard Worker // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
5001*481dde66SAndroid Build Coastguard Worker // std::map that contains at least one element whose key is >= 5.
5002*481dde66SAndroid Build Coastguard Worker template <typename M>
5003*481dde66SAndroid Build Coastguard Worker inline internal::KeyMatcher<M> Key(M inner_matcher) {
5004*481dde66SAndroid Build Coastguard Worker return internal::KeyMatcher<M>(inner_matcher);
5005*481dde66SAndroid Build Coastguard Worker }
5006*481dde66SAndroid Build Coastguard Worker
5007*481dde66SAndroid Build Coastguard Worker // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
5008*481dde66SAndroid Build Coastguard Worker // matches first_matcher and whose 'second' field matches second_matcher. For
5009*481dde66SAndroid Build Coastguard Worker // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
5010*481dde66SAndroid Build Coastguard Worker // to match a std::map<int, string> that contains exactly one element whose key
5011*481dde66SAndroid Build Coastguard Worker // is >= 5 and whose value equals "foo".
5012*481dde66SAndroid Build Coastguard Worker template <typename FirstMatcher, typename SecondMatcher>
5013*481dde66SAndroid Build Coastguard Worker inline internal::PairMatcher<FirstMatcher, SecondMatcher> Pair(
5014*481dde66SAndroid Build Coastguard Worker FirstMatcher first_matcher, SecondMatcher second_matcher) {
5015*481dde66SAndroid Build Coastguard Worker return internal::PairMatcher<FirstMatcher, SecondMatcher>(first_matcher,
5016*481dde66SAndroid Build Coastguard Worker second_matcher);
5017*481dde66SAndroid Build Coastguard Worker }
5018*481dde66SAndroid Build Coastguard Worker
5019*481dde66SAndroid Build Coastguard Worker namespace no_adl {
5020*481dde66SAndroid Build Coastguard Worker // Conditional() creates a matcher that conditionally uses either the first or
5021*481dde66SAndroid Build Coastguard Worker // second matcher provided. For example, we could create an `equal if, and only
5022*481dde66SAndroid Build Coastguard Worker // if' matcher using the Conditional wrapper as follows:
5023*481dde66SAndroid Build Coastguard Worker //
5024*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(result, Conditional(condition, Eq(expected), Ne(expected)));
5025*481dde66SAndroid Build Coastguard Worker template <typename MatcherTrue, typename MatcherFalse>
5026*481dde66SAndroid Build Coastguard Worker internal::ConditionalMatcher<MatcherTrue, MatcherFalse> Conditional(
5027*481dde66SAndroid Build Coastguard Worker bool condition, MatcherTrue matcher_true, MatcherFalse matcher_false) {
5028*481dde66SAndroid Build Coastguard Worker return internal::ConditionalMatcher<MatcherTrue, MatcherFalse>(
5029*481dde66SAndroid Build Coastguard Worker condition, std::move(matcher_true), std::move(matcher_false));
5030*481dde66SAndroid Build Coastguard Worker }
5031*481dde66SAndroid Build Coastguard Worker
5032*481dde66SAndroid Build Coastguard Worker // FieldsAre(matchers...) matches piecewise the fields of compatible structs.
5033*481dde66SAndroid Build Coastguard Worker // These include those that support `get<I>(obj)`, and when structured bindings
5034*481dde66SAndroid Build Coastguard Worker // are enabled any class that supports them.
5035*481dde66SAndroid Build Coastguard Worker // In particular, `std::tuple`, `std::pair`, `std::array` and aggregate types.
5036*481dde66SAndroid Build Coastguard Worker template <typename... M>
5037*481dde66SAndroid Build Coastguard Worker internal::FieldsAreMatcher<typename std::decay<M>::type...> FieldsAre(
5038*481dde66SAndroid Build Coastguard Worker M&&... matchers) {
5039*481dde66SAndroid Build Coastguard Worker return internal::FieldsAreMatcher<typename std::decay<M>::type...>(
5040*481dde66SAndroid Build Coastguard Worker std::forward<M>(matchers)...);
5041*481dde66SAndroid Build Coastguard Worker }
5042*481dde66SAndroid Build Coastguard Worker
5043*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches a pointer (raw or smart) that matches
5044*481dde66SAndroid Build Coastguard Worker // inner_matcher.
5045*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
5046*481dde66SAndroid Build Coastguard Worker inline internal::PointerMatcher<InnerMatcher> Pointer(
5047*481dde66SAndroid Build Coastguard Worker const InnerMatcher& inner_matcher) {
5048*481dde66SAndroid Build Coastguard Worker return internal::PointerMatcher<InnerMatcher>(inner_matcher);
5049*481dde66SAndroid Build Coastguard Worker }
5050*481dde66SAndroid Build Coastguard Worker
5051*481dde66SAndroid Build Coastguard Worker // Creates a matcher that matches an object that has an address that matches
5052*481dde66SAndroid Build Coastguard Worker // inner_matcher.
5053*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
5054*481dde66SAndroid Build Coastguard Worker inline internal::AddressMatcher<InnerMatcher> Address(
5055*481dde66SAndroid Build Coastguard Worker const InnerMatcher& inner_matcher) {
5056*481dde66SAndroid Build Coastguard Worker return internal::AddressMatcher<InnerMatcher>(inner_matcher);
5057*481dde66SAndroid Build Coastguard Worker }
5058*481dde66SAndroid Build Coastguard Worker
5059*481dde66SAndroid Build Coastguard Worker // Matches a base64 escaped string, when the unescaped string matches the
5060*481dde66SAndroid Build Coastguard Worker // internal matcher.
5061*481dde66SAndroid Build Coastguard Worker template <typename MatcherType>
5062*481dde66SAndroid Build Coastguard Worker internal::WhenBase64UnescapedMatcher WhenBase64Unescaped(
5063*481dde66SAndroid Build Coastguard Worker const MatcherType& internal_matcher) {
5064*481dde66SAndroid Build Coastguard Worker return internal::WhenBase64UnescapedMatcher(internal_matcher);
5065*481dde66SAndroid Build Coastguard Worker }
5066*481dde66SAndroid Build Coastguard Worker } // namespace no_adl
5067*481dde66SAndroid Build Coastguard Worker
5068*481dde66SAndroid Build Coastguard Worker // Returns a predicate that is satisfied by anything that matches the
5069*481dde66SAndroid Build Coastguard Worker // given matcher.
5070*481dde66SAndroid Build Coastguard Worker template <typename M>
5071*481dde66SAndroid Build Coastguard Worker inline internal::MatcherAsPredicate<M> Matches(M matcher) {
5072*481dde66SAndroid Build Coastguard Worker return internal::MatcherAsPredicate<M>(matcher);
5073*481dde66SAndroid Build Coastguard Worker }
5074*481dde66SAndroid Build Coastguard Worker
5075*481dde66SAndroid Build Coastguard Worker // Returns true if and only if the value matches the matcher.
5076*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
5077*481dde66SAndroid Build Coastguard Worker inline bool Value(const T& value, M matcher) {
5078*481dde66SAndroid Build Coastguard Worker return testing::Matches(matcher)(value);
5079*481dde66SAndroid Build Coastguard Worker }
5080*481dde66SAndroid Build Coastguard Worker
5081*481dde66SAndroid Build Coastguard Worker // Matches the value against the given matcher and explains the match
5082*481dde66SAndroid Build Coastguard Worker // result to listener.
5083*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
5084*481dde66SAndroid Build Coastguard Worker inline bool ExplainMatchResult(M matcher, const T& value,
5085*481dde66SAndroid Build Coastguard Worker MatchResultListener* listener) {
5086*481dde66SAndroid Build Coastguard Worker return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
5087*481dde66SAndroid Build Coastguard Worker }
5088*481dde66SAndroid Build Coastguard Worker
5089*481dde66SAndroid Build Coastguard Worker // Returns a string representation of the given matcher. Useful for description
5090*481dde66SAndroid Build Coastguard Worker // strings of matchers defined using MATCHER_P* macros that accept matchers as
5091*481dde66SAndroid Build Coastguard Worker // their arguments. For example:
5092*481dde66SAndroid Build Coastguard Worker //
5093*481dde66SAndroid Build Coastguard Worker // MATCHER_P(XAndYThat, matcher,
5094*481dde66SAndroid Build Coastguard Worker // "X that " + DescribeMatcher<int>(matcher, negation) +
5095*481dde66SAndroid Build Coastguard Worker // (negation ? " or" : " and") + " Y that " +
5096*481dde66SAndroid Build Coastguard Worker // DescribeMatcher<double>(matcher, negation)) {
5097*481dde66SAndroid Build Coastguard Worker // return ExplainMatchResult(matcher, arg.x(), result_listener) &&
5098*481dde66SAndroid Build Coastguard Worker // ExplainMatchResult(matcher, arg.y(), result_listener);
5099*481dde66SAndroid Build Coastguard Worker // }
5100*481dde66SAndroid Build Coastguard Worker template <typename T, typename M>
5101*481dde66SAndroid Build Coastguard Worker std::string DescribeMatcher(const M& matcher, bool negation = false) {
5102*481dde66SAndroid Build Coastguard Worker ::std::stringstream ss;
5103*481dde66SAndroid Build Coastguard Worker Matcher<T> monomorphic_matcher = SafeMatcherCast<T>(matcher);
5104*481dde66SAndroid Build Coastguard Worker if (negation) {
5105*481dde66SAndroid Build Coastguard Worker monomorphic_matcher.DescribeNegationTo(&ss);
5106*481dde66SAndroid Build Coastguard Worker } else {
5107*481dde66SAndroid Build Coastguard Worker monomorphic_matcher.DescribeTo(&ss);
5108*481dde66SAndroid Build Coastguard Worker }
5109*481dde66SAndroid Build Coastguard Worker return ss.str();
5110*481dde66SAndroid Build Coastguard Worker }
5111*481dde66SAndroid Build Coastguard Worker
5112*481dde66SAndroid Build Coastguard Worker template <typename... Args>
5113*481dde66SAndroid Build Coastguard Worker internal::ElementsAreMatcher<
5114*481dde66SAndroid Build Coastguard Worker std::tuple<typename std::decay<const Args&>::type...>>
5115*481dde66SAndroid Build Coastguard Worker ElementsAre(const Args&... matchers) {
5116*481dde66SAndroid Build Coastguard Worker return internal::ElementsAreMatcher<
5117*481dde66SAndroid Build Coastguard Worker std::tuple<typename std::decay<const Args&>::type...>>(
5118*481dde66SAndroid Build Coastguard Worker std::make_tuple(matchers...));
5119*481dde66SAndroid Build Coastguard Worker }
5120*481dde66SAndroid Build Coastguard Worker
5121*481dde66SAndroid Build Coastguard Worker template <typename... Args>
5122*481dde66SAndroid Build Coastguard Worker internal::UnorderedElementsAreMatcher<
5123*481dde66SAndroid Build Coastguard Worker std::tuple<typename std::decay<const Args&>::type...>>
5124*481dde66SAndroid Build Coastguard Worker UnorderedElementsAre(const Args&... matchers) {
5125*481dde66SAndroid Build Coastguard Worker return internal::UnorderedElementsAreMatcher<
5126*481dde66SAndroid Build Coastguard Worker std::tuple<typename std::decay<const Args&>::type...>>(
5127*481dde66SAndroid Build Coastguard Worker std::make_tuple(matchers...));
5128*481dde66SAndroid Build Coastguard Worker }
5129*481dde66SAndroid Build Coastguard Worker
5130*481dde66SAndroid Build Coastguard Worker // Define variadic matcher versions.
5131*481dde66SAndroid Build Coastguard Worker template <typename... Args>
5132*481dde66SAndroid Build Coastguard Worker internal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(
5133*481dde66SAndroid Build Coastguard Worker const Args&... matchers) {
5134*481dde66SAndroid Build Coastguard Worker return internal::AllOfMatcher<typename std::decay<const Args&>::type...>(
5135*481dde66SAndroid Build Coastguard Worker matchers...);
5136*481dde66SAndroid Build Coastguard Worker }
5137*481dde66SAndroid Build Coastguard Worker
5138*481dde66SAndroid Build Coastguard Worker template <typename... Args>
5139*481dde66SAndroid Build Coastguard Worker internal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(
5140*481dde66SAndroid Build Coastguard Worker const Args&... matchers) {
5141*481dde66SAndroid Build Coastguard Worker return internal::AnyOfMatcher<typename std::decay<const Args&>::type...>(
5142*481dde66SAndroid Build Coastguard Worker matchers...);
5143*481dde66SAndroid Build Coastguard Worker }
5144*481dde66SAndroid Build Coastguard Worker
5145*481dde66SAndroid Build Coastguard Worker // AnyOfArray(array)
5146*481dde66SAndroid Build Coastguard Worker // AnyOfArray(pointer, count)
5147*481dde66SAndroid Build Coastguard Worker // AnyOfArray(container)
5148*481dde66SAndroid Build Coastguard Worker // AnyOfArray({ e1, e2, ..., en })
5149*481dde66SAndroid Build Coastguard Worker // AnyOfArray(iterator_first, iterator_last)
5150*481dde66SAndroid Build Coastguard Worker //
5151*481dde66SAndroid Build Coastguard Worker // AnyOfArray() verifies whether a given value matches any member of a
5152*481dde66SAndroid Build Coastguard Worker // collection of matchers.
5153*481dde66SAndroid Build Coastguard Worker //
5154*481dde66SAndroid Build Coastguard Worker // AllOfArray(array)
5155*481dde66SAndroid Build Coastguard Worker // AllOfArray(pointer, count)
5156*481dde66SAndroid Build Coastguard Worker // AllOfArray(container)
5157*481dde66SAndroid Build Coastguard Worker // AllOfArray({ e1, e2, ..., en })
5158*481dde66SAndroid Build Coastguard Worker // AllOfArray(iterator_first, iterator_last)
5159*481dde66SAndroid Build Coastguard Worker //
5160*481dde66SAndroid Build Coastguard Worker // AllOfArray() verifies whether a given value matches all members of a
5161*481dde66SAndroid Build Coastguard Worker // collection of matchers.
5162*481dde66SAndroid Build Coastguard Worker //
5163*481dde66SAndroid Build Coastguard Worker // The matchers can be specified as an array, a pointer and count, a container,
5164*481dde66SAndroid Build Coastguard Worker // an initializer list, or an STL iterator range. In each of these cases, the
5165*481dde66SAndroid Build Coastguard Worker // underlying matchers can be either values or matchers.
5166*481dde66SAndroid Build Coastguard Worker
5167*481dde66SAndroid Build Coastguard Worker template <typename Iter>
5168*481dde66SAndroid Build Coastguard Worker inline internal::AnyOfArrayMatcher<
5169*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
5170*481dde66SAndroid Build Coastguard Worker AnyOfArray(Iter first, Iter last) {
5171*481dde66SAndroid Build Coastguard Worker return internal::AnyOfArrayMatcher<
5172*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>(first, last);
5173*481dde66SAndroid Build Coastguard Worker }
5174*481dde66SAndroid Build Coastguard Worker
5175*481dde66SAndroid Build Coastguard Worker template <typename Iter>
5176*481dde66SAndroid Build Coastguard Worker inline internal::AllOfArrayMatcher<
5177*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>
5178*481dde66SAndroid Build Coastguard Worker AllOfArray(Iter first, Iter last) {
5179*481dde66SAndroid Build Coastguard Worker return internal::AllOfArrayMatcher<
5180*481dde66SAndroid Build Coastguard Worker typename ::std::iterator_traits<Iter>::value_type>(first, last);
5181*481dde66SAndroid Build Coastguard Worker }
5182*481dde66SAndroid Build Coastguard Worker
5183*481dde66SAndroid Build Coastguard Worker template <typename T>
5184*481dde66SAndroid Build Coastguard Worker inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T* ptr, size_t count) {
5185*481dde66SAndroid Build Coastguard Worker return AnyOfArray(ptr, ptr + count);
5186*481dde66SAndroid Build Coastguard Worker }
5187*481dde66SAndroid Build Coastguard Worker
5188*481dde66SAndroid Build Coastguard Worker template <typename T>
5189*481dde66SAndroid Build Coastguard Worker inline internal::AllOfArrayMatcher<T> AllOfArray(const T* ptr, size_t count) {
5190*481dde66SAndroid Build Coastguard Worker return AllOfArray(ptr, ptr + count);
5191*481dde66SAndroid Build Coastguard Worker }
5192*481dde66SAndroid Build Coastguard Worker
5193*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
5194*481dde66SAndroid Build Coastguard Worker inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T (&array)[N]) {
5195*481dde66SAndroid Build Coastguard Worker return AnyOfArray(array, N);
5196*481dde66SAndroid Build Coastguard Worker }
5197*481dde66SAndroid Build Coastguard Worker
5198*481dde66SAndroid Build Coastguard Worker template <typename T, size_t N>
5199*481dde66SAndroid Build Coastguard Worker inline internal::AllOfArrayMatcher<T> AllOfArray(const T (&array)[N]) {
5200*481dde66SAndroid Build Coastguard Worker return AllOfArray(array, N);
5201*481dde66SAndroid Build Coastguard Worker }
5202*481dde66SAndroid Build Coastguard Worker
5203*481dde66SAndroid Build Coastguard Worker template <typename Container>
5204*481dde66SAndroid Build Coastguard Worker inline internal::AnyOfArrayMatcher<typename Container::value_type> AnyOfArray(
5205*481dde66SAndroid Build Coastguard Worker const Container& container) {
5206*481dde66SAndroid Build Coastguard Worker return AnyOfArray(container.begin(), container.end());
5207*481dde66SAndroid Build Coastguard Worker }
5208*481dde66SAndroid Build Coastguard Worker
5209*481dde66SAndroid Build Coastguard Worker template <typename Container>
5210*481dde66SAndroid Build Coastguard Worker inline internal::AllOfArrayMatcher<typename Container::value_type> AllOfArray(
5211*481dde66SAndroid Build Coastguard Worker const Container& container) {
5212*481dde66SAndroid Build Coastguard Worker return AllOfArray(container.begin(), container.end());
5213*481dde66SAndroid Build Coastguard Worker }
5214*481dde66SAndroid Build Coastguard Worker
5215*481dde66SAndroid Build Coastguard Worker template <typename T>
5216*481dde66SAndroid Build Coastguard Worker inline internal::AnyOfArrayMatcher<T> AnyOfArray(
5217*481dde66SAndroid Build Coastguard Worker ::std::initializer_list<T> xs) {
5218*481dde66SAndroid Build Coastguard Worker return AnyOfArray(xs.begin(), xs.end());
5219*481dde66SAndroid Build Coastguard Worker }
5220*481dde66SAndroid Build Coastguard Worker
5221*481dde66SAndroid Build Coastguard Worker template <typename T>
5222*481dde66SAndroid Build Coastguard Worker inline internal::AllOfArrayMatcher<T> AllOfArray(
5223*481dde66SAndroid Build Coastguard Worker ::std::initializer_list<T> xs) {
5224*481dde66SAndroid Build Coastguard Worker return AllOfArray(xs.begin(), xs.end());
5225*481dde66SAndroid Build Coastguard Worker }
5226*481dde66SAndroid Build Coastguard Worker
5227*481dde66SAndroid Build Coastguard Worker // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
5228*481dde66SAndroid Build Coastguard Worker // fields of it matches a_matcher. C++ doesn't support default
5229*481dde66SAndroid Build Coastguard Worker // arguments for function templates, so we have to overload it.
5230*481dde66SAndroid Build Coastguard Worker template <size_t... k, typename InnerMatcher>
5231*481dde66SAndroid Build Coastguard Worker internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...> Args(
5232*481dde66SAndroid Build Coastguard Worker InnerMatcher&& matcher) {
5233*481dde66SAndroid Build Coastguard Worker return internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...>(
5234*481dde66SAndroid Build Coastguard Worker std::forward<InnerMatcher>(matcher));
5235*481dde66SAndroid Build Coastguard Worker }
5236*481dde66SAndroid Build Coastguard Worker
5237*481dde66SAndroid Build Coastguard Worker // AllArgs(m) is a synonym of m. This is useful in
5238*481dde66SAndroid Build Coastguard Worker //
5239*481dde66SAndroid Build Coastguard Worker // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
5240*481dde66SAndroid Build Coastguard Worker //
5241*481dde66SAndroid Build Coastguard Worker // which is easier to read than
5242*481dde66SAndroid Build Coastguard Worker //
5243*481dde66SAndroid Build Coastguard Worker // EXPECT_CALL(foo, Bar(_, _)).With(Eq());
5244*481dde66SAndroid Build Coastguard Worker template <typename InnerMatcher>
5245*481dde66SAndroid Build Coastguard Worker inline InnerMatcher AllArgs(const InnerMatcher& matcher) {
5246*481dde66SAndroid Build Coastguard Worker return matcher;
5247*481dde66SAndroid Build Coastguard Worker }
5248*481dde66SAndroid Build Coastguard Worker
5249*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches the value of an optional<> type variable.
5250*481dde66SAndroid Build Coastguard Worker // The matcher implementation only uses '!arg' and requires that the optional<>
5251*481dde66SAndroid Build Coastguard Worker // type has a 'value_type' member type and that '*arg' is of type 'value_type'
5252*481dde66SAndroid Build Coastguard Worker // and is printable using 'PrintToString'. It is compatible with
5253*481dde66SAndroid Build Coastguard Worker // std::optional/std::experimental::optional.
5254*481dde66SAndroid Build Coastguard Worker // Note that to compare an optional type variable against nullopt you should
5255*481dde66SAndroid Build Coastguard Worker // use Eq(nullopt) and not Eq(Optional(nullopt)). The latter implies that the
5256*481dde66SAndroid Build Coastguard Worker // optional value contains an optional itself.
5257*481dde66SAndroid Build Coastguard Worker template <typename ValueMatcher>
5258*481dde66SAndroid Build Coastguard Worker inline internal::OptionalMatcher<ValueMatcher> Optional(
5259*481dde66SAndroid Build Coastguard Worker const ValueMatcher& value_matcher) {
5260*481dde66SAndroid Build Coastguard Worker return internal::OptionalMatcher<ValueMatcher>(value_matcher);
5261*481dde66SAndroid Build Coastguard Worker }
5262*481dde66SAndroid Build Coastguard Worker
5263*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches the value of a absl::any type variable.
5264*481dde66SAndroid Build Coastguard Worker template <typename T>
5265*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::any_cast_matcher::AnyCastMatcher<T>> AnyWith(
5266*481dde66SAndroid Build Coastguard Worker const Matcher<const T&>& matcher) {
5267*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
5268*481dde66SAndroid Build Coastguard Worker internal::any_cast_matcher::AnyCastMatcher<T>(matcher));
5269*481dde66SAndroid Build Coastguard Worker }
5270*481dde66SAndroid Build Coastguard Worker
5271*481dde66SAndroid Build Coastguard Worker // Returns a matcher that matches the value of a variant<> type variable.
5272*481dde66SAndroid Build Coastguard Worker // The matcher implementation uses ADL to find the holds_alternative and get
5273*481dde66SAndroid Build Coastguard Worker // functions.
5274*481dde66SAndroid Build Coastguard Worker // It is compatible with std::variant.
5275*481dde66SAndroid Build Coastguard Worker template <typename T>
5276*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T>> VariantWith(
5277*481dde66SAndroid Build Coastguard Worker const Matcher<const T&>& matcher) {
5278*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
5279*481dde66SAndroid Build Coastguard Worker internal::variant_matcher::VariantMatcher<T>(matcher));
5280*481dde66SAndroid Build Coastguard Worker }
5281*481dde66SAndroid Build Coastguard Worker
5282*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
5283*481dde66SAndroid Build Coastguard Worker
5284*481dde66SAndroid Build Coastguard Worker // Anything inside the `internal` namespace is internal to the implementation
5285*481dde66SAndroid Build Coastguard Worker // and must not be used in user code!
5286*481dde66SAndroid Build Coastguard Worker namespace internal {
5287*481dde66SAndroid Build Coastguard Worker
5288*481dde66SAndroid Build Coastguard Worker class WithWhatMatcherImpl {
5289*481dde66SAndroid Build Coastguard Worker public:
5290*481dde66SAndroid Build Coastguard Worker WithWhatMatcherImpl(Matcher<std::string> matcher)
5291*481dde66SAndroid Build Coastguard Worker : matcher_(std::move(matcher)) {}
5292*481dde66SAndroid Build Coastguard Worker
5293*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const {
5294*481dde66SAndroid Build Coastguard Worker *os << "contains .what() that ";
5295*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
5296*481dde66SAndroid Build Coastguard Worker }
5297*481dde66SAndroid Build Coastguard Worker
5298*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const {
5299*481dde66SAndroid Build Coastguard Worker *os << "contains .what() that does not ";
5300*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
5301*481dde66SAndroid Build Coastguard Worker }
5302*481dde66SAndroid Build Coastguard Worker
5303*481dde66SAndroid Build Coastguard Worker template <typename Err>
5304*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(const Err& err, MatchResultListener* listener) const {
5305*481dde66SAndroid Build Coastguard Worker *listener << "which contains .what() (of value = " << err.what()
5306*481dde66SAndroid Build Coastguard Worker << ") that ";
5307*481dde66SAndroid Build Coastguard Worker return matcher_.MatchAndExplain(err.what(), listener);
5308*481dde66SAndroid Build Coastguard Worker }
5309*481dde66SAndroid Build Coastguard Worker
5310*481dde66SAndroid Build Coastguard Worker private:
5311*481dde66SAndroid Build Coastguard Worker const Matcher<std::string> matcher_;
5312*481dde66SAndroid Build Coastguard Worker };
5313*481dde66SAndroid Build Coastguard Worker
5314*481dde66SAndroid Build Coastguard Worker inline PolymorphicMatcher<WithWhatMatcherImpl> WithWhat(
5315*481dde66SAndroid Build Coastguard Worker Matcher<std::string> m) {
5316*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(WithWhatMatcherImpl(std::move(m)));
5317*481dde66SAndroid Build Coastguard Worker }
5318*481dde66SAndroid Build Coastguard Worker
5319*481dde66SAndroid Build Coastguard Worker template <typename Err>
5320*481dde66SAndroid Build Coastguard Worker class ExceptionMatcherImpl {
5321*481dde66SAndroid Build Coastguard Worker class NeverThrown {
5322*481dde66SAndroid Build Coastguard Worker public:
5323*481dde66SAndroid Build Coastguard Worker const char* what() const noexcept {
5324*481dde66SAndroid Build Coastguard Worker return "this exception should never be thrown";
5325*481dde66SAndroid Build Coastguard Worker }
5326*481dde66SAndroid Build Coastguard Worker };
5327*481dde66SAndroid Build Coastguard Worker
5328*481dde66SAndroid Build Coastguard Worker // If the matchee raises an exception of a wrong type, we'd like to
5329*481dde66SAndroid Build Coastguard Worker // catch it and print its message and type. To do that, we add an additional
5330*481dde66SAndroid Build Coastguard Worker // catch clause:
5331*481dde66SAndroid Build Coastguard Worker //
5332*481dde66SAndroid Build Coastguard Worker // try { ... }
5333*481dde66SAndroid Build Coastguard Worker // catch (const Err&) { /* an expected exception */ }
5334*481dde66SAndroid Build Coastguard Worker // catch (const std::exception&) { /* exception of a wrong type */ }
5335*481dde66SAndroid Build Coastguard Worker //
5336*481dde66SAndroid Build Coastguard Worker // However, if the `Err` itself is `std::exception`, we'd end up with two
5337*481dde66SAndroid Build Coastguard Worker // identical `catch` clauses:
5338*481dde66SAndroid Build Coastguard Worker //
5339*481dde66SAndroid Build Coastguard Worker // try { ... }
5340*481dde66SAndroid Build Coastguard Worker // catch (const std::exception&) { /* an expected exception */ }
5341*481dde66SAndroid Build Coastguard Worker // catch (const std::exception&) { /* exception of a wrong type */ }
5342*481dde66SAndroid Build Coastguard Worker //
5343*481dde66SAndroid Build Coastguard Worker // This can cause a warning or an error in some compilers. To resolve
5344*481dde66SAndroid Build Coastguard Worker // the issue, we use a fake error type whenever `Err` is `std::exception`:
5345*481dde66SAndroid Build Coastguard Worker //
5346*481dde66SAndroid Build Coastguard Worker // try { ... }
5347*481dde66SAndroid Build Coastguard Worker // catch (const std::exception&) { /* an expected exception */ }
5348*481dde66SAndroid Build Coastguard Worker // catch (const NeverThrown&) { /* exception of a wrong type */ }
5349*481dde66SAndroid Build Coastguard Worker using DefaultExceptionType = typename std::conditional<
5350*481dde66SAndroid Build Coastguard Worker std::is_same<typename std::remove_cv<
5351*481dde66SAndroid Build Coastguard Worker typename std::remove_reference<Err>::type>::type,
5352*481dde66SAndroid Build Coastguard Worker std::exception>::value,
5353*481dde66SAndroid Build Coastguard Worker const NeverThrown&, const std::exception&>::type;
5354*481dde66SAndroid Build Coastguard Worker
5355*481dde66SAndroid Build Coastguard Worker public:
5356*481dde66SAndroid Build Coastguard Worker ExceptionMatcherImpl(Matcher<const Err&> matcher)
5357*481dde66SAndroid Build Coastguard Worker : matcher_(std::move(matcher)) {}
5358*481dde66SAndroid Build Coastguard Worker
5359*481dde66SAndroid Build Coastguard Worker void DescribeTo(std::ostream* os) const {
5360*481dde66SAndroid Build Coastguard Worker *os << "throws an exception which is a " << GetTypeName<Err>();
5361*481dde66SAndroid Build Coastguard Worker *os << " which ";
5362*481dde66SAndroid Build Coastguard Worker matcher_.DescribeTo(os);
5363*481dde66SAndroid Build Coastguard Worker }
5364*481dde66SAndroid Build Coastguard Worker
5365*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(std::ostream* os) const {
5366*481dde66SAndroid Build Coastguard Worker *os << "throws an exception which is not a " << GetTypeName<Err>();
5367*481dde66SAndroid Build Coastguard Worker *os << " which ";
5368*481dde66SAndroid Build Coastguard Worker matcher_.DescribeNegationTo(os);
5369*481dde66SAndroid Build Coastguard Worker }
5370*481dde66SAndroid Build Coastguard Worker
5371*481dde66SAndroid Build Coastguard Worker template <typename T>
5372*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T&& x, MatchResultListener* listener) const {
5373*481dde66SAndroid Build Coastguard Worker try {
5374*481dde66SAndroid Build Coastguard Worker (void)(std::forward<T>(x)());
5375*481dde66SAndroid Build Coastguard Worker } catch (const Err& err) {
5376*481dde66SAndroid Build Coastguard Worker *listener << "throws an exception which is a " << GetTypeName<Err>();
5377*481dde66SAndroid Build Coastguard Worker *listener << " ";
5378*481dde66SAndroid Build Coastguard Worker return matcher_.MatchAndExplain(err, listener);
5379*481dde66SAndroid Build Coastguard Worker } catch (DefaultExceptionType err) {
5380*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_RTTI
5381*481dde66SAndroid Build Coastguard Worker *listener << "throws an exception of type " << GetTypeName(typeid(err));
5382*481dde66SAndroid Build Coastguard Worker *listener << " ";
5383*481dde66SAndroid Build Coastguard Worker #else
5384*481dde66SAndroid Build Coastguard Worker *listener << "throws an std::exception-derived type ";
5385*481dde66SAndroid Build Coastguard Worker #endif
5386*481dde66SAndroid Build Coastguard Worker *listener << "with description \"" << err.what() << "\"";
5387*481dde66SAndroid Build Coastguard Worker return false;
5388*481dde66SAndroid Build Coastguard Worker } catch (...) {
5389*481dde66SAndroid Build Coastguard Worker *listener << "throws an exception of an unknown type";
5390*481dde66SAndroid Build Coastguard Worker return false;
5391*481dde66SAndroid Build Coastguard Worker }
5392*481dde66SAndroid Build Coastguard Worker
5393*481dde66SAndroid Build Coastguard Worker *listener << "does not throw any exception";
5394*481dde66SAndroid Build Coastguard Worker return false;
5395*481dde66SAndroid Build Coastguard Worker }
5396*481dde66SAndroid Build Coastguard Worker
5397*481dde66SAndroid Build Coastguard Worker private:
5398*481dde66SAndroid Build Coastguard Worker const Matcher<const Err&> matcher_;
5399*481dde66SAndroid Build Coastguard Worker };
5400*481dde66SAndroid Build Coastguard Worker
5401*481dde66SAndroid Build Coastguard Worker } // namespace internal
5402*481dde66SAndroid Build Coastguard Worker
5403*481dde66SAndroid Build Coastguard Worker // Throws()
5404*481dde66SAndroid Build Coastguard Worker // Throws(exceptionMatcher)
5405*481dde66SAndroid Build Coastguard Worker // ThrowsMessage(messageMatcher)
5406*481dde66SAndroid Build Coastguard Worker //
5407*481dde66SAndroid Build Coastguard Worker // This matcher accepts a callable and verifies that when invoked, it throws
5408*481dde66SAndroid Build Coastguard Worker // an exception with the given type and properties.
5409*481dde66SAndroid Build Coastguard Worker //
5410*481dde66SAndroid Build Coastguard Worker // Examples:
5411*481dde66SAndroid Build Coastguard Worker //
5412*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(
5413*481dde66SAndroid Build Coastguard Worker // []() { throw std::runtime_error("message"); },
5414*481dde66SAndroid Build Coastguard Worker // Throws<std::runtime_error>());
5415*481dde66SAndroid Build Coastguard Worker //
5416*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(
5417*481dde66SAndroid Build Coastguard Worker // []() { throw std::runtime_error("message"); },
5418*481dde66SAndroid Build Coastguard Worker // ThrowsMessage<std::runtime_error>(HasSubstr("message")));
5419*481dde66SAndroid Build Coastguard Worker //
5420*481dde66SAndroid Build Coastguard Worker // EXPECT_THAT(
5421*481dde66SAndroid Build Coastguard Worker // []() { throw std::runtime_error("message"); },
5422*481dde66SAndroid Build Coastguard Worker // Throws<std::runtime_error>(
5423*481dde66SAndroid Build Coastguard Worker // Property(&std::runtime_error::what, HasSubstr("message"))));
5424*481dde66SAndroid Build Coastguard Worker
5425*481dde66SAndroid Build Coastguard Worker template <typename Err>
5426*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> Throws() {
5427*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(
5428*481dde66SAndroid Build Coastguard Worker internal::ExceptionMatcherImpl<Err>(A<const Err&>()));
5429*481dde66SAndroid Build Coastguard Worker }
5430*481dde66SAndroid Build Coastguard Worker
5431*481dde66SAndroid Build Coastguard Worker template <typename Err, typename ExceptionMatcher>
5432*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> Throws(
5433*481dde66SAndroid Build Coastguard Worker const ExceptionMatcher& exception_matcher) {
5434*481dde66SAndroid Build Coastguard Worker // Using matcher cast allows users to pass a matcher of a more broad type.
5435*481dde66SAndroid Build Coastguard Worker // For example user may want to pass Matcher<std::exception>
5436*481dde66SAndroid Build Coastguard Worker // to Throws<std::runtime_error>, or Matcher<int64> to Throws<int32>.
5437*481dde66SAndroid Build Coastguard Worker return MakePolymorphicMatcher(internal::ExceptionMatcherImpl<Err>(
5438*481dde66SAndroid Build Coastguard Worker SafeMatcherCast<const Err&>(exception_matcher)));
5439*481dde66SAndroid Build Coastguard Worker }
5440*481dde66SAndroid Build Coastguard Worker
5441*481dde66SAndroid Build Coastguard Worker template <typename Err, typename MessageMatcher>
5442*481dde66SAndroid Build Coastguard Worker PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
5443*481dde66SAndroid Build Coastguard Worker MessageMatcher&& message_matcher) {
5444*481dde66SAndroid Build Coastguard Worker static_assert(std::is_base_of<std::exception, Err>::value,
5445*481dde66SAndroid Build Coastguard Worker "expected an std::exception-derived type");
5446*481dde66SAndroid Build Coastguard Worker return Throws<Err>(internal::WithWhat(
5447*481dde66SAndroid Build Coastguard Worker MatcherCast<std::string>(std::forward<MessageMatcher>(message_matcher))));
5448*481dde66SAndroid Build Coastguard Worker }
5449*481dde66SAndroid Build Coastguard Worker
5450*481dde66SAndroid Build Coastguard Worker #endif // GTEST_HAS_EXCEPTIONS
5451*481dde66SAndroid Build Coastguard Worker
5452*481dde66SAndroid Build Coastguard Worker // These macros allow using matchers to check values in Google Test
5453*481dde66SAndroid Build Coastguard Worker // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
5454*481dde66SAndroid Build Coastguard Worker // succeed if and only if the value matches the matcher. If the assertion
5455*481dde66SAndroid Build Coastguard Worker // fails, the value and the description of the matcher will be printed.
5456*481dde66SAndroid Build Coastguard Worker #define ASSERT_THAT(value, matcher) \
5457*481dde66SAndroid Build Coastguard Worker ASSERT_PRED_FORMAT1( \
5458*481dde66SAndroid Build Coastguard Worker ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
5459*481dde66SAndroid Build Coastguard Worker #define EXPECT_THAT(value, matcher) \
5460*481dde66SAndroid Build Coastguard Worker EXPECT_PRED_FORMAT1( \
5461*481dde66SAndroid Build Coastguard Worker ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
5462*481dde66SAndroid Build Coastguard Worker
5463*481dde66SAndroid Build Coastguard Worker // MATCHER* macros itself are listed below.
5464*481dde66SAndroid Build Coastguard Worker #define MATCHER(name, description) \
5465*481dde66SAndroid Build Coastguard Worker class name##Matcher \
5466*481dde66SAndroid Build Coastguard Worker : public ::testing::internal::MatcherBaseImpl<name##Matcher> { \
5467*481dde66SAndroid Build Coastguard Worker public: \
5468*481dde66SAndroid Build Coastguard Worker template <typename arg_type> \
5469*481dde66SAndroid Build Coastguard Worker class gmock_Impl : public ::testing::MatcherInterface<const arg_type&> { \
5470*481dde66SAndroid Build Coastguard Worker public: \
5471*481dde66SAndroid Build Coastguard Worker gmock_Impl() {} \
5472*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain( \
5473*481dde66SAndroid Build Coastguard Worker const arg_type& arg, \
5474*481dde66SAndroid Build Coastguard Worker ::testing::MatchResultListener* result_listener) const override; \
5475*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* gmock_os) const override { \
5476*481dde66SAndroid Build Coastguard Worker *gmock_os << FormatDescription(false); \
5477*481dde66SAndroid Build Coastguard Worker } \
5478*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* gmock_os) const override { \
5479*481dde66SAndroid Build Coastguard Worker *gmock_os << FormatDescription(true); \
5480*481dde66SAndroid Build Coastguard Worker } \
5481*481dde66SAndroid Build Coastguard Worker \
5482*481dde66SAndroid Build Coastguard Worker private: \
5483*481dde66SAndroid Build Coastguard Worker ::std::string FormatDescription(bool negation) const { \
5484*481dde66SAndroid Build Coastguard Worker /* NOLINTNEXTLINE readability-redundant-string-init */ \
5485*481dde66SAndroid Build Coastguard Worker ::std::string gmock_description = (description); \
5486*481dde66SAndroid Build Coastguard Worker if (!gmock_description.empty()) { \
5487*481dde66SAndroid Build Coastguard Worker return gmock_description; \
5488*481dde66SAndroid Build Coastguard Worker } \
5489*481dde66SAndroid Build Coastguard Worker return ::testing::internal::FormatMatcherDescription(negation, #name, \
5490*481dde66SAndroid Build Coastguard Worker {}, {}); \
5491*481dde66SAndroid Build Coastguard Worker } \
5492*481dde66SAndroid Build Coastguard Worker }; \
5493*481dde66SAndroid Build Coastguard Worker }; \
5494*481dde66SAndroid Build Coastguard Worker inline name##Matcher GMOCK_INTERNAL_WARNING_PUSH() \
5495*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-function") \
5496*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \
5497*481dde66SAndroid Build Coastguard Worker name GMOCK_INTERNAL_WARNING_POP()() { \
5498*481dde66SAndroid Build Coastguard Worker return {}; \
5499*481dde66SAndroid Build Coastguard Worker } \
5500*481dde66SAndroid Build Coastguard Worker template <typename arg_type> \
5501*481dde66SAndroid Build Coastguard Worker bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain( \
5502*481dde66SAndroid Build Coastguard Worker const arg_type& arg, \
5503*481dde66SAndroid Build Coastguard Worker GTEST_INTERNAL_ATTRIBUTE_MAYBE_UNUSED ::testing::MatchResultListener* \
5504*481dde66SAndroid Build Coastguard Worker result_listener) const
5505*481dde66SAndroid Build Coastguard Worker
5506*481dde66SAndroid Build Coastguard Worker #define MATCHER_P(name, p0, description) \
5507*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP, description, (#p0), (p0))
5508*481dde66SAndroid Build Coastguard Worker #define MATCHER_P2(name, p0, p1, description) \
5509*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP2, description, (#p0, #p1), \
5510*481dde66SAndroid Build Coastguard Worker (p0, p1))
5511*481dde66SAndroid Build Coastguard Worker #define MATCHER_P3(name, p0, p1, p2, description) \
5512*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP3, description, (#p0, #p1, #p2), \
5513*481dde66SAndroid Build Coastguard Worker (p0, p1, p2))
5514*481dde66SAndroid Build Coastguard Worker #define MATCHER_P4(name, p0, p1, p2, p3, description) \
5515*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP4, description, \
5516*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3), (p0, p1, p2, p3))
5517*481dde66SAndroid Build Coastguard Worker #define MATCHER_P5(name, p0, p1, p2, p3, p4, description) \
5518*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP5, description, \
5519*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4), (p0, p1, p2, p3, p4))
5520*481dde66SAndroid Build Coastguard Worker #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description) \
5521*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP6, description, \
5522*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4, #p5), \
5523*481dde66SAndroid Build Coastguard Worker (p0, p1, p2, p3, p4, p5))
5524*481dde66SAndroid Build Coastguard Worker #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description) \
5525*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP7, description, \
5526*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4, #p5, #p6), \
5527*481dde66SAndroid Build Coastguard Worker (p0, p1, p2, p3, p4, p5, p6))
5528*481dde66SAndroid Build Coastguard Worker #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description) \
5529*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP8, description, \
5530*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7), \
5531*481dde66SAndroid Build Coastguard Worker (p0, p1, p2, p3, p4, p5, p6, p7))
5532*481dde66SAndroid Build Coastguard Worker #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description) \
5533*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP9, description, \
5534*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7, #p8), \
5535*481dde66SAndroid Build Coastguard Worker (p0, p1, p2, p3, p4, p5, p6, p7, p8))
5536*481dde66SAndroid Build Coastguard Worker #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description) \
5537*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER(name, name##MatcherP10, description, \
5538*481dde66SAndroid Build Coastguard Worker (#p0, #p1, #p2, #p3, #p4, #p5, #p6, #p7, #p8, #p9), \
5539*481dde66SAndroid Build Coastguard Worker (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9))
5540*481dde66SAndroid Build Coastguard Worker
5541*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER(name, full_name, description, arg_names, args) \
5542*481dde66SAndroid Build Coastguard Worker template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)> \
5543*481dde66SAndroid Build Coastguard Worker class full_name : public ::testing::internal::MatcherBaseImpl< \
5544*481dde66SAndroid Build Coastguard Worker full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>> { \
5545*481dde66SAndroid Build Coastguard Worker public: \
5546*481dde66SAndroid Build Coastguard Worker using full_name::MatcherBaseImpl::MatcherBaseImpl; \
5547*481dde66SAndroid Build Coastguard Worker template <typename arg_type> \
5548*481dde66SAndroid Build Coastguard Worker class gmock_Impl : public ::testing::MatcherInterface<const arg_type&> { \
5549*481dde66SAndroid Build Coastguard Worker public: \
5550*481dde66SAndroid Build Coastguard Worker explicit gmock_Impl(GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args)) \
5551*481dde66SAndroid Build Coastguard Worker : GMOCK_INTERNAL_MATCHER_FORWARD_ARGS(args) {} \
5552*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain( \
5553*481dde66SAndroid Build Coastguard Worker const arg_type& arg, \
5554*481dde66SAndroid Build Coastguard Worker ::testing::MatchResultListener* result_listener) const override; \
5555*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* gmock_os) const override { \
5556*481dde66SAndroid Build Coastguard Worker *gmock_os << FormatDescription(false); \
5557*481dde66SAndroid Build Coastguard Worker } \
5558*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(::std::ostream* gmock_os) const override { \
5559*481dde66SAndroid Build Coastguard Worker *gmock_os << FormatDescription(true); \
5560*481dde66SAndroid Build Coastguard Worker } \
5561*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER_MEMBERS(args) \
5562*481dde66SAndroid Build Coastguard Worker \
5563*481dde66SAndroid Build Coastguard Worker private: \
5564*481dde66SAndroid Build Coastguard Worker ::std::string FormatDescription(bool negation) const { \
5565*481dde66SAndroid Build Coastguard Worker ::std::string gmock_description; \
5566*481dde66SAndroid Build Coastguard Worker gmock_description = (description); \
5567*481dde66SAndroid Build Coastguard Worker if (!gmock_description.empty()) { \
5568*481dde66SAndroid Build Coastguard Worker return gmock_description; \
5569*481dde66SAndroid Build Coastguard Worker } \
5570*481dde66SAndroid Build Coastguard Worker return ::testing::internal::FormatMatcherDescription( \
5571*481dde66SAndroid Build Coastguard Worker negation, #name, {GMOCK_PP_REMOVE_PARENS(arg_names)}, \
5572*481dde66SAndroid Build Coastguard Worker ::testing::internal::UniversalTersePrintTupleFieldsToStrings( \
5573*481dde66SAndroid Build Coastguard Worker ::std::tuple<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>( \
5574*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args)))); \
5575*481dde66SAndroid Build Coastguard Worker } \
5576*481dde66SAndroid Build Coastguard Worker }; \
5577*481dde66SAndroid Build Coastguard Worker }; \
5578*481dde66SAndroid Build Coastguard Worker template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)> \
5579*481dde66SAndroid Build Coastguard Worker inline full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)> name( \
5580*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args)) { \
5581*481dde66SAndroid Build Coastguard Worker return full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>( \
5582*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER_ARGS_USAGE(args)); \
5583*481dde66SAndroid Build Coastguard Worker } \
5584*481dde66SAndroid Build Coastguard Worker template <GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args)> \
5585*481dde66SAndroid Build Coastguard Worker template <typename arg_type> \
5586*481dde66SAndroid Build Coastguard Worker bool full_name<GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args)>:: \
5587*481dde66SAndroid Build Coastguard Worker gmock_Impl<arg_type>::MatchAndExplain( \
5588*481dde66SAndroid Build Coastguard Worker const arg_type& arg, \
5589*481dde66SAndroid Build Coastguard Worker GTEST_INTERNAL_ATTRIBUTE_MAYBE_UNUSED ::testing:: \
5590*481dde66SAndroid Build Coastguard Worker MatchResultListener* result_listener) const
5591*481dde66SAndroid Build Coastguard Worker
5592*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAMS(args) \
5593*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL( \
5594*481dde66SAndroid Build Coastguard Worker GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAM, , args))
5595*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_TEMPLATE_PARAM(i_unused, data_unused, arg) \
5596*481dde66SAndroid Build Coastguard Worker , typename arg##_type
5597*481dde66SAndroid Build Coastguard Worker
5598*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_TYPE_PARAMS(args) \
5599*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_TYPE_PARAM, , args))
5600*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_TYPE_PARAM(i_unused, data_unused, arg) \
5601*481dde66SAndroid Build Coastguard Worker , arg##_type
5602*481dde66SAndroid Build Coastguard Worker
5603*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_FUNCTION_ARGS(args) \
5604*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL(dummy_first GMOCK_PP_FOR_EACH( \
5605*481dde66SAndroid Build Coastguard Worker GMOCK_INTERNAL_MATCHER_FUNCTION_ARG, , args))
5606*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_FUNCTION_ARG(i, data_unused, arg) \
5607*481dde66SAndroid Build Coastguard Worker , arg##_type gmock_p##i
5608*481dde66SAndroid Build Coastguard Worker
5609*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_FORWARD_ARGS(args) \
5610*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_FORWARD_ARG, , args))
5611*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_FORWARD_ARG(i, data_unused, arg) \
5612*481dde66SAndroid Build Coastguard Worker , arg(::std::forward<arg##_type>(gmock_p##i))
5613*481dde66SAndroid Build Coastguard Worker
5614*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_MEMBERS(args) \
5615*481dde66SAndroid Build Coastguard Worker GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_MEMBER, , args)
5616*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_MEMBER(i_unused, data_unused, arg) \
5617*481dde66SAndroid Build Coastguard Worker const arg##_type arg;
5618*481dde66SAndroid Build Coastguard Worker
5619*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_MEMBERS_USAGE(args) \
5620*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_MEMBER_USAGE, , args))
5621*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_MEMBER_USAGE(i_unused, data_unused, arg) , arg
5622*481dde66SAndroid Build Coastguard Worker
5623*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_ARGS_USAGE(args) \
5624*481dde66SAndroid Build Coastguard Worker GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_MATCHER_ARG_USAGE, , args))
5625*481dde66SAndroid Build Coastguard Worker #define GMOCK_INTERNAL_MATCHER_ARG_USAGE(i, data_unused, arg) \
5626*481dde66SAndroid Build Coastguard Worker , ::std::forward<arg##_type>(gmock_p##i)
5627*481dde66SAndroid Build Coastguard Worker
5628*481dde66SAndroid Build Coastguard Worker // To prevent ADL on certain functions we put them on a separate namespace.
5629*481dde66SAndroid Build Coastguard Worker using namespace no_adl; // NOLINT
5630*481dde66SAndroid Build Coastguard Worker
5631*481dde66SAndroid Build Coastguard Worker } // namespace testing
5632*481dde66SAndroid Build Coastguard Worker
5633*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046
5634*481dde66SAndroid Build Coastguard Worker
5635*481dde66SAndroid Build Coastguard Worker // Include any custom callback matchers added by the local installation.
5636*481dde66SAndroid Build Coastguard Worker // We must include this header at the end to make sure it can use the
5637*481dde66SAndroid Build Coastguard Worker // declarations from this file.
5638*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/custom/gmock-matchers.h"
5639*481dde66SAndroid Build Coastguard Worker
5640*481dde66SAndroid Build Coastguard Worker #endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
5641