1 // Copyright 2007, Google Inc.
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 // Google Mock - a framework for writing C++ mock classes.
33 // This file implements some commonly used argument matchers. More
34 // matchers can be defined by the user implementing the
35 // MatcherInterface<T> interface if necessary.
37 // See googletest/include/gtest/gtest-matchers.h for the definition of class
38 // Matcher, class MatcherInterface, and others.
40 // GOOGLETEST_CM0002 DO NOT DELETE
42 // IWYU pragma: private, include "gmock/gmock.h"
44 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
45 #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
49 #include <initializer_list>
53 #include <ostream> // NOLINT
56 #include <type_traits>
59 #include "gmock/internal/gmock-internal-utils.h"
60 #include "gmock/internal/gmock-port.h"
61 #include "gtest/gtest.h"
63 // MSVC warning C5046 is new as of VS2017 version 15.8.
64 #if defined(_MSC_VER) && _MSC_VER >= 1915
65 #define GMOCK_MAYBE_5046_ 5046
67 #define GMOCK_MAYBE_5046_
70 GTEST_DISABLE_MSC_WARNINGS_PUSH_(
71 4251 GMOCK_MAYBE_5046_
/* class A needs to have dll-interface to be used by
73 /* Symbol involving type with internal linkage not defined */)
76 #if __has_warning("-Wdeprecated-copy")
77 #pragma clang diagnostic push
78 #pragma clang diagnostic ignored "-Wdeprecated-copy"
84 // To implement a matcher Foo for type T, define:
85 // 1. a class FooMatcherImpl that implements the
86 // MatcherInterface<T> interface, and
87 // 2. a factory function that creates a Matcher<T> object from a
90 // The two-level delegation design makes it possible to allow a user
91 // to write "v" instead of "Eq(v)" where a Matcher is expected, which
92 // is impossible if we pass matchers by pointers. It also eases
93 // ownership management as Matcher objects can now be copied like
96 // A match result listener that stores the explanation in a string.
97 class StringMatchResultListener
: public MatchResultListener
{
99 StringMatchResultListener() : MatchResultListener(&ss_
) {}
101 // Returns the explanation accumulated so far.
102 std::string
str() const { return ss_
.str(); }
104 // Clears the explanation accumulated so far.
105 void Clear() { ss_
.str(""); }
108 ::std::stringstream ss_
;
110 GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener
);
113 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
114 // and MUST NOT BE USED IN USER CODE!!!
117 // The MatcherCastImpl class template is a helper for implementing
118 // MatcherCast(). We need this helper in order to partially
119 // specialize the implementation of MatcherCast() (C++ allows
120 // class/struct templates to be partially specialized, but not
121 // function templates.).
123 // This general version is used when MatcherCast()'s argument is a
124 // polymorphic matcher (i.e. something that can be converted to a
125 // Matcher but is not one yet; for example, Eq(value)) or a value (for
126 // example, "hello").
127 template <typename T
, typename M
>
128 class MatcherCastImpl
{
130 static Matcher
<T
> Cast(const M
& polymorphic_matcher_or_value
) {
131 // M can be a polymorphic matcher, in which case we want to use
132 // its conversion operator to create Matcher<T>. Or it can be a value
133 // that should be passed to the Matcher<T>'s constructor.
135 // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
136 // polymorphic matcher because it'll be ambiguous if T has an implicit
137 // constructor from M (this usually happens when T has an implicit
138 // constructor from any type).
140 // It won't work to unconditionally implict_cast
141 // polymorphic_matcher_or_value to Matcher<T> because it won't trigger
142 // a user-defined conversion from M to T if one exists (assuming M is
144 return CastImpl(polymorphic_matcher_or_value
,
145 std::is_convertible
<M
, Matcher
<T
>>{},
146 std::is_convertible
<M
, T
>{});
150 template <bool Ignore
>
151 static Matcher
<T
> CastImpl(const M
& polymorphic_matcher_or_value
,
152 std::true_type
/* convertible_to_matcher */,
153 bool_constant
<Ignore
>) {
154 // M is implicitly convertible to Matcher<T>, which means that either
155 // M is a polymorphic matcher or Matcher<T> has an implicit constructor
156 // from M. In both cases using the implicit conversion will produce a
159 // Even if T has an implicit constructor from M, it won't be called because
160 // creating Matcher<T> would require a chain of two user-defined conversions
161 // (first to create T from M and then to create Matcher<T> from T).
162 return polymorphic_matcher_or_value
;
165 // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
166 // matcher. It's a value of a type implicitly convertible to T. Use direct
167 // initialization to create a matcher.
168 static Matcher
<T
> CastImpl(const M
& value
,
169 std::false_type
/* convertible_to_matcher */,
170 std::true_type
/* convertible_to_T */) {
171 return Matcher
<T
>(ImplicitCast_
<T
>(value
));
174 // M can't be implicitly converted to either Matcher<T> or T. Attempt to use
175 // polymorphic matcher Eq(value) in this case.
177 // Note that we first attempt to perform an implicit cast on the value and
178 // only fall back to the polymorphic Eq() matcher afterwards because the
179 // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end
180 // which might be undefined even when Rhs is implicitly convertible to Lhs
181 // (e.g. std::pair<const int, int> vs. std::pair<int, int>).
183 // We don't define this method inline as we need the declaration of Eq().
184 static Matcher
<T
> CastImpl(const M
& value
,
185 std::false_type
/* convertible_to_matcher */,
186 std::false_type
/* convertible_to_T */);
189 // This more specialized version is used when MatcherCast()'s argument
190 // is already a Matcher. This only compiles when type T can be
191 // statically converted to type U.
192 template <typename T
, typename U
>
193 class MatcherCastImpl
<T
, Matcher
<U
> > {
195 static Matcher
<T
> Cast(const Matcher
<U
>& source_matcher
) {
196 return Matcher
<T
>(new Impl(source_matcher
));
200 class Impl
: public MatcherInterface
<T
> {
202 explicit Impl(const Matcher
<U
>& source_matcher
)
203 : source_matcher_(source_matcher
) {}
205 // We delegate the matching logic to the source matcher.
206 bool MatchAndExplain(T x
, MatchResultListener
* listener
) const override
{
207 using FromType
= typename
std::remove_cv
<typename
std::remove_pointer
<
208 typename
std::remove_reference
<T
>::type
>::type
>::type
;
209 using ToType
= typename
std::remove_cv
<typename
std::remove_pointer
<
210 typename
std::remove_reference
<U
>::type
>::type
>::type
;
211 // Do not allow implicitly converting base*/& to derived*/&.
213 // Do not trigger if only one of them is a pointer. That implies a
214 // regular conversion and not a down_cast.
215 (std::is_pointer
<typename
std::remove_reference
<T
>::type
>::value
!=
216 std::is_pointer
<typename
std::remove_reference
<U
>::type
>::value
) ||
217 std::is_same
<FromType
, ToType
>::value
||
218 !std::is_base_of
<FromType
, ToType
>::value
,
219 "Can't implicitly convert from <base> to <derived>");
221 return source_matcher_
.MatchAndExplain(static_cast<U
>(x
), listener
);
224 void DescribeTo(::std::ostream
* os
) const override
{
225 source_matcher_
.DescribeTo(os
);
228 void DescribeNegationTo(::std::ostream
* os
) const override
{
229 source_matcher_
.DescribeNegationTo(os
);
233 const Matcher
<U
> source_matcher_
;
235 GTEST_DISALLOW_ASSIGN_(Impl
);
239 // This even more specialized version is used for efficiently casting
240 // a matcher to its own type.
241 template <typename T
>
242 class MatcherCastImpl
<T
, Matcher
<T
> > {
244 static Matcher
<T
> Cast(const Matcher
<T
>& matcher
) { return matcher
; }
247 } // namespace internal
249 // In order to be safe and clear, casting between different matcher
250 // types is done explicitly via MatcherCast<T>(m), which takes a
251 // matcher m and returns a Matcher<T>. It compiles only when T can be
252 // statically converted to the argument type of m.
253 template <typename T
, typename M
>
254 inline Matcher
<T
> MatcherCast(const M
& matcher
) {
255 return internal::MatcherCastImpl
<T
, M
>::Cast(matcher
);
258 // Implements SafeMatcherCast().
260 // FIXME: The intermediate SafeMatcherCastImpl class was introduced as a
261 // workaround for a compiler bug, and can now be removed.
262 template <typename T
>
263 class SafeMatcherCastImpl
{
265 // This overload handles polymorphic matchers and values only since
266 // monomorphic matchers are handled by the next one.
267 template <typename M
>
268 static inline Matcher
<T
> Cast(const M
& polymorphic_matcher_or_value
) {
269 return internal::MatcherCastImpl
<T
, M
>::Cast(polymorphic_matcher_or_value
);
272 // This overload handles monomorphic matchers.
274 // In general, if type T can be implicitly converted to type U, we can
275 // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
276 // contravariant): just keep a copy of the original Matcher<U>, convert the
277 // argument from type T to U, and then pass it to the underlying Matcher<U>.
278 // The only exception is when U is a reference and T is not, as the
279 // underlying Matcher<U> may be interested in the argument's address, which
280 // is not preserved in the conversion from T to U.
281 template <typename U
>
282 static inline Matcher
<T
> Cast(const Matcher
<U
>& matcher
) {
283 // Enforce that T can be implicitly converted to U.
284 GTEST_COMPILE_ASSERT_((std::is_convertible
<T
, U
>::value
),
285 "T must be implicitly convertible to U");
286 // Enforce that we are not converting a non-reference type T to a reference
288 GTEST_COMPILE_ASSERT_(
289 std::is_reference
<T
>::value
|| !std::is_reference
<U
>::value
,
290 cannot_convert_non_reference_arg_to_reference
);
291 // In case both T and U are arithmetic types, enforce that the
292 // conversion is not lossy.
293 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T
) RawT
;
294 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U
) RawU
;
295 const bool kTIsOther
= GMOCK_KIND_OF_(RawT
) == internal::kOther
;
296 const bool kUIsOther
= GMOCK_KIND_OF_(RawU
) == internal::kOther
;
297 GTEST_COMPILE_ASSERT_(
298 kTIsOther
|| kUIsOther
||
299 (internal::LosslessArithmeticConvertible
<RawT
, RawU
>::value
),
300 conversion_of_arithmetic_types_must_be_lossless
);
301 return MatcherCast
<T
>(matcher
);
305 template <typename T
, typename M
>
306 inline Matcher
<T
> SafeMatcherCast(const M
& polymorphic_matcher
) {
307 return SafeMatcherCastImpl
<T
>::Cast(polymorphic_matcher
);
310 // A<T>() returns a matcher that matches any value of type T.
311 template <typename T
>
314 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
315 // and MUST NOT BE USED IN USER CODE!!!
318 // If the explanation is not empty, prints it to the ostream.
319 inline void PrintIfNotEmpty(const std::string
& explanation
,
320 ::std::ostream
* os
) {
321 if (explanation
!= "" && os
!= nullptr) {
322 *os
<< ", " << explanation
;
326 // Returns true if the given type name is easy to read by a human.
327 // This is used to decide whether printing the type of a value might
329 inline bool IsReadableTypeName(const std::string
& type_name
) {
330 // We consider a type name readable if it's short or doesn't contain
331 // a template or function type.
332 return (type_name
.length() <= 20 ||
333 type_name
.find_first_of("<(") == std::string::npos
);
336 // Matches the value against the given matcher, prints the value and explains
337 // the match result to the listener. Returns the match result.
338 // 'listener' must not be NULL.
339 // Value cannot be passed by const reference, because some matchers take a
340 // non-const argument.
341 template <typename Value
, typename T
>
342 bool MatchPrintAndExplain(Value
& value
, const Matcher
<T
>& matcher
,
343 MatchResultListener
* listener
) {
344 if (!listener
->IsInterested()) {
345 // If the listener is not interested, we do not need to construct the
346 // inner explanation.
347 return matcher
.Matches(value
);
350 StringMatchResultListener inner_listener
;
351 const bool match
= matcher
.MatchAndExplain(value
, &inner_listener
);
353 UniversalPrint(value
, listener
->stream());
355 const std::string
& type_name
= GetTypeName
<Value
>();
356 if (IsReadableTypeName(type_name
))
357 *listener
->stream() << " (of type " << type_name
<< ")";
359 PrintIfNotEmpty(inner_listener
.str(), listener
->stream());
364 // An internal helper class for doing compile-time loop on a tuple's
369 // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
370 // if and only if the first N fields of matcher_tuple matches
371 // the first N fields of value_tuple, respectively.
372 template <typename MatcherTuple
, typename ValueTuple
>
373 static bool Matches(const MatcherTuple
& matcher_tuple
,
374 const ValueTuple
& value_tuple
) {
375 return TuplePrefix
<N
- 1>::Matches(matcher_tuple
, value_tuple
) &&
376 std::get
<N
- 1>(matcher_tuple
).Matches(std::get
<N
- 1>(value_tuple
));
379 // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
380 // describes failures in matching the first N fields of matchers
381 // against the first N fields of values. If there is no failure,
382 // nothing will be streamed to os.
383 template <typename MatcherTuple
, typename ValueTuple
>
384 static void ExplainMatchFailuresTo(const MatcherTuple
& matchers
,
385 const ValueTuple
& values
,
386 ::std::ostream
* os
) {
387 // First, describes failures in the first N - 1 fields.
388 TuplePrefix
<N
- 1>::ExplainMatchFailuresTo(matchers
, values
, os
);
390 // Then describes the failure (if any) in the (N - 1)-th (0-based)
392 typename
std::tuple_element
<N
- 1, MatcherTuple
>::type matcher
=
393 std::get
<N
- 1>(matchers
);
394 typedef typename
std::tuple_element
<N
- 1, ValueTuple
>::type Value
;
395 const Value
& value
= std::get
<N
- 1>(values
);
396 StringMatchResultListener listener
;
397 if (!matcher
.MatchAndExplain(value
, &listener
)) {
398 *os
<< " Expected arg #" << N
- 1 << ": ";
399 std::get
<N
- 1>(matchers
).DescribeTo(os
);
400 *os
<< "\n Actual: ";
401 // We remove the reference in type Value to prevent the
402 // universal printer from printing the address of value, which
403 // isn't interesting to the user most of the time. The
404 // matcher's MatchAndExplain() method handles the case when
405 // the address is interesting.
406 internal::UniversalPrint(value
, os
);
407 PrintIfNotEmpty(listener
.str(), os
);
415 class TuplePrefix
<0> {
417 template <typename MatcherTuple
, typename ValueTuple
>
418 static bool Matches(const MatcherTuple
& /* matcher_tuple */,
419 const ValueTuple
& /* value_tuple */) {
423 template <typename MatcherTuple
, typename ValueTuple
>
424 static void ExplainMatchFailuresTo(const MatcherTuple
& /* matchers */,
425 const ValueTuple
& /* values */,
426 ::std::ostream
* /* os */) {}
429 // TupleMatches(matcher_tuple, value_tuple) returns true if and only if
430 // all matchers in matcher_tuple match the corresponding fields in
431 // value_tuple. It is a compiler error if matcher_tuple and
432 // value_tuple have different number of fields or incompatible field
434 template <typename MatcherTuple
, typename ValueTuple
>
435 bool TupleMatches(const MatcherTuple
& matcher_tuple
,
436 const ValueTuple
& value_tuple
) {
437 // Makes sure that matcher_tuple and value_tuple have the same
439 GTEST_COMPILE_ASSERT_(std::tuple_size
<MatcherTuple
>::value
==
440 std::tuple_size
<ValueTuple
>::value
,
441 matcher_and_value_have_different_numbers_of_fields
);
442 return TuplePrefix
<std::tuple_size
<ValueTuple
>::value
>::Matches(matcher_tuple
,
446 // Describes failures in matching matchers against values. If there
447 // is no failure, nothing will be streamed to os.
448 template <typename MatcherTuple
, typename ValueTuple
>
449 void ExplainMatchFailureTupleTo(const MatcherTuple
& matchers
,
450 const ValueTuple
& values
,
451 ::std::ostream
* os
) {
452 TuplePrefix
<std::tuple_size
<MatcherTuple
>::value
>::ExplainMatchFailuresTo(
453 matchers
, values
, os
);
456 // TransformTupleValues and its helper.
458 // TransformTupleValuesHelper hides the internal machinery that
459 // TransformTupleValues uses to implement a tuple traversal.
460 template <typename Tuple
, typename Func
, typename OutIter
>
461 class TransformTupleValuesHelper
{
463 typedef ::std::tuple_size
<Tuple
> TupleSize
;
466 // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
467 // Returns the final value of 'out' in case the caller needs it.
468 static OutIter
Run(Func f
, const Tuple
& t
, OutIter out
) {
469 return IterateOverTuple
<Tuple
, TupleSize::value
>()(f
, t
, out
);
473 template <typename Tup
, size_t kRemainingSize
>
474 struct IterateOverTuple
{
475 OutIter
operator() (Func f
, const Tup
& t
, OutIter out
) const {
476 *out
++ = f(::std::get
<TupleSize::value
- kRemainingSize
>(t
));
477 return IterateOverTuple
<Tup
, kRemainingSize
- 1>()(f
, t
, out
);
480 template <typename Tup
>
481 struct IterateOverTuple
<Tup
, 0> {
482 OutIter
operator() (Func
/* f */, const Tup
& /* t */, OutIter out
) const {
488 // Successively invokes 'f(element)' on each element of the tuple 't',
489 // appending each result to the 'out' iterator. Returns the final value
491 template <typename Tuple
, typename Func
, typename OutIter
>
492 OutIter
TransformTupleValues(Func f
, const Tuple
& t
, OutIter out
) {
493 return TransformTupleValuesHelper
<Tuple
, Func
, OutIter
>::Run(f
, t
, out
);
496 // Implements A<T>().
497 template <typename T
>
498 class AnyMatcherImpl
: public MatcherInterface
<const T
&> {
500 bool MatchAndExplain(const T
& /* x */,
501 MatchResultListener
* /* listener */) const override
{
504 void DescribeTo(::std::ostream
* os
) const override
{ *os
<< "is anything"; }
505 void DescribeNegationTo(::std::ostream
* os
) const override
{
506 // This is mostly for completeness' safe, as it's not very useful
507 // to write Not(A<bool>()). However we cannot completely rule out
508 // such a possibility, and it doesn't hurt to be prepared.
509 *os
<< "never matches";
513 // Implements _, a matcher that matches any value of any
514 // type. This is a polymorphic matcher, so we need a template type
515 // conversion operator to make it appearing as a Matcher<T> for any
517 class AnythingMatcher
{
519 template <typename T
>
520 operator Matcher
<T
>() const { return A
<T
>(); }
523 // Implements the polymorphic IsNull() matcher, which matches any raw or smart
524 // pointer that is NULL.
525 class IsNullMatcher
{
527 template <typename Pointer
>
528 bool MatchAndExplain(const Pointer
& p
,
529 MatchResultListener
* /* listener */) const {
533 void DescribeTo(::std::ostream
* os
) const { *os
<< "is NULL"; }
534 void DescribeNegationTo(::std::ostream
* os
) const {
539 // Implements the polymorphic NotNull() matcher, which matches any raw or smart
540 // pointer that is not NULL.
541 class NotNullMatcher
{
543 template <typename Pointer
>
544 bool MatchAndExplain(const Pointer
& p
,
545 MatchResultListener
* /* listener */) const {
549 void DescribeTo(::std::ostream
* os
) const { *os
<< "isn't NULL"; }
550 void DescribeNegationTo(::std::ostream
* os
) const {
555 // Ref(variable) matches any argument that is a reference to
556 // 'variable'. This matcher is polymorphic as it can match any
557 // super type of the type of 'variable'.
559 // The RefMatcher template class implements Ref(variable). It can
560 // only be instantiated with a reference type. This prevents a user
561 // from mistakenly using Ref(x) to match a non-reference function
562 // argument. For example, the following will righteously cause a
566 // Matcher<int> m1 = Ref(n); // This won't compile.
567 // Matcher<int&> m2 = Ref(n); // This will compile.
568 template <typename T
>
571 template <typename T
>
572 class RefMatcher
<T
&> {
573 // Google Mock is a generic framework and thus needs to support
574 // mocking any function types, including those that take non-const
575 // reference arguments. Therefore the template parameter T (and
576 // Super below) can be instantiated to either a const type or a
579 // RefMatcher() takes a T& instead of const T&, as we want the
580 // compiler to catch using Ref(const_value) as a matcher for a
581 // non-const reference.
582 explicit RefMatcher(T
& x
) : object_(x
) {} // NOLINT
584 template <typename Super
>
585 operator Matcher
<Super
&>() const {
586 // By passing object_ (type T&) to Impl(), which expects a Super&,
587 // we make sure that Super is a super type of T. In particular,
588 // this catches using Ref(const_value) as a matcher for a
589 // non-const reference, as you cannot implicitly convert a const
590 // reference to a non-const reference.
591 return MakeMatcher(new Impl
<Super
>(object_
));
595 template <typename Super
>
596 class Impl
: public MatcherInterface
<Super
&> {
598 explicit Impl(Super
& x
) : object_(x
) {} // NOLINT
600 // MatchAndExplain() takes a Super& (as opposed to const Super&)
601 // in order to match the interface MatcherInterface<Super&>.
602 bool MatchAndExplain(Super
& x
,
603 MatchResultListener
* listener
) const override
{
604 *listener
<< "which is located @" << static_cast<const void*>(&x
);
605 return &x
== &object_
;
608 void DescribeTo(::std::ostream
* os
) const override
{
609 *os
<< "references the variable ";
610 UniversalPrinter
<Super
&>::Print(object_
, os
);
613 void DescribeNegationTo(::std::ostream
* os
) const override
{
614 *os
<< "does not reference the variable ";
615 UniversalPrinter
<Super
&>::Print(object_
, os
);
619 const Super
& object_
;
621 GTEST_DISALLOW_ASSIGN_(Impl
);
626 GTEST_DISALLOW_ASSIGN_(RefMatcher
);
629 // Polymorphic helper functions for narrow and wide string matchers.
630 inline bool CaseInsensitiveCStringEquals(const char* lhs
, const char* rhs
) {
631 return String::CaseInsensitiveCStringEquals(lhs
, rhs
);
634 inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs
,
635 const wchar_t* rhs
) {
636 return String::CaseInsensitiveWideCStringEquals(lhs
, rhs
);
639 // String comparison for narrow or wide strings that can have embedded NUL
641 template <typename StringType
>
642 bool CaseInsensitiveStringEquals(const StringType
& s1
,
643 const StringType
& s2
) {
644 // Are the heads equal?
645 if (!CaseInsensitiveCStringEquals(s1
.c_str(), s2
.c_str())) {
649 // Skip the equal heads.
650 const typename
StringType::value_type nul
= 0;
651 const size_t i1
= s1
.find(nul
), i2
= s2
.find(nul
);
653 // Are we at the end of either s1 or s2?
654 if (i1
== StringType::npos
|| i2
== StringType::npos
) {
658 // Are the tails equal?
659 return CaseInsensitiveStringEquals(s1
.substr(i1
+ 1), s2
.substr(i2
+ 1));
664 // Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
665 template <typename StringType
>
666 class StrEqualityMatcher
{
668 StrEqualityMatcher(const StringType
& str
, bool expect_eq
,
670 : string_(str
), expect_eq_(expect_eq
), case_sensitive_(case_sensitive
) {}
673 bool MatchAndExplain(const absl::string_view
& s
,
674 MatchResultListener
* listener
) const {
675 // This should fail to compile if absl::string_view is used with wide
677 const StringType
& str
= std::string(s
);
678 return MatchAndExplain(str
, listener
);
680 #endif // GTEST_HAS_ABSL
682 // Accepts pointer types, particularly:
687 template <typename CharType
>
688 bool MatchAndExplain(CharType
* s
, MatchResultListener
* listener
) const {
692 return MatchAndExplain(StringType(s
), listener
);
695 // Matches anything that can convert to StringType.
697 // This is a template, not just a plain function with const StringType&,
698 // because absl::string_view has some interfering non-explicit constructors.
699 template <typename MatcheeStringType
>
700 bool MatchAndExplain(const MatcheeStringType
& s
,
701 MatchResultListener
* /* listener */) const {
702 const StringType
& s2(s
);
703 const bool eq
= case_sensitive_
? s2
== string_
:
704 CaseInsensitiveStringEquals(s2
, string_
);
705 return expect_eq_
== eq
;
708 void DescribeTo(::std::ostream
* os
) const {
709 DescribeToHelper(expect_eq_
, os
);
712 void DescribeNegationTo(::std::ostream
* os
) const {
713 DescribeToHelper(!expect_eq_
, os
);
717 void DescribeToHelper(bool expect_eq
, ::std::ostream
* os
) const {
718 *os
<< (expect_eq
? "is " : "isn't ");
720 if (!case_sensitive_
) {
721 *os
<< "(ignoring case) ";
723 UniversalPrint(string_
, os
);
726 const StringType string_
;
727 const bool expect_eq_
;
728 const bool case_sensitive_
;
730 GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher
);
733 // Implements the polymorphic HasSubstr(substring) matcher, which
734 // can be used as a Matcher<T> as long as T can be converted to a
736 template <typename StringType
>
737 class HasSubstrMatcher
{
739 explicit HasSubstrMatcher(const StringType
& substring
)
740 : substring_(substring
) {}
743 bool MatchAndExplain(const absl::string_view
& s
,
744 MatchResultListener
* listener
) const {
745 // This should fail to compile if absl::string_view is used with wide
747 const StringType
& str
= std::string(s
);
748 return MatchAndExplain(str
, listener
);
750 #endif // GTEST_HAS_ABSL
752 // Accepts pointer types, particularly:
757 template <typename CharType
>
758 bool MatchAndExplain(CharType
* s
, MatchResultListener
* listener
) const {
759 return s
!= nullptr && MatchAndExplain(StringType(s
), listener
);
762 // Matches anything that can convert to StringType.
764 // This is a template, not just a plain function with const StringType&,
765 // because absl::string_view has some interfering non-explicit constructors.
766 template <typename MatcheeStringType
>
767 bool MatchAndExplain(const MatcheeStringType
& s
,
768 MatchResultListener
* /* listener */) const {
769 const StringType
& s2(s
);
770 return s2
.find(substring_
) != StringType::npos
;
773 // Describes what this matcher matches.
774 void DescribeTo(::std::ostream
* os
) const {
775 *os
<< "has substring ";
776 UniversalPrint(substring_
, os
);
779 void DescribeNegationTo(::std::ostream
* os
) const {
780 *os
<< "has no substring ";
781 UniversalPrint(substring_
, os
);
785 const StringType substring_
;
787 GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher
);
790 // Implements the polymorphic StartsWith(substring) matcher, which
791 // can be used as a Matcher<T> as long as T can be converted to a
793 template <typename StringType
>
794 class StartsWithMatcher
{
796 explicit StartsWithMatcher(const StringType
& prefix
) : prefix_(prefix
) {
800 bool MatchAndExplain(const absl::string_view
& s
,
801 MatchResultListener
* listener
) const {
802 // This should fail to compile if absl::string_view is used with wide
804 const StringType
& str
= std::string(s
);
805 return MatchAndExplain(str
, listener
);
807 #endif // GTEST_HAS_ABSL
809 // Accepts pointer types, particularly:
814 template <typename CharType
>
815 bool MatchAndExplain(CharType
* s
, MatchResultListener
* listener
) const {
816 return s
!= nullptr && MatchAndExplain(StringType(s
), listener
);
819 // Matches anything that can convert to StringType.
821 // This is a template, not just a plain function with const StringType&,
822 // because absl::string_view has some interfering non-explicit constructors.
823 template <typename MatcheeStringType
>
824 bool MatchAndExplain(const MatcheeStringType
& s
,
825 MatchResultListener
* /* listener */) const {
826 const StringType
& s2(s
);
827 return s2
.length() >= prefix_
.length() &&
828 s2
.substr(0, prefix_
.length()) == prefix_
;
831 void DescribeTo(::std::ostream
* os
) const {
832 *os
<< "starts with ";
833 UniversalPrint(prefix_
, os
);
836 void DescribeNegationTo(::std::ostream
* os
) const {
837 *os
<< "doesn't start with ";
838 UniversalPrint(prefix_
, os
);
842 const StringType prefix_
;
844 GTEST_DISALLOW_ASSIGN_(StartsWithMatcher
);
847 // Implements the polymorphic EndsWith(substring) matcher, which
848 // can be used as a Matcher<T> as long as T can be converted to a
850 template <typename StringType
>
851 class EndsWithMatcher
{
853 explicit EndsWithMatcher(const StringType
& suffix
) : suffix_(suffix
) {}
856 bool MatchAndExplain(const absl::string_view
& s
,
857 MatchResultListener
* listener
) const {
858 // This should fail to compile if absl::string_view is used with wide
860 const StringType
& str
= std::string(s
);
861 return MatchAndExplain(str
, listener
);
863 #endif // GTEST_HAS_ABSL
865 // Accepts pointer types, particularly:
870 template <typename CharType
>
871 bool MatchAndExplain(CharType
* s
, MatchResultListener
* listener
) const {
872 return s
!= nullptr && MatchAndExplain(StringType(s
), listener
);
875 // Matches anything that can convert to StringType.
877 // This is a template, not just a plain function with const StringType&,
878 // because absl::string_view has some interfering non-explicit constructors.
879 template <typename MatcheeStringType
>
880 bool MatchAndExplain(const MatcheeStringType
& s
,
881 MatchResultListener
* /* listener */) const {
882 const StringType
& s2(s
);
883 return s2
.length() >= suffix_
.length() &&
884 s2
.substr(s2
.length() - suffix_
.length()) == suffix_
;
887 void DescribeTo(::std::ostream
* os
) const {
889 UniversalPrint(suffix_
, os
);
892 void DescribeNegationTo(::std::ostream
* os
) const {
893 *os
<< "doesn't end with ";
894 UniversalPrint(suffix_
, os
);
898 const StringType suffix_
;
900 GTEST_DISALLOW_ASSIGN_(EndsWithMatcher
);
903 // Implements a matcher that compares the two fields of a 2-tuple
904 // using one of the ==, <=, <, etc, operators. The two fields being
905 // compared don't have to have the same type.
907 // The matcher defined here is polymorphic (for example, Eq() can be
908 // used to match a std::tuple<int, short>, a std::tuple<const long&, double>,
909 // etc). Therefore we use a template type conversion operator in the
911 template <typename D
, typename Op
>
912 class PairMatchBase
{
914 template <typename T1
, typename T2
>
915 operator Matcher
<::std::tuple
<T1
, T2
>>() const {
916 return Matcher
<::std::tuple
<T1
, T2
>>(new Impl
<const ::std::tuple
<T1
, T2
>&>);
918 template <typename T1
, typename T2
>
919 operator Matcher
<const ::std::tuple
<T1
, T2
>&>() const {
920 return MakeMatcher(new Impl
<const ::std::tuple
<T1
, T2
>&>);
924 static ::std::ostream
& GetDesc(::std::ostream
& os
) { // NOLINT
925 return os
<< D::Desc();
928 template <typename Tuple
>
929 class Impl
: public MatcherInterface
<Tuple
> {
931 bool MatchAndExplain(Tuple args
,
932 MatchResultListener
* /* listener */) const override
{
933 return Op()(::std::get
<0>(args
), ::std::get
<1>(args
));
935 void DescribeTo(::std::ostream
* os
) const override
{
936 *os
<< "are " << GetDesc
;
938 void DescribeNegationTo(::std::ostream
* os
) const override
{
939 *os
<< "aren't " << GetDesc
;
944 class Eq2Matcher
: public PairMatchBase
<Eq2Matcher
, AnyEq
> {
946 static const char* Desc() { return "an equal pair"; }
948 class Ne2Matcher
: public PairMatchBase
<Ne2Matcher
, AnyNe
> {
950 static const char* Desc() { return "an unequal pair"; }
952 class Lt2Matcher
: public PairMatchBase
<Lt2Matcher
, AnyLt
> {
954 static const char* Desc() { return "a pair where the first < the second"; }
956 class Gt2Matcher
: public PairMatchBase
<Gt2Matcher
, AnyGt
> {
958 static const char* Desc() { return "a pair where the first > the second"; }
960 class Le2Matcher
: public PairMatchBase
<Le2Matcher
, AnyLe
> {
962 static const char* Desc() { return "a pair where the first <= the second"; }
964 class Ge2Matcher
: public PairMatchBase
<Ge2Matcher
, AnyGe
> {
966 static const char* Desc() { return "a pair where the first >= the second"; }
969 // Implements the Not(...) matcher for a particular argument type T.
970 // We do not nest it inside the NotMatcher class template, as that
971 // will prevent different instantiations of NotMatcher from sharing
972 // the same NotMatcherImpl<T> class.
973 template <typename T
>
974 class NotMatcherImpl
: public MatcherInterface
<const T
&> {
976 explicit NotMatcherImpl(const Matcher
<T
>& matcher
)
977 : matcher_(matcher
) {}
979 bool MatchAndExplain(const T
& x
,
980 MatchResultListener
* listener
) const override
{
981 return !matcher_
.MatchAndExplain(x
, listener
);
984 void DescribeTo(::std::ostream
* os
) const override
{
985 matcher_
.DescribeNegationTo(os
);
988 void DescribeNegationTo(::std::ostream
* os
) const override
{
989 matcher_
.DescribeTo(os
);
993 const Matcher
<T
> matcher_
;
995 GTEST_DISALLOW_ASSIGN_(NotMatcherImpl
);
998 // Implements the Not(m) matcher, which matches a value that doesn't
1000 template <typename InnerMatcher
>
1003 explicit NotMatcher(InnerMatcher matcher
) : matcher_(matcher
) {}
1005 // This template type conversion operator allows Not(m) to be used
1006 // to match any type m can match.
1007 template <typename T
>
1008 operator Matcher
<T
>() const {
1009 return Matcher
<T
>(new NotMatcherImpl
<T
>(SafeMatcherCast
<T
>(matcher_
)));
1013 InnerMatcher matcher_
;
1015 GTEST_DISALLOW_ASSIGN_(NotMatcher
);
1018 // Implements the AllOf(m1, m2) matcher for a particular argument type
1019 // T. We do not nest it inside the BothOfMatcher class template, as
1020 // that will prevent different instantiations of BothOfMatcher from
1021 // sharing the same BothOfMatcherImpl<T> class.
1022 template <typename T
>
1023 class AllOfMatcherImpl
: public MatcherInterface
<const T
&> {
1025 explicit AllOfMatcherImpl(std::vector
<Matcher
<T
> > matchers
)
1026 : matchers_(std::move(matchers
)) {}
1028 void DescribeTo(::std::ostream
* os
) const override
{
1030 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1031 if (i
!= 0) *os
<< ") and (";
1032 matchers_
[i
].DescribeTo(os
);
1037 void DescribeNegationTo(::std::ostream
* os
) const override
{
1039 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1040 if (i
!= 0) *os
<< ") or (";
1041 matchers_
[i
].DescribeNegationTo(os
);
1046 bool MatchAndExplain(const T
& x
,
1047 MatchResultListener
* listener
) const override
{
1048 // If either matcher1_ or matcher2_ doesn't match x, we only need
1049 // to explain why one of them fails.
1050 std::string all_match_result
;
1052 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1053 StringMatchResultListener slistener
;
1054 if (matchers_
[i
].MatchAndExplain(x
, &slistener
)) {
1055 if (all_match_result
.empty()) {
1056 all_match_result
= slistener
.str();
1058 std::string result
= slistener
.str();
1059 if (!result
.empty()) {
1060 all_match_result
+= ", and ";
1061 all_match_result
+= result
;
1065 *listener
<< slistener
.str();
1070 // Otherwise we need to explain why *both* of them match.
1071 *listener
<< all_match_result
;
1076 const std::vector
<Matcher
<T
> > matchers_
;
1078 GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl
);
1081 // VariadicMatcher is used for the variadic implementation of
1082 // AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
1083 // CombiningMatcher<T> is used to recursively combine the provided matchers
1084 // (of type Args...).
1085 template <template <typename T
> class CombiningMatcher
, typename
... Args
>
1086 class VariadicMatcher
{
1088 VariadicMatcher(const Args
&... matchers
) // NOLINT
1089 : matchers_(matchers
...) {
1090 static_assert(sizeof...(Args
) > 0, "Must have at least one matcher.");
1093 // This template type conversion operator allows an
1094 // VariadicMatcher<Matcher1, Matcher2...> object to match any type that
1095 // all of the provided matchers (Matcher1, Matcher2, ...) can match.
1096 template <typename T
>
1097 operator Matcher
<T
>() const {
1098 std::vector
<Matcher
<T
> > values
;
1099 CreateVariadicMatcher
<T
>(&values
, std::integral_constant
<size_t, 0>());
1100 return Matcher
<T
>(new CombiningMatcher
<T
>(std::move(values
)));
1104 template <typename T
, size_t I
>
1105 void CreateVariadicMatcher(std::vector
<Matcher
<T
> >* values
,
1106 std::integral_constant
<size_t, I
>) const {
1107 values
->push_back(SafeMatcherCast
<T
>(std::get
<I
>(matchers_
)));
1108 CreateVariadicMatcher
<T
>(values
, std::integral_constant
<size_t, I
+ 1>());
1111 template <typename T
>
1112 void CreateVariadicMatcher(
1113 std::vector
<Matcher
<T
> >*,
1114 std::integral_constant
<size_t, sizeof...(Args
)>) const {}
1116 std::tuple
<Args
...> matchers_
;
1118 GTEST_DISALLOW_ASSIGN_(VariadicMatcher
);
1121 template <typename
... Args
>
1122 using AllOfMatcher
= VariadicMatcher
<AllOfMatcherImpl
, Args
...>;
1124 // Implements the AnyOf(m1, m2) matcher for a particular argument type
1125 // T. We do not nest it inside the AnyOfMatcher class template, as
1126 // that will prevent different instantiations of AnyOfMatcher from
1127 // sharing the same EitherOfMatcherImpl<T> class.
1128 template <typename T
>
1129 class AnyOfMatcherImpl
: public MatcherInterface
<const T
&> {
1131 explicit AnyOfMatcherImpl(std::vector
<Matcher
<T
> > matchers
)
1132 : matchers_(std::move(matchers
)) {}
1134 void DescribeTo(::std::ostream
* os
) const override
{
1136 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1137 if (i
!= 0) *os
<< ") or (";
1138 matchers_
[i
].DescribeTo(os
);
1143 void DescribeNegationTo(::std::ostream
* os
) const override
{
1145 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1146 if (i
!= 0) *os
<< ") and (";
1147 matchers_
[i
].DescribeNegationTo(os
);
1152 bool MatchAndExplain(const T
& x
,
1153 MatchResultListener
* listener
) const override
{
1154 std::string no_match_result
;
1156 // If either matcher1_ or matcher2_ matches x, we just need to
1157 // explain why *one* of them matches.
1158 for (size_t i
= 0; i
< matchers_
.size(); ++i
) {
1159 StringMatchResultListener slistener
;
1160 if (matchers_
[i
].MatchAndExplain(x
, &slistener
)) {
1161 *listener
<< slistener
.str();
1164 if (no_match_result
.empty()) {
1165 no_match_result
= slistener
.str();
1167 std::string result
= slistener
.str();
1168 if (!result
.empty()) {
1169 no_match_result
+= ", and ";
1170 no_match_result
+= result
;
1176 // Otherwise we need to explain why *both* of them fail.
1177 *listener
<< no_match_result
;
1182 const std::vector
<Matcher
<T
> > matchers_
;
1184 GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl
);
1187 // AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
1188 template <typename
... Args
>
1189 using AnyOfMatcher
= VariadicMatcher
<AnyOfMatcherImpl
, Args
...>;
1191 // Wrapper for implementation of Any/AllOfArray().
1192 template <template <class> class MatcherImpl
, typename T
>
1193 class SomeOfArrayMatcher
{
1195 // Constructs the matcher from a sequence of element values or
1196 // element matchers.
1197 template <typename Iter
>
1198 SomeOfArrayMatcher(Iter first
, Iter last
) : matchers_(first
, last
) {}
1200 template <typename U
>
1201 operator Matcher
<U
>() const { // NOLINT
1202 using RawU
= typename
std::decay
<U
>::type
;
1203 std::vector
<Matcher
<RawU
>> matchers
;
1204 for (const auto& matcher
: matchers_
) {
1205 matchers
.push_back(MatcherCast
<RawU
>(matcher
));
1207 return Matcher
<U
>(new MatcherImpl
<RawU
>(std::move(matchers
)));
1211 const ::std::vector
<T
> matchers_
;
1213 GTEST_DISALLOW_ASSIGN_(SomeOfArrayMatcher
);
1216 template <typename T
>
1217 using AllOfArrayMatcher
= SomeOfArrayMatcher
<AllOfMatcherImpl
, T
>;
1219 template <typename T
>
1220 using AnyOfArrayMatcher
= SomeOfArrayMatcher
<AnyOfMatcherImpl
, T
>;
1222 // Used for implementing Truly(pred), which turns a predicate into a
1224 template <typename Predicate
>
1225 class TrulyMatcher
{
1227 explicit TrulyMatcher(Predicate pred
) : predicate_(pred
) {}
1229 // This method template allows Truly(pred) to be used as a matcher
1230 // for type T where T is the argument type of predicate 'pred'. The
1231 // argument is passed by reference as the predicate may be
1232 // interested in the address of the argument.
1233 template <typename T
>
1234 bool MatchAndExplain(T
& x
, // NOLINT
1235 MatchResultListener
* /* listener */) const {
1236 // Without the if-statement, MSVC sometimes warns about converting
1237 // a value to bool (warning 4800).
1239 // We cannot write 'return !!predicate_(x);' as that doesn't work
1240 // when predicate_(x) returns a class convertible to bool but
1241 // having no operator!().
1247 void DescribeTo(::std::ostream
* os
) const {
1248 *os
<< "satisfies the given predicate";
1251 void DescribeNegationTo(::std::ostream
* os
) const {
1252 *os
<< "doesn't satisfy the given predicate";
1256 Predicate predicate_
;
1258 GTEST_DISALLOW_ASSIGN_(TrulyMatcher
);
1261 // Used for implementing Matches(matcher), which turns a matcher into
1263 template <typename M
>
1264 class MatcherAsPredicate
{
1266 explicit MatcherAsPredicate(M matcher
) : matcher_(matcher
) {}
1268 // This template operator() allows Matches(m) to be used as a
1269 // predicate on type T where m is a matcher on type T.
1271 // The argument x is passed by reference instead of by value, as
1272 // some matcher may be interested in its address (e.g. as in
1273 // Matches(Ref(n))(x)).
1274 template <typename T
>
1275 bool operator()(const T
& x
) const {
1276 // We let matcher_ commit to a particular type here instead of
1277 // when the MatcherAsPredicate object was constructed. This
1278 // allows us to write Matches(m) where m is a polymorphic matcher
1281 // If we write Matcher<T>(matcher_).Matches(x) here, it won't
1282 // compile when matcher_ has type Matcher<const T&>; if we write
1283 // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
1284 // when matcher_ has type Matcher<T>; if we just write
1285 // matcher_.Matches(x), it won't compile when matcher_ is
1286 // polymorphic, e.g. Eq(5).
1288 // MatcherCast<const T&>() is necessary for making the code work
1289 // in all of the above situations.
1290 return MatcherCast
<const T
&>(matcher_
).Matches(x
);
1296 GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate
);
1299 // For implementing ASSERT_THAT() and EXPECT_THAT(). The template
1300 // argument M must be a type that can be converted to a matcher.
1301 template <typename M
>
1302 class PredicateFormatterFromMatcher
{
1304 explicit PredicateFormatterFromMatcher(M m
) : matcher_(std::move(m
)) {}
1306 // This template () operator allows a PredicateFormatterFromMatcher
1307 // object to act as a predicate-formatter suitable for using with
1308 // Google Test's EXPECT_PRED_FORMAT1() macro.
1309 template <typename T
>
1310 AssertionResult
operator()(const char* value_text
, const T
& x
) const {
1311 // We convert matcher_ to a Matcher<const T&> *now* instead of
1312 // when the PredicateFormatterFromMatcher object was constructed,
1313 // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
1314 // know which type to instantiate it to until we actually see the
1317 // We write SafeMatcherCast<const T&>(matcher_) instead of
1318 // Matcher<const T&>(matcher_), as the latter won't compile when
1319 // matcher_ has type Matcher<T> (e.g. An<int>()).
1320 // We don't write MatcherCast<const T&> either, as that allows
1321 // potentially unsafe downcasting of the matcher argument.
1322 const Matcher
<const T
&> matcher
= SafeMatcherCast
<const T
&>(matcher_
);
1324 // The expected path here is that the matcher should match (i.e. that most
1325 // tests pass) so optimize for this case.
1326 if (matcher
.Matches(x
)) {
1327 return AssertionSuccess();
1330 ::std::stringstream ss
;
1331 ss
<< "Value of: " << value_text
<< "\n"
1333 matcher
.DescribeTo(&ss
);
1335 // Rerun the matcher to "PrintAndExain" the failure.
1336 StringMatchResultListener listener
;
1337 if (MatchPrintAndExplain(x
, matcher
, &listener
)) {
1338 ss
<< "\n The matcher failed on the initial attempt; but passed when "
1339 "rerun to generate the explanation.";
1341 ss
<< "\n Actual: " << listener
.str();
1342 return AssertionFailure() << ss
.str();
1348 GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher
);
1351 // A helper function for converting a matcher to a predicate-formatter
1352 // without the user needing to explicitly write the type. This is
1353 // used for implementing ASSERT_THAT() and EXPECT_THAT().
1354 // Implementation detail: 'matcher' is received by-value to force decaying.
1355 template <typename M
>
1356 inline PredicateFormatterFromMatcher
<M
>
1357 MakePredicateFormatterFromMatcher(M matcher
) {
1358 return PredicateFormatterFromMatcher
<M
>(std::move(matcher
));
1361 // Implements the polymorphic floating point equality matcher, which matches
1362 // two float values using ULP-based approximation or, optionally, a
1363 // user-specified epsilon. The template is meant to be instantiated with
1364 // FloatType being either float or double.
1365 template <typename FloatType
>
1366 class FloatingEqMatcher
{
1368 // Constructor for FloatingEqMatcher.
1369 // The matcher's input will be compared with expected. The matcher treats two
1370 // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards,
1371 // equality comparisons between NANs will always return false. We specify a
1372 // negative max_abs_error_ term to indicate that ULP-based approximation will
1373 // be used for comparison.
1374 FloatingEqMatcher(FloatType expected
, bool nan_eq_nan
) :
1375 expected_(expected
), nan_eq_nan_(nan_eq_nan
), max_abs_error_(-1) {
1378 // Constructor that supports a user-specified max_abs_error that will be used
1379 // for comparison instead of ULP-based approximation. The max absolute
1380 // should be non-negative.
1381 FloatingEqMatcher(FloatType expected
, bool nan_eq_nan
,
1382 FloatType max_abs_error
)
1383 : expected_(expected
),
1384 nan_eq_nan_(nan_eq_nan
),
1385 max_abs_error_(max_abs_error
) {
1386 GTEST_CHECK_(max_abs_error
>= 0)
1387 << ", where max_abs_error is" << max_abs_error
;
1390 // Implements floating point equality matcher as a Matcher<T>.
1391 template <typename T
>
1392 class Impl
: public MatcherInterface
<T
> {
1394 Impl(FloatType expected
, bool nan_eq_nan
, FloatType max_abs_error
)
1395 : expected_(expected
),
1396 nan_eq_nan_(nan_eq_nan
),
1397 max_abs_error_(max_abs_error
) {}
1399 bool MatchAndExplain(T value
,
1400 MatchResultListener
* listener
) const override
{
1401 const FloatingPoint
<FloatType
> actual(value
), expected(expected_
);
1403 // Compares NaNs first, if nan_eq_nan_ is true.
1404 if (actual
.is_nan() || expected
.is_nan()) {
1405 if (actual
.is_nan() && expected
.is_nan()) {
1408 // One is nan; the other is not nan.
1411 if (HasMaxAbsError()) {
1412 // We perform an equality check so that inf will match inf, regardless
1413 // of error bounds. If the result of value - expected_ would result in
1414 // overflow or if either value is inf, the default result is infinity,
1415 // which should only match if max_abs_error_ is also infinity.
1416 if (value
== expected_
) {
1420 const FloatType diff
= value
- expected_
;
1421 if (fabs(diff
) <= max_abs_error_
) {
1425 if (listener
->IsInterested()) {
1426 *listener
<< "which is " << diff
<< " from " << expected_
;
1430 return actual
.AlmostEquals(expected
);
1434 void DescribeTo(::std::ostream
* os
) const override
{
1435 // os->precision() returns the previously set precision, which we
1436 // store to restore the ostream to its original configuration
1437 // after outputting.
1438 const ::std::streamsize old_precision
= os
->precision(
1439 ::std::numeric_limits
<FloatType
>::digits10
+ 2);
1440 if (FloatingPoint
<FloatType
>(expected_
).is_nan()) {
1444 *os
<< "never matches";
1447 *os
<< "is approximately " << expected_
;
1448 if (HasMaxAbsError()) {
1449 *os
<< " (absolute error <= " << max_abs_error_
<< ")";
1452 os
->precision(old_precision
);
1455 void DescribeNegationTo(::std::ostream
* os
) const override
{
1456 // As before, get original precision.
1457 const ::std::streamsize old_precision
= os
->precision(
1458 ::std::numeric_limits
<FloatType
>::digits10
+ 2);
1459 if (FloatingPoint
<FloatType
>(expected_
).is_nan()) {
1463 *os
<< "is anything";
1466 *os
<< "isn't approximately " << expected_
;
1467 if (HasMaxAbsError()) {
1468 *os
<< " (absolute error > " << max_abs_error_
<< ")";
1471 // Restore original precision.
1472 os
->precision(old_precision
);
1476 bool HasMaxAbsError() const {
1477 return max_abs_error_
>= 0;
1480 const FloatType expected_
;
1481 const bool nan_eq_nan_
;
1482 // max_abs_error will be used for value comparison when >= 0.
1483 const FloatType max_abs_error_
;
1485 GTEST_DISALLOW_ASSIGN_(Impl
);
1488 // The following 3 type conversion operators allow FloatEq(expected) and
1489 // NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a
1490 // Matcher<const float&>, or a Matcher<float&>, but nothing else.
1491 // (While Google's C++ coding style doesn't allow arguments passed
1492 // by non-const reference, we may see them in code not conforming to
1493 // the style. Therefore Google Mock needs to support them.)
1494 operator Matcher
<FloatType
>() const {
1496 new Impl
<FloatType
>(expected_
, nan_eq_nan_
, max_abs_error_
));
1499 operator Matcher
<const FloatType
&>() const {
1501 new Impl
<const FloatType
&>(expected_
, nan_eq_nan_
, max_abs_error_
));
1504 operator Matcher
<FloatType
&>() const {
1506 new Impl
<FloatType
&>(expected_
, nan_eq_nan_
, max_abs_error_
));
1510 const FloatType expected_
;
1511 const bool nan_eq_nan_
;
1512 // max_abs_error will be used for value comparison when >= 0.
1513 const FloatType max_abs_error_
;
1515 GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher
);
1518 // A 2-tuple ("binary") wrapper around FloatingEqMatcher:
1519 // FloatingEq2Matcher() matches (x, y) by matching FloatingEqMatcher(x, false)
1520 // against y, and FloatingEq2Matcher(e) matches FloatingEqMatcher(x, false, e)
1521 // against y. The former implements "Eq", the latter "Near". At present, there
1522 // is no version that compares NaNs as equal.
1523 template <typename FloatType
>
1524 class FloatingEq2Matcher
{
1526 FloatingEq2Matcher() { Init(-1, false); }
1528 explicit FloatingEq2Matcher(bool nan_eq_nan
) { Init(-1, nan_eq_nan
); }
1530 explicit FloatingEq2Matcher(FloatType max_abs_error
) {
1531 Init(max_abs_error
, false);
1534 FloatingEq2Matcher(FloatType max_abs_error
, bool nan_eq_nan
) {
1535 Init(max_abs_error
, nan_eq_nan
);
1538 template <typename T1
, typename T2
>
1539 operator Matcher
<::std::tuple
<T1
, T2
>>() const {
1541 new Impl
<::std::tuple
<T1
, T2
>>(max_abs_error_
, nan_eq_nan_
));
1543 template <typename T1
, typename T2
>
1544 operator Matcher
<const ::std::tuple
<T1
, T2
>&>() const {
1546 new Impl
<const ::std::tuple
<T1
, T2
>&>(max_abs_error_
, nan_eq_nan_
));
1550 static ::std::ostream
& GetDesc(::std::ostream
& os
) { // NOLINT
1551 return os
<< "an almost-equal pair";
1554 template <typename Tuple
>
1555 class Impl
: public MatcherInterface
<Tuple
> {
1557 Impl(FloatType max_abs_error
, bool nan_eq_nan
) :
1558 max_abs_error_(max_abs_error
),
1559 nan_eq_nan_(nan_eq_nan
) {}
1561 bool MatchAndExplain(Tuple args
,
1562 MatchResultListener
* listener
) const override
{
1563 if (max_abs_error_
== -1) {
1564 FloatingEqMatcher
<FloatType
> fm(::std::get
<0>(args
), nan_eq_nan_
);
1565 return static_cast<Matcher
<FloatType
>>(fm
).MatchAndExplain(
1566 ::std::get
<1>(args
), listener
);
1568 FloatingEqMatcher
<FloatType
> fm(::std::get
<0>(args
), nan_eq_nan_
,
1570 return static_cast<Matcher
<FloatType
>>(fm
).MatchAndExplain(
1571 ::std::get
<1>(args
), listener
);
1574 void DescribeTo(::std::ostream
* os
) const override
{
1575 *os
<< "are " << GetDesc
;
1577 void DescribeNegationTo(::std::ostream
* os
) const override
{
1578 *os
<< "aren't " << GetDesc
;
1582 FloatType max_abs_error_
;
1583 const bool nan_eq_nan_
;
1586 void Init(FloatType max_abs_error_val
, bool nan_eq_nan_val
) {
1587 max_abs_error_
= max_abs_error_val
;
1588 nan_eq_nan_
= nan_eq_nan_val
;
1590 FloatType max_abs_error_
;
1594 // Implements the Pointee(m) matcher for matching a pointer whose
1595 // pointee matches matcher m. The pointer can be either raw or smart.
1596 template <typename InnerMatcher
>
1597 class PointeeMatcher
{
1599 explicit PointeeMatcher(const InnerMatcher
& matcher
) : matcher_(matcher
) {}
1601 // This type conversion operator template allows Pointee(m) to be
1602 // used as a matcher for any pointer type whose pointee type is
1603 // compatible with the inner matcher, where type Pointer can be
1604 // either a raw pointer or a smart pointer.
1606 // The reason we do this instead of relying on
1607 // MakePolymorphicMatcher() is that the latter is not flexible
1608 // enough for implementing the DescribeTo() method of Pointee().
1609 template <typename Pointer
>
1610 operator Matcher
<Pointer
>() const {
1611 return Matcher
<Pointer
>(new Impl
<const Pointer
&>(matcher_
));
1615 // The monomorphic implementation that works for a particular pointer type.
1616 template <typename Pointer
>
1617 class Impl
: public MatcherInterface
<Pointer
> {
1619 typedef typename PointeeOf
<typename
std::remove_const
<
1620 typename
std::remove_reference
<Pointer
>::type
>::type
>::type Pointee
;
1622 explicit Impl(const InnerMatcher
& matcher
)
1623 : matcher_(MatcherCast
<const Pointee
&>(matcher
)) {}
1625 void DescribeTo(::std::ostream
* os
) const override
{
1626 *os
<< "points to a value that ";
1627 matcher_
.DescribeTo(os
);
1630 void DescribeNegationTo(::std::ostream
* os
) const override
{
1631 *os
<< "does not point to a value that ";
1632 matcher_
.DescribeTo(os
);
1635 bool MatchAndExplain(Pointer pointer
,
1636 MatchResultListener
* listener
) const override
{
1637 if (GetRawPointer(pointer
) == nullptr) return false;
1639 *listener
<< "which points to ";
1640 return MatchPrintAndExplain(*pointer
, matcher_
, listener
);
1644 const Matcher
<const Pointee
&> matcher_
;
1646 GTEST_DISALLOW_ASSIGN_(Impl
);
1649 const InnerMatcher matcher_
;
1651 GTEST_DISALLOW_ASSIGN_(PointeeMatcher
);
1655 // Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or
1656 // reference that matches inner_matcher when dynamic_cast<T> is applied.
1657 // The result of dynamic_cast<To> is forwarded to the inner matcher.
1658 // If To is a pointer and the cast fails, the inner matcher will receive NULL.
1659 // If To is a reference and the cast fails, this matcher returns false
1661 template <typename To
>
1662 class WhenDynamicCastToMatcherBase
{
1664 explicit WhenDynamicCastToMatcherBase(const Matcher
<To
>& matcher
)
1665 : matcher_(matcher
) {}
1667 void DescribeTo(::std::ostream
* os
) const {
1668 GetCastTypeDescription(os
);
1669 matcher_
.DescribeTo(os
);
1672 void DescribeNegationTo(::std::ostream
* os
) const {
1673 GetCastTypeDescription(os
);
1674 matcher_
.DescribeNegationTo(os
);
1678 const Matcher
<To
> matcher_
;
1680 static std::string
GetToName() {
1681 return GetTypeName
<To
>();
1685 static void GetCastTypeDescription(::std::ostream
* os
) {
1686 *os
<< "when dynamic_cast to " << GetToName() << ", ";
1689 GTEST_DISALLOW_ASSIGN_(WhenDynamicCastToMatcherBase
);
1692 // Primary template.
1693 // To is a pointer. Cast and forward the result.
1694 template <typename To
>
1695 class WhenDynamicCastToMatcher
: public WhenDynamicCastToMatcherBase
<To
> {
1697 explicit WhenDynamicCastToMatcher(const Matcher
<To
>& matcher
)
1698 : WhenDynamicCastToMatcherBase
<To
>(matcher
) {}
1700 template <typename From
>
1701 bool MatchAndExplain(From from
, MatchResultListener
* listener
) const {
1702 To to
= dynamic_cast<To
>(from
);
1703 return MatchPrintAndExplain(to
, this->matcher_
, listener
);
1707 // Specialize for references.
1708 // In this case we return false if the dynamic_cast fails.
1709 template <typename To
>
1710 class WhenDynamicCastToMatcher
<To
&> : public WhenDynamicCastToMatcherBase
<To
&> {
1712 explicit WhenDynamicCastToMatcher(const Matcher
<To
&>& matcher
)
1713 : WhenDynamicCastToMatcherBase
<To
&>(matcher
) {}
1715 template <typename From
>
1716 bool MatchAndExplain(From
& from
, MatchResultListener
* listener
) const {
1717 // We don't want an std::bad_cast here, so do the cast with pointers.
1718 To
* to
= dynamic_cast<To
*>(&from
);
1719 if (to
== nullptr) {
1720 *listener
<< "which cannot be dynamic_cast to " << this->GetToName();
1723 return MatchPrintAndExplain(*to
, this->matcher_
, listener
);
1726 #endif // GTEST_HAS_RTTI
1728 // Implements the Field() matcher for matching a field (i.e. member
1729 // variable) of an object.
1730 template <typename Class
, typename FieldType
>
1731 class FieldMatcher
{
1733 FieldMatcher(FieldType
Class::*field
,
1734 const Matcher
<const FieldType
&>& matcher
)
1735 : field_(field
), matcher_(matcher
), whose_field_("whose given field ") {}
1737 FieldMatcher(const std::string
& field_name
, FieldType
Class::*field
,
1738 const Matcher
<const FieldType
&>& matcher
)
1741 whose_field_("whose field `" + field_name
+ "` ") {}
1743 void DescribeTo(::std::ostream
* os
) const {
1744 *os
<< "is an object " << whose_field_
;
1745 matcher_
.DescribeTo(os
);
1748 void DescribeNegationTo(::std::ostream
* os
) const {
1749 *os
<< "is an object " << whose_field_
;
1750 matcher_
.DescribeNegationTo(os
);
1753 template <typename T
>
1754 bool MatchAndExplain(const T
& value
, MatchResultListener
* listener
) const {
1755 // FIXME: The dispatch on std::is_pointer was introduced as a workaround for
1756 // a compiler bug, and can now be removed.
1757 return MatchAndExplainImpl(
1758 typename
std::is_pointer
<typename
std::remove_const
<T
>::type
>::type(),
1763 bool MatchAndExplainImpl(std::false_type
/* is_not_pointer */,
1765 MatchResultListener
* listener
) const {
1766 *listener
<< whose_field_
<< "is ";
1767 return MatchPrintAndExplain(obj
.*field_
, matcher_
, listener
);
1770 bool MatchAndExplainImpl(std::true_type
/* is_pointer */, const Class
* p
,
1771 MatchResultListener
* listener
) const {
1772 if (p
== nullptr) return false;
1774 *listener
<< "which points to an object ";
1775 // Since *p has a field, it must be a class/struct/union type and
1776 // thus cannot be a pointer. Therefore we pass false_type() as
1777 // the first argument.
1778 return MatchAndExplainImpl(std::false_type(), *p
, listener
);
1781 const FieldType
Class::*field_
;
1782 const Matcher
<const FieldType
&> matcher_
;
1784 // Contains either "whose given field " if the name of the field is unknown
1785 // or "whose field `name_of_field` " if the name is known.
1786 const std::string whose_field_
;
1788 GTEST_DISALLOW_ASSIGN_(FieldMatcher
);
1791 // Implements the Property() matcher for matching a property
1792 // (i.e. return value of a getter method) of an object.
1794 // Property is a const-qualified member function of Class returning
1796 template <typename Class
, typename PropertyType
, typename Property
>
1797 class PropertyMatcher
{
1799 typedef const PropertyType
& RefToConstProperty
;
1801 PropertyMatcher(Property property
, const Matcher
<RefToConstProperty
>& matcher
)
1802 : property_(property
),
1804 whose_property_("whose given property ") {}
1806 PropertyMatcher(const std::string
& property_name
, Property property
,
1807 const Matcher
<RefToConstProperty
>& matcher
)
1808 : property_(property
),
1810 whose_property_("whose property `" + property_name
+ "` ") {}
1812 void DescribeTo(::std::ostream
* os
) const {
1813 *os
<< "is an object " << whose_property_
;
1814 matcher_
.DescribeTo(os
);
1817 void DescribeNegationTo(::std::ostream
* os
) const {
1818 *os
<< "is an object " << whose_property_
;
1819 matcher_
.DescribeNegationTo(os
);
1822 template <typename T
>
1823 bool MatchAndExplain(const T
&value
, MatchResultListener
* listener
) const {
1824 return MatchAndExplainImpl(
1825 typename
std::is_pointer
<typename
std::remove_const
<T
>::type
>::type(),
1830 bool MatchAndExplainImpl(std::false_type
/* is_not_pointer */,
1832 MatchResultListener
* listener
) const {
1833 *listener
<< whose_property_
<< "is ";
1834 // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
1835 // which takes a non-const reference as argument.
1836 RefToConstProperty result
= (obj
.*property_
)();
1837 return MatchPrintAndExplain(result
, matcher_
, listener
);
1840 bool MatchAndExplainImpl(std::true_type
/* is_pointer */, const Class
* p
,
1841 MatchResultListener
* listener
) const {
1842 if (p
== nullptr) return false;
1844 *listener
<< "which points to an object ";
1845 // Since *p has a property method, it must be a class/struct/union
1846 // type and thus cannot be a pointer. Therefore we pass
1847 // false_type() as the first argument.
1848 return MatchAndExplainImpl(std::false_type(), *p
, listener
);
1852 const Matcher
<RefToConstProperty
> matcher_
;
1854 // Contains either "whose given property " if the name of the property is
1855 // unknown or "whose property `name_of_property` " if the name is known.
1856 const std::string whose_property_
;
1858 GTEST_DISALLOW_ASSIGN_(PropertyMatcher
);
1861 // Type traits specifying various features of different functors for ResultOf.
1862 // The default template specifies features for functor objects.
1863 template <typename Functor
>
1864 struct CallableTraits
{
1865 typedef Functor StorageType
;
1867 static void CheckIsValid(Functor
/* functor */) {}
1869 template <typename T
>
1870 static auto Invoke(Functor f
, const T
& arg
) -> decltype(f(arg
)) {
1875 // Specialization for function pointers.
1876 template <typename ArgType
, typename ResType
>
1877 struct CallableTraits
<ResType(*)(ArgType
)> {
1878 typedef ResType ResultType
;
1879 typedef ResType(*StorageType
)(ArgType
);
1881 static void CheckIsValid(ResType(*f
)(ArgType
)) {
1882 GTEST_CHECK_(f
!= nullptr)
1883 << "NULL function pointer is passed into ResultOf().";
1885 template <typename T
>
1886 static ResType
Invoke(ResType(*f
)(ArgType
), T arg
) {
1891 // Implements the ResultOf() matcher for matching a return value of a
1892 // unary function of an object.
1893 template <typename Callable
, typename InnerMatcher
>
1894 class ResultOfMatcher
{
1896 ResultOfMatcher(Callable callable
, InnerMatcher matcher
)
1897 : callable_(std::move(callable
)), matcher_(std::move(matcher
)) {
1898 CallableTraits
<Callable
>::CheckIsValid(callable_
);
1901 template <typename T
>
1902 operator Matcher
<T
>() const {
1903 return Matcher
<T
>(new Impl
<const T
&>(callable_
, matcher_
));
1907 typedef typename CallableTraits
<Callable
>::StorageType CallableStorageType
;
1909 template <typename T
>
1910 class Impl
: public MatcherInterface
<T
> {
1911 using ResultType
= decltype(CallableTraits
<Callable
>::template Invoke
<T
>(
1912 std::declval
<CallableStorageType
>(), std::declval
<T
>()));
1915 template <typename M
>
1916 Impl(const CallableStorageType
& callable
, const M
& matcher
)
1917 : callable_(callable
), matcher_(MatcherCast
<ResultType
>(matcher
)) {}
1919 void DescribeTo(::std::ostream
* os
) const override
{
1920 *os
<< "is mapped by the given callable to a value that ";
1921 matcher_
.DescribeTo(os
);
1924 void DescribeNegationTo(::std::ostream
* os
) const override
{
1925 *os
<< "is mapped by the given callable to a value that ";
1926 matcher_
.DescribeNegationTo(os
);
1929 bool MatchAndExplain(T obj
, MatchResultListener
* listener
) const override
{
1930 *listener
<< "which is mapped by the given callable to ";
1931 // Cannot pass the return value directly to MatchPrintAndExplain, which
1932 // takes a non-const reference as argument.
1933 // Also, specifying template argument explicitly is needed because T could
1934 // be a non-const reference (e.g. Matcher<Uncopyable&>).
1936 CallableTraits
<Callable
>::template Invoke
<T
>(callable_
, obj
);
1937 return MatchPrintAndExplain(result
, matcher_
, listener
);
1941 // Functors often define operator() as non-const method even though
1942 // they are actually stateless. But we need to use them even when
1943 // 'this' is a const pointer. It's the user's responsibility not to
1944 // use stateful callables with ResultOf(), which doesn't guarantee
1945 // how many times the callable will be invoked.
1946 mutable CallableStorageType callable_
;
1947 const Matcher
<ResultType
> matcher_
;
1949 GTEST_DISALLOW_ASSIGN_(Impl
);
1952 const CallableStorageType callable_
;
1953 const InnerMatcher matcher_
;
1955 GTEST_DISALLOW_ASSIGN_(ResultOfMatcher
);
1958 // Implements a matcher that checks the size of an STL-style container.
1959 template <typename SizeMatcher
>
1960 class SizeIsMatcher
{
1962 explicit SizeIsMatcher(const SizeMatcher
& size_matcher
)
1963 : size_matcher_(size_matcher
) {
1966 template <typename Container
>
1967 operator Matcher
<Container
>() const {
1968 return Matcher
<Container
>(new Impl
<const Container
&>(size_matcher_
));
1971 template <typename Container
>
1972 class Impl
: public MatcherInterface
<Container
> {
1974 using SizeType
= decltype(std::declval
<Container
>().size());
1975 explicit Impl(const SizeMatcher
& size_matcher
)
1976 : size_matcher_(MatcherCast
<SizeType
>(size_matcher
)) {}
1978 void DescribeTo(::std::ostream
* os
) const override
{
1980 size_matcher_
.DescribeTo(os
);
1982 void DescribeNegationTo(::std::ostream
* os
) const override
{
1984 size_matcher_
.DescribeNegationTo(os
);
1987 bool MatchAndExplain(Container container
,
1988 MatchResultListener
* listener
) const override
{
1989 SizeType size
= container
.size();
1990 StringMatchResultListener size_listener
;
1991 const bool result
= size_matcher_
.MatchAndExplain(size
, &size_listener
);
1993 << "whose size " << size
<< (result
? " matches" : " doesn't match");
1994 PrintIfNotEmpty(size_listener
.str(), listener
->stream());
1999 const Matcher
<SizeType
> size_matcher_
;
2000 GTEST_DISALLOW_ASSIGN_(Impl
);
2004 const SizeMatcher size_matcher_
;
2005 GTEST_DISALLOW_ASSIGN_(SizeIsMatcher
);
2008 // Implements a matcher that checks the begin()..end() distance of an STL-style
2010 template <typename DistanceMatcher
>
2011 class BeginEndDistanceIsMatcher
{
2013 explicit BeginEndDistanceIsMatcher(const DistanceMatcher
& distance_matcher
)
2014 : distance_matcher_(distance_matcher
) {}
2016 template <typename Container
>
2017 operator Matcher
<Container
>() const {
2018 return Matcher
<Container
>(new Impl
<const Container
&>(distance_matcher_
));
2021 template <typename Container
>
2022 class Impl
: public MatcherInterface
<Container
> {
2024 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
2025 typedef internal::StlContainerView
<RawContainer
> View
;
2026 typedef typename
View::type StlContainer
;
2027 typedef typename
View::const_reference StlContainerReference
;
2028 typedef decltype(std::begin(
2029 std::declval
<StlContainerReference
>())) StlContainerConstIterator
;
2030 typedef typename
std::iterator_traits
<
2031 StlContainerConstIterator
>::difference_type DistanceType
;
2032 explicit Impl(const DistanceMatcher
& distance_matcher
)
2033 : distance_matcher_(MatcherCast
<DistanceType
>(distance_matcher
)) {}
2035 void DescribeTo(::std::ostream
* os
) const override
{
2036 *os
<< "distance between begin() and end() ";
2037 distance_matcher_
.DescribeTo(os
);
2039 void DescribeNegationTo(::std::ostream
* os
) const override
{
2040 *os
<< "distance between begin() and end() ";
2041 distance_matcher_
.DescribeNegationTo(os
);
2044 bool MatchAndExplain(Container container
,
2045 MatchResultListener
* listener
) const override
{
2048 DistanceType distance
= std::distance(begin(container
), end(container
));
2049 StringMatchResultListener distance_listener
;
2051 distance_matcher_
.MatchAndExplain(distance
, &distance_listener
);
2052 *listener
<< "whose distance between begin() and end() " << distance
2053 << (result
? " matches" : " doesn't match");
2054 PrintIfNotEmpty(distance_listener
.str(), listener
->stream());
2059 const Matcher
<DistanceType
> distance_matcher_
;
2060 GTEST_DISALLOW_ASSIGN_(Impl
);
2064 const DistanceMatcher distance_matcher_
;
2065 GTEST_DISALLOW_ASSIGN_(BeginEndDistanceIsMatcher
);
2068 // Implements an equality matcher for any STL-style container whose elements
2069 // support ==. This matcher is like Eq(), but its failure explanations provide
2070 // more detailed information that is useful when the container is used as a set.
2071 // The failure message reports elements that are in one of the operands but not
2072 // the other. The failure messages do not report duplicate or out-of-order
2073 // elements in the containers (which don't properly matter to sets, but can
2074 // occur if the containers are vectors or lists, for example).
2076 // Uses the container's const_iterator, value_type, operator ==,
2077 // begin(), and end().
2078 template <typename Container
>
2079 class ContainerEqMatcher
{
2081 typedef internal::StlContainerView
<Container
> View
;
2082 typedef typename
View::type StlContainer
;
2083 typedef typename
View::const_reference StlContainerReference
;
2085 static_assert(!std::is_const
<Container
>::value
,
2086 "Container type must not be const");
2087 static_assert(!std::is_reference
<Container
>::value
,
2088 "Container type must not be a reference");
2090 // We make a copy of expected in case the elements in it are modified
2091 // after this matcher is created.
2092 explicit ContainerEqMatcher(const Container
& expected
)
2093 : expected_(View::Copy(expected
)) {}
2095 void DescribeTo(::std::ostream
* os
) const {
2097 UniversalPrint(expected_
, os
);
2099 void DescribeNegationTo(::std::ostream
* os
) const {
2100 *os
<< "does not equal ";
2101 UniversalPrint(expected_
, os
);
2104 template <typename LhsContainer
>
2105 bool MatchAndExplain(const LhsContainer
& lhs
,
2106 MatchResultListener
* listener
) const {
2107 typedef internal::StlContainerView
<
2108 typename
std::remove_const
<LhsContainer
>::type
>
2110 typedef typename
LhsView::type LhsStlContainer
;
2111 StlContainerReference lhs_stl_container
= LhsView::ConstReference(lhs
);
2112 if (lhs_stl_container
== expected_
)
2115 ::std::ostream
* const os
= listener
->stream();
2116 if (os
!= nullptr) {
2117 // Something is different. Check for extra values first.
2118 bool printed_header
= false;
2119 for (typename
LhsStlContainer::const_iterator it
=
2120 lhs_stl_container
.begin();
2121 it
!= lhs_stl_container
.end(); ++it
) {
2122 if (internal::ArrayAwareFind(expected_
.begin(), expected_
.end(), *it
) ==
2124 if (printed_header
) {
2127 *os
<< "which has these unexpected elements: ";
2128 printed_header
= true;
2130 UniversalPrint(*it
, os
);
2134 // Now check for missing values.
2135 bool printed_header2
= false;
2136 for (typename
StlContainer::const_iterator it
= expected_
.begin();
2137 it
!= expected_
.end(); ++it
) {
2138 if (internal::ArrayAwareFind(
2139 lhs_stl_container
.begin(), lhs_stl_container
.end(), *it
) ==
2140 lhs_stl_container
.end()) {
2141 if (printed_header2
) {
2144 *os
<< (printed_header
? ",\nand" : "which")
2145 << " doesn't have these expected elements: ";
2146 printed_header2
= true;
2148 UniversalPrint(*it
, os
);
2157 const StlContainer expected_
;
2159 GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher
);
2162 // A comparator functor that uses the < operator to compare two values.
2163 struct LessComparator
{
2164 template <typename T
, typename U
>
2165 bool operator()(const T
& lhs
, const U
& rhs
) const { return lhs
< rhs
; }
2168 // Implements WhenSortedBy(comparator, container_matcher).
2169 template <typename Comparator
, typename ContainerMatcher
>
2170 class WhenSortedByMatcher
{
2172 WhenSortedByMatcher(const Comparator
& comparator
,
2173 const ContainerMatcher
& matcher
)
2174 : comparator_(comparator
), matcher_(matcher
) {}
2176 template <typename LhsContainer
>
2177 operator Matcher
<LhsContainer
>() const {
2178 return MakeMatcher(new Impl
<LhsContainer
>(comparator_
, matcher_
));
2181 template <typename LhsContainer
>
2182 class Impl
: public MatcherInterface
<LhsContainer
> {
2184 typedef internal::StlContainerView
<
2185 GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer
)> LhsView
;
2186 typedef typename
LhsView::type LhsStlContainer
;
2187 typedef typename
LhsView::const_reference LhsStlContainerReference
;
2188 // Transforms std::pair<const Key, Value> into std::pair<Key, Value>
2189 // so that we can match associative containers.
2190 typedef typename RemoveConstFromKey
<
2191 typename
LhsStlContainer::value_type
>::type LhsValue
;
2193 Impl(const Comparator
& comparator
, const ContainerMatcher
& matcher
)
2194 : comparator_(comparator
), matcher_(matcher
) {}
2196 void DescribeTo(::std::ostream
* os
) const override
{
2197 *os
<< "(when sorted) ";
2198 matcher_
.DescribeTo(os
);
2201 void DescribeNegationTo(::std::ostream
* os
) const override
{
2202 *os
<< "(when sorted) ";
2203 matcher_
.DescribeNegationTo(os
);
2206 bool MatchAndExplain(LhsContainer lhs
,
2207 MatchResultListener
* listener
) const override
{
2208 LhsStlContainerReference lhs_stl_container
= LhsView::ConstReference(lhs
);
2209 ::std::vector
<LhsValue
> sorted_container(lhs_stl_container
.begin(),
2210 lhs_stl_container
.end());
2212 sorted_container
.begin(), sorted_container
.end(), comparator_
);
2214 if (!listener
->IsInterested()) {
2215 // If the listener is not interested, we do not need to
2216 // construct the inner explanation.
2217 return matcher_
.Matches(sorted_container
);
2220 *listener
<< "which is ";
2221 UniversalPrint(sorted_container
, listener
->stream());
2222 *listener
<< " when sorted";
2224 StringMatchResultListener inner_listener
;
2225 const bool match
= matcher_
.MatchAndExplain(sorted_container
,
2227 PrintIfNotEmpty(inner_listener
.str(), listener
->stream());
2232 const Comparator comparator_
;
2233 const Matcher
<const ::std::vector
<LhsValue
>&> matcher_
;
2235 GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl
);
2239 const Comparator comparator_
;
2240 const ContainerMatcher matcher_
;
2242 GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher
);
2245 // Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
2246 // must be able to be safely cast to Matcher<std::tuple<const T1&, const
2247 // T2&> >, where T1 and T2 are the types of elements in the LHS
2248 // container and the RHS container respectively.
2249 template <typename TupleMatcher
, typename RhsContainer
>
2250 class PointwiseMatcher
{
2251 GTEST_COMPILE_ASSERT_(
2252 !IsHashTable
<GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer
)>::value
,
2253 use_UnorderedPointwise_with_hash_tables
);
2256 typedef internal::StlContainerView
<RhsContainer
> RhsView
;
2257 typedef typename
RhsView::type RhsStlContainer
;
2258 typedef typename
RhsStlContainer::value_type RhsValue
;
2260 static_assert(!std::is_const
<RhsContainer
>::value
,
2261 "RhsContainer type must not be const");
2262 static_assert(!std::is_reference
<RhsContainer
>::value
,
2263 "RhsContainer type must not be a reference");
2265 // Like ContainerEq, we make a copy of rhs in case the elements in
2266 // it are modified after this matcher is created.
2267 PointwiseMatcher(const TupleMatcher
& tuple_matcher
, const RhsContainer
& rhs
)
2268 : tuple_matcher_(tuple_matcher
), rhs_(RhsView::Copy(rhs
)) {}
2270 template <typename LhsContainer
>
2271 operator Matcher
<LhsContainer
>() const {
2272 GTEST_COMPILE_ASSERT_(
2273 !IsHashTable
<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer
)>::value
,
2274 use_UnorderedPointwise_with_hash_tables
);
2276 return Matcher
<LhsContainer
>(
2277 new Impl
<const LhsContainer
&>(tuple_matcher_
, rhs_
));
2280 template <typename LhsContainer
>
2281 class Impl
: public MatcherInterface
<LhsContainer
> {
2283 typedef internal::StlContainerView
<
2284 GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer
)> LhsView
;
2285 typedef typename
LhsView::type LhsStlContainer
;
2286 typedef typename
LhsView::const_reference LhsStlContainerReference
;
2287 typedef typename
LhsStlContainer::value_type LhsValue
;
2288 // We pass the LHS value and the RHS value to the inner matcher by
2289 // reference, as they may be expensive to copy. We must use tuple
2290 // instead of pair here, as a pair cannot hold references (C++ 98,
2291 // 20.2.2 [lib.pairs]).
2292 typedef ::std::tuple
<const LhsValue
&, const RhsValue
&> InnerMatcherArg
;
2294 Impl(const TupleMatcher
& tuple_matcher
, const RhsStlContainer
& rhs
)
2295 // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
2296 : mono_tuple_matcher_(SafeMatcherCast
<InnerMatcherArg
>(tuple_matcher
)),
2299 void DescribeTo(::std::ostream
* os
) const override
{
2300 *os
<< "contains " << rhs_
.size()
2301 << " values, where each value and its corresponding value in ";
2302 UniversalPrinter
<RhsStlContainer
>::Print(rhs_
, os
);
2304 mono_tuple_matcher_
.DescribeTo(os
);
2306 void DescribeNegationTo(::std::ostream
* os
) const override
{
2307 *os
<< "doesn't contain exactly " << rhs_
.size()
2308 << " values, or contains a value x at some index i"
2309 << " where x and the i-th value of ";
2310 UniversalPrint(rhs_
, os
);
2312 mono_tuple_matcher_
.DescribeNegationTo(os
);
2315 bool MatchAndExplain(LhsContainer lhs
,
2316 MatchResultListener
* listener
) const override
{
2317 LhsStlContainerReference lhs_stl_container
= LhsView::ConstReference(lhs
);
2318 const size_t actual_size
= lhs_stl_container
.size();
2319 if (actual_size
!= rhs_
.size()) {
2320 *listener
<< "which contains " << actual_size
<< " values";
2324 typename
LhsStlContainer::const_iterator left
= lhs_stl_container
.begin();
2325 typename
RhsStlContainer::const_iterator right
= rhs_
.begin();
2326 for (size_t i
= 0; i
!= actual_size
; ++i
, ++left
, ++right
) {
2327 if (listener
->IsInterested()) {
2328 StringMatchResultListener inner_listener
;
2329 // Create InnerMatcherArg as a temporarily object to avoid it outlives
2330 // *left and *right. Dereference or the conversion to `const T&` may
2331 // return temp objects, e.g for vector<bool>.
2332 if (!mono_tuple_matcher_
.MatchAndExplain(
2333 InnerMatcherArg(ImplicitCast_
<const LhsValue
&>(*left
),
2334 ImplicitCast_
<const RhsValue
&>(*right
)),
2336 *listener
<< "where the value pair (";
2337 UniversalPrint(*left
, listener
->stream());
2339 UniversalPrint(*right
, listener
->stream());
2340 *listener
<< ") at index #" << i
<< " don't match";
2341 PrintIfNotEmpty(inner_listener
.str(), listener
->stream());
2345 if (!mono_tuple_matcher_
.Matches(
2346 InnerMatcherArg(ImplicitCast_
<const LhsValue
&>(*left
),
2347 ImplicitCast_
<const RhsValue
&>(*right
))))
2356 const Matcher
<InnerMatcherArg
> mono_tuple_matcher_
;
2357 const RhsStlContainer rhs_
;
2359 GTEST_DISALLOW_ASSIGN_(Impl
);
2363 const TupleMatcher tuple_matcher_
;
2364 const RhsStlContainer rhs_
;
2366 GTEST_DISALLOW_ASSIGN_(PointwiseMatcher
);
2369 // Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
2370 template <typename Container
>
2371 class QuantifierMatcherImpl
: public MatcherInterface
<Container
> {
2373 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
2374 typedef StlContainerView
<RawContainer
> View
;
2375 typedef typename
View::type StlContainer
;
2376 typedef typename
View::const_reference StlContainerReference
;
2377 typedef typename
StlContainer::value_type Element
;
2379 template <typename InnerMatcher
>
2380 explicit QuantifierMatcherImpl(InnerMatcher inner_matcher
)
2382 testing::SafeMatcherCast
<const Element
&>(inner_matcher
)) {}
2385 // * All elements in the container match, if all_elements_should_match.
2386 // * Any element in the container matches, if !all_elements_should_match.
2387 bool MatchAndExplainImpl(bool all_elements_should_match
,
2388 Container container
,
2389 MatchResultListener
* listener
) const {
2390 StlContainerReference stl_container
= View::ConstReference(container
);
2392 for (typename
StlContainer::const_iterator it
= stl_container
.begin();
2393 it
!= stl_container
.end(); ++it
, ++i
) {
2394 StringMatchResultListener inner_listener
;
2395 const bool matches
= inner_matcher_
.MatchAndExplain(*it
, &inner_listener
);
2397 if (matches
!= all_elements_should_match
) {
2398 *listener
<< "whose element #" << i
2399 << (matches
? " matches" : " doesn't match");
2400 PrintIfNotEmpty(inner_listener
.str(), listener
->stream());
2401 return !all_elements_should_match
;
2404 return all_elements_should_match
;
2408 const Matcher
<const Element
&> inner_matcher_
;
2410 GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl
);
2413 // Implements Contains(element_matcher) for the given argument type Container.
2414 // Symmetric to EachMatcherImpl.
2415 template <typename Container
>
2416 class ContainsMatcherImpl
: public QuantifierMatcherImpl
<Container
> {
2418 template <typename InnerMatcher
>
2419 explicit ContainsMatcherImpl(InnerMatcher inner_matcher
)
2420 : QuantifierMatcherImpl
<Container
>(inner_matcher
) {}
2422 // Describes what this matcher does.
2423 void DescribeTo(::std::ostream
* os
) const override
{
2424 *os
<< "contains at least one element that ";
2425 this->inner_matcher_
.DescribeTo(os
);
2428 void DescribeNegationTo(::std::ostream
* os
) const override
{
2429 *os
<< "doesn't contain any element that ";
2430 this->inner_matcher_
.DescribeTo(os
);
2433 bool MatchAndExplain(Container container
,
2434 MatchResultListener
* listener
) const override
{
2435 return this->MatchAndExplainImpl(false, container
, listener
);
2439 GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl
);
2442 // Implements Each(element_matcher) for the given argument type Container.
2443 // Symmetric to ContainsMatcherImpl.
2444 template <typename Container
>
2445 class EachMatcherImpl
: public QuantifierMatcherImpl
<Container
> {
2447 template <typename InnerMatcher
>
2448 explicit EachMatcherImpl(InnerMatcher inner_matcher
)
2449 : QuantifierMatcherImpl
<Container
>(inner_matcher
) {}
2451 // Describes what this matcher does.
2452 void DescribeTo(::std::ostream
* os
) const override
{
2453 *os
<< "only contains elements that ";
2454 this->inner_matcher_
.DescribeTo(os
);
2457 void DescribeNegationTo(::std::ostream
* os
) const override
{
2458 *os
<< "contains some element that ";
2459 this->inner_matcher_
.DescribeNegationTo(os
);
2462 bool MatchAndExplain(Container container
,
2463 MatchResultListener
* listener
) const override
{
2464 return this->MatchAndExplainImpl(true, container
, listener
);
2468 GTEST_DISALLOW_ASSIGN_(EachMatcherImpl
);
2471 // Implements polymorphic Contains(element_matcher).
2472 template <typename M
>
2473 class ContainsMatcher
{
2475 explicit ContainsMatcher(M m
) : inner_matcher_(m
) {}
2477 template <typename Container
>
2478 operator Matcher
<Container
>() const {
2479 return Matcher
<Container
>(
2480 new ContainsMatcherImpl
<const Container
&>(inner_matcher_
));
2484 const M inner_matcher_
;
2486 GTEST_DISALLOW_ASSIGN_(ContainsMatcher
);
2489 // Implements polymorphic Each(element_matcher).
2490 template <typename M
>
2493 explicit EachMatcher(M m
) : inner_matcher_(m
) {}
2495 template <typename Container
>
2496 operator Matcher
<Container
>() const {
2497 return Matcher
<Container
>(
2498 new EachMatcherImpl
<const Container
&>(inner_matcher_
));
2502 const M inner_matcher_
;
2504 GTEST_DISALLOW_ASSIGN_(EachMatcher
);
2508 struct Rank0
: Rank1
{};
2510 namespace pair_getters
{
2512 template <typename T
>
2513 auto First(T
& x
, Rank1
) -> decltype(get
<0>(x
)) { // NOLINT
2516 template <typename T
>
2517 auto First(T
& x
, Rank0
) -> decltype((x
.first
)) { // NOLINT
2521 template <typename T
>
2522 auto Second(T
& x
, Rank1
) -> decltype(get
<1>(x
)) { // NOLINT
2525 template <typename T
>
2526 auto Second(T
& x
, Rank0
) -> decltype((x
.second
)) { // NOLINT
2529 } // namespace pair_getters
2531 // Implements Key(inner_matcher) for the given argument pair type.
2532 // Key(inner_matcher) matches an std::pair whose 'first' field matches
2533 // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
2534 // std::map that contains at least one element whose key is >= 5.
2535 template <typename PairType
>
2536 class KeyMatcherImpl
: public MatcherInterface
<PairType
> {
2538 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType
) RawPairType
;
2539 typedef typename
RawPairType::first_type KeyType
;
2541 template <typename InnerMatcher
>
2542 explicit KeyMatcherImpl(InnerMatcher inner_matcher
)
2544 testing::SafeMatcherCast
<const KeyType
&>(inner_matcher
)) {
2547 // Returns true if and only if 'key_value.first' (the key) matches the inner
2549 bool MatchAndExplain(PairType key_value
,
2550 MatchResultListener
* listener
) const override
{
2551 StringMatchResultListener inner_listener
;
2552 const bool match
= inner_matcher_
.MatchAndExplain(
2553 pair_getters::First(key_value
, Rank0()), &inner_listener
);
2554 const std::string explanation
= inner_listener
.str();
2555 if (explanation
!= "") {
2556 *listener
<< "whose first field is a value " << explanation
;
2561 // Describes what this matcher does.
2562 void DescribeTo(::std::ostream
* os
) const override
{
2563 *os
<< "has a key that ";
2564 inner_matcher_
.DescribeTo(os
);
2567 // Describes what the negation of this matcher does.
2568 void DescribeNegationTo(::std::ostream
* os
) const override
{
2569 *os
<< "doesn't have a key that ";
2570 inner_matcher_
.DescribeTo(os
);
2574 const Matcher
<const KeyType
&> inner_matcher_
;
2576 GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl
);
2579 // Implements polymorphic Key(matcher_for_key).
2580 template <typename M
>
2583 explicit KeyMatcher(M m
) : matcher_for_key_(m
) {}
2585 template <typename PairType
>
2586 operator Matcher
<PairType
>() const {
2587 return Matcher
<PairType
>(
2588 new KeyMatcherImpl
<const PairType
&>(matcher_for_key_
));
2592 const M matcher_for_key_
;
2594 GTEST_DISALLOW_ASSIGN_(KeyMatcher
);
2597 // Implements Pair(first_matcher, second_matcher) for the given argument pair
2598 // type with its two matchers. See Pair() function below.
2599 template <typename PairType
>
2600 class PairMatcherImpl
: public MatcherInterface
<PairType
> {
2602 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType
) RawPairType
;
2603 typedef typename
RawPairType::first_type FirstType
;
2604 typedef typename
RawPairType::second_type SecondType
;
2606 template <typename FirstMatcher
, typename SecondMatcher
>
2607 PairMatcherImpl(FirstMatcher first_matcher
, SecondMatcher second_matcher
)
2609 testing::SafeMatcherCast
<const FirstType
&>(first_matcher
)),
2611 testing::SafeMatcherCast
<const SecondType
&>(second_matcher
)) {
2614 // Describes what this matcher does.
2615 void DescribeTo(::std::ostream
* os
) const override
{
2616 *os
<< "has a first field that ";
2617 first_matcher_
.DescribeTo(os
);
2618 *os
<< ", and has a second field that ";
2619 second_matcher_
.DescribeTo(os
);
2622 // Describes what the negation of this matcher does.
2623 void DescribeNegationTo(::std::ostream
* os
) const override
{
2624 *os
<< "has a first field that ";
2625 first_matcher_
.DescribeNegationTo(os
);
2626 *os
<< ", or has a second field that ";
2627 second_matcher_
.DescribeNegationTo(os
);
2630 // Returns true if and only if 'a_pair.first' matches first_matcher and
2631 // 'a_pair.second' matches second_matcher.
2632 bool MatchAndExplain(PairType a_pair
,
2633 MatchResultListener
* listener
) const override
{
2634 if (!listener
->IsInterested()) {
2635 // If the listener is not interested, we don't need to construct the
2637 return first_matcher_
.Matches(pair_getters::First(a_pair
, Rank0())) &&
2638 second_matcher_
.Matches(pair_getters::Second(a_pair
, Rank0()));
2640 StringMatchResultListener first_inner_listener
;
2641 if (!first_matcher_
.MatchAndExplain(pair_getters::First(a_pair
, Rank0()),
2642 &first_inner_listener
)) {
2643 *listener
<< "whose first field does not match";
2644 PrintIfNotEmpty(first_inner_listener
.str(), listener
->stream());
2647 StringMatchResultListener second_inner_listener
;
2648 if (!second_matcher_
.MatchAndExplain(pair_getters::Second(a_pair
, Rank0()),
2649 &second_inner_listener
)) {
2650 *listener
<< "whose second field does not match";
2651 PrintIfNotEmpty(second_inner_listener
.str(), listener
->stream());
2654 ExplainSuccess(first_inner_listener
.str(), second_inner_listener
.str(),
2660 void ExplainSuccess(const std::string
& first_explanation
,
2661 const std::string
& second_explanation
,
2662 MatchResultListener
* listener
) const {
2663 *listener
<< "whose both fields match";
2664 if (first_explanation
!= "") {
2665 *listener
<< ", where the first field is a value " << first_explanation
;
2667 if (second_explanation
!= "") {
2669 if (first_explanation
!= "") {
2670 *listener
<< "and ";
2672 *listener
<< "where ";
2674 *listener
<< "the second field is a value " << second_explanation
;
2678 const Matcher
<const FirstType
&> first_matcher_
;
2679 const Matcher
<const SecondType
&> second_matcher_
;
2681 GTEST_DISALLOW_ASSIGN_(PairMatcherImpl
);
2684 // Implements polymorphic Pair(first_matcher, second_matcher).
2685 template <typename FirstMatcher
, typename SecondMatcher
>
2688 PairMatcher(FirstMatcher first_matcher
, SecondMatcher second_matcher
)
2689 : first_matcher_(first_matcher
), second_matcher_(second_matcher
) {}
2691 template <typename PairType
>
2692 operator Matcher
<PairType
> () const {
2693 return Matcher
<PairType
>(
2694 new PairMatcherImpl
<const PairType
&>(first_matcher_
, second_matcher_
));
2698 const FirstMatcher first_matcher_
;
2699 const SecondMatcher second_matcher_
;
2701 GTEST_DISALLOW_ASSIGN_(PairMatcher
);
2704 // Implements ElementsAre() and ElementsAreArray().
2705 template <typename Container
>
2706 class ElementsAreMatcherImpl
: public MatcherInterface
<Container
> {
2708 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
2709 typedef internal::StlContainerView
<RawContainer
> View
;
2710 typedef typename
View::type StlContainer
;
2711 typedef typename
View::const_reference StlContainerReference
;
2712 typedef decltype(std::begin(
2713 std::declval
<StlContainerReference
>())) StlContainerConstIterator
;
2714 typedef typename
std::remove_reference
<
2715 decltype(*std::declval
<StlContainerConstIterator
&>())>::type Element
;
2717 // Constructs the matcher from a sequence of element values or
2718 // element matchers.
2719 template <typename InputIter
>
2720 ElementsAreMatcherImpl(InputIter first
, InputIter last
) {
2721 while (first
!= last
) {
2722 matchers_
.push_back(MatcherCast
<const Element
&>(*first
++));
2726 // Describes what this matcher does.
2727 void DescribeTo(::std::ostream
* os
) const override
{
2730 } else if (count() == 1) {
2731 *os
<< "has 1 element that ";
2732 matchers_
[0].DescribeTo(os
);
2734 *os
<< "has " << Elements(count()) << " where\n";
2735 for (size_t i
= 0; i
!= count(); ++i
) {
2736 *os
<< "element #" << i
<< " ";
2737 matchers_
[i
].DescribeTo(os
);
2738 if (i
+ 1 < count()) {
2745 // Describes what the negation of this matcher does.
2746 void DescribeNegationTo(::std::ostream
* os
) const override
{
2748 *os
<< "isn't empty";
2752 *os
<< "doesn't have " << Elements(count()) << ", or\n";
2753 for (size_t i
= 0; i
!= count(); ++i
) {
2754 *os
<< "element #" << i
<< " ";
2755 matchers_
[i
].DescribeNegationTo(os
);
2756 if (i
+ 1 < count()) {
2762 bool MatchAndExplain(Container container
,
2763 MatchResultListener
* listener
) const override
{
2764 // To work with stream-like "containers", we must only walk
2765 // through the elements in one pass.
2767 const bool listener_interested
= listener
->IsInterested();
2769 // explanations[i] is the explanation of the element at index i.
2770 ::std::vector
<std::string
> explanations(count());
2771 StlContainerReference stl_container
= View::ConstReference(container
);
2772 StlContainerConstIterator it
= stl_container
.begin();
2773 size_t exam_pos
= 0;
2774 bool mismatch_found
= false; // Have we found a mismatched element yet?
2776 // Go through the elements and matchers in pairs, until we reach
2777 // the end of either the elements or the matchers, or until we find a
2779 for (; it
!= stl_container
.end() && exam_pos
!= count(); ++it
, ++exam_pos
) {
2780 bool match
; // Does the current element match the current matcher?
2781 if (listener_interested
) {
2782 StringMatchResultListener s
;
2783 match
= matchers_
[exam_pos
].MatchAndExplain(*it
, &s
);
2784 explanations
[exam_pos
] = s
.str();
2786 match
= matchers_
[exam_pos
].Matches(*it
);
2790 mismatch_found
= true;
2794 // If mismatch_found is true, 'exam_pos' is the index of the mismatch.
2796 // Find how many elements the actual container has. We avoid
2797 // calling size() s.t. this code works for stream-like "containers"
2798 // that don't define size().
2799 size_t actual_count
= exam_pos
;
2800 for (; it
!= stl_container
.end(); ++it
) {
2804 if (actual_count
!= count()) {
2805 // The element count doesn't match. If the container is empty,
2806 // there's no need to explain anything as Google Mock already
2807 // prints the empty container. Otherwise we just need to show
2808 // how many elements there actually are.
2809 if (listener_interested
&& (actual_count
!= 0)) {
2810 *listener
<< "which has " << Elements(actual_count
);
2815 if (mismatch_found
) {
2816 // The element count matches, but the exam_pos-th element doesn't match.
2817 if (listener_interested
) {
2818 *listener
<< "whose element #" << exam_pos
<< " doesn't match";
2819 PrintIfNotEmpty(explanations
[exam_pos
], listener
->stream());
2824 // Every element matches its expectation. We need to explain why
2825 // (the obvious ones can be skipped).
2826 if (listener_interested
) {
2827 bool reason_printed
= false;
2828 for (size_t i
= 0; i
!= count(); ++i
) {
2829 const std::string
& s
= explanations
[i
];
2831 if (reason_printed
) {
2832 *listener
<< ",\nand ";
2834 *listener
<< "whose element #" << i
<< " matches, " << s
;
2835 reason_printed
= true;
2843 static Message
Elements(size_t count
) {
2844 return Message() << count
<< (count
== 1 ? " element" : " elements");
2847 size_t count() const { return matchers_
.size(); }
2849 ::std::vector
<Matcher
<const Element
&> > matchers_
;
2851 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl
);
2854 // Connectivity matrix of (elements X matchers), in element-major order.
2855 // Initially, there are no edges.
2856 // Use NextGraph() to iterate over all possible edge configurations.
2857 // Use Randomize() to generate a random edge configuration.
2858 class GTEST_API_ MatchMatrix
{
2860 MatchMatrix(size_t num_elements
, size_t num_matchers
)
2861 : num_elements_(num_elements
),
2862 num_matchers_(num_matchers
),
2863 matched_(num_elements_
* num_matchers_
, 0) {
2866 size_t LhsSize() const { return num_elements_
; }
2867 size_t RhsSize() const { return num_matchers_
; }
2868 bool HasEdge(size_t ilhs
, size_t irhs
) const {
2869 return matched_
[SpaceIndex(ilhs
, irhs
)] == 1;
2871 void SetEdge(size_t ilhs
, size_t irhs
, bool b
) {
2872 matched_
[SpaceIndex(ilhs
, irhs
)] = b
? 1 : 0;
2875 // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
2876 // adds 1 to that number; returns false if incrementing the graph left it
2882 std::string
DebugString() const;
2885 size_t SpaceIndex(size_t ilhs
, size_t irhs
) const {
2886 return ilhs
* num_matchers_
+ irhs
;
2889 size_t num_elements_
;
2890 size_t num_matchers_
;
2892 // Each element is a char interpreted as bool. They are stored as a
2893 // flattened array in lhs-major order, use 'SpaceIndex()' to translate
2894 // a (ilhs, irhs) matrix coordinate into an offset.
2895 ::std::vector
<char> matched_
;
2898 typedef ::std::pair
<size_t, size_t> ElementMatcherPair
;
2899 typedef ::std::vector
<ElementMatcherPair
> ElementMatcherPairs
;
2901 // Returns a maximum bipartite matching for the specified graph 'g'.
2902 // The matching is represented as a vector of {element, matcher} pairs.
2903 GTEST_API_ ElementMatcherPairs
2904 FindMaxBipartiteMatching(const MatchMatrix
& g
);
2906 struct UnorderedMatcherRequire
{
2910 ExactMatch
= Superset
| Subset
,
2914 // Untyped base class for implementing UnorderedElementsAre. By
2915 // putting logic that's not specific to the element type here, we
2916 // reduce binary bloat and increase compilation speed.
2917 class GTEST_API_ UnorderedElementsAreMatcherImplBase
{
2919 explicit UnorderedElementsAreMatcherImplBase(
2920 UnorderedMatcherRequire::Flags matcher_flags
)
2921 : match_flags_(matcher_flags
) {}
2923 // A vector of matcher describers, one for each element matcher.
2924 // Does not own the describers (and thus can be used only when the
2925 // element matchers are alive).
2926 typedef ::std::vector
<const MatcherDescriberInterface
*> MatcherDescriberVec
;
2928 // Describes this UnorderedElementsAre matcher.
2929 void DescribeToImpl(::std::ostream
* os
) const;
2931 // Describes the negation of this UnorderedElementsAre matcher.
2932 void DescribeNegationToImpl(::std::ostream
* os
) const;
2934 bool VerifyMatchMatrix(const ::std::vector
<std::string
>& element_printouts
,
2935 const MatchMatrix
& matrix
,
2936 MatchResultListener
* listener
) const;
2938 bool FindPairing(const MatchMatrix
& matrix
,
2939 MatchResultListener
* listener
) const;
2941 MatcherDescriberVec
& matcher_describers() {
2942 return matcher_describers_
;
2945 static Message
Elements(size_t n
) {
2946 return Message() << n
<< " element" << (n
== 1 ? "" : "s");
2949 UnorderedMatcherRequire::Flags
match_flags() const { return match_flags_
; }
2952 UnorderedMatcherRequire::Flags match_flags_
;
2953 MatcherDescriberVec matcher_describers_
;
2955 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImplBase
);
2958 // Implements UnorderedElementsAre, UnorderedElementsAreArray, IsSubsetOf, and
2960 template <typename Container
>
2961 class UnorderedElementsAreMatcherImpl
2962 : public MatcherInterface
<Container
>,
2963 public UnorderedElementsAreMatcherImplBase
{
2965 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
2966 typedef internal::StlContainerView
<RawContainer
> View
;
2967 typedef typename
View::type StlContainer
;
2968 typedef typename
View::const_reference StlContainerReference
;
2969 typedef decltype(std::begin(
2970 std::declval
<StlContainerReference
>())) StlContainerConstIterator
;
2971 typedef typename
std::remove_reference
<
2972 decltype(*std::declval
<StlContainerConstIterator
&>())>::type Element
;
2974 template <typename InputIter
>
2975 UnorderedElementsAreMatcherImpl(UnorderedMatcherRequire::Flags matcher_flags
,
2976 InputIter first
, InputIter last
)
2977 : UnorderedElementsAreMatcherImplBase(matcher_flags
) {
2978 for (; first
!= last
; ++first
) {
2979 matchers_
.push_back(MatcherCast
<const Element
&>(*first
));
2980 matcher_describers().push_back(matchers_
.back().GetDescriber());
2984 // Describes what this matcher does.
2985 void DescribeTo(::std::ostream
* os
) const override
{
2986 return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os
);
2989 // Describes what the negation of this matcher does.
2990 void DescribeNegationTo(::std::ostream
* os
) const override
{
2991 return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os
);
2994 bool MatchAndExplain(Container container
,
2995 MatchResultListener
* listener
) const override
{
2996 StlContainerReference stl_container
= View::ConstReference(container
);
2997 ::std::vector
<std::string
> element_printouts
;
2998 MatchMatrix matrix
=
2999 AnalyzeElements(stl_container
.begin(), stl_container
.end(),
3000 &element_printouts
, listener
);
3002 if (matrix
.LhsSize() == 0 && matrix
.RhsSize() == 0) {
3006 if (match_flags() == UnorderedMatcherRequire::ExactMatch
) {
3007 if (matrix
.LhsSize() != matrix
.RhsSize()) {
3008 // The element count doesn't match. If the container is empty,
3009 // there's no need to explain anything as Google Mock already
3010 // prints the empty container. Otherwise we just need to show
3011 // how many elements there actually are.
3012 if (matrix
.LhsSize() != 0 && listener
->IsInterested()) {
3013 *listener
<< "which has " << Elements(matrix
.LhsSize());
3019 return VerifyMatchMatrix(element_printouts
, matrix
, listener
) &&
3020 FindPairing(matrix
, listener
);
3024 template <typename ElementIter
>
3025 MatchMatrix
AnalyzeElements(ElementIter elem_first
, ElementIter elem_last
,
3026 ::std::vector
<std::string
>* element_printouts
,
3027 MatchResultListener
* listener
) const {
3028 element_printouts
->clear();
3029 ::std::vector
<char> did_match
;
3030 size_t num_elements
= 0;
3031 for (; elem_first
!= elem_last
; ++num_elements
, ++elem_first
) {
3032 if (listener
->IsInterested()) {
3033 element_printouts
->push_back(PrintToString(*elem_first
));
3035 for (size_t irhs
= 0; irhs
!= matchers_
.size(); ++irhs
) {
3036 did_match
.push_back(Matches(matchers_
[irhs
])(*elem_first
));
3040 MatchMatrix
matrix(num_elements
, matchers_
.size());
3041 ::std::vector
<char>::const_iterator did_match_iter
= did_match
.begin();
3042 for (size_t ilhs
= 0; ilhs
!= num_elements
; ++ilhs
) {
3043 for (size_t irhs
= 0; irhs
!= matchers_
.size(); ++irhs
) {
3044 matrix
.SetEdge(ilhs
, irhs
, *did_match_iter
++ != 0);
3050 ::std::vector
<Matcher
<const Element
&> > matchers_
;
3052 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImpl
);
3055 // Functor for use in TransformTuple.
3056 // Performs MatcherCast<Target> on an input argument of any type.
3057 template <typename Target
>
3058 struct CastAndAppendTransform
{
3059 template <typename Arg
>
3060 Matcher
<Target
> operator()(const Arg
& a
) const {
3061 return MatcherCast
<Target
>(a
);
3065 // Implements UnorderedElementsAre.
3066 template <typename MatcherTuple
>
3067 class UnorderedElementsAreMatcher
{
3069 explicit UnorderedElementsAreMatcher(const MatcherTuple
& args
)
3070 : matchers_(args
) {}
3072 template <typename Container
>
3073 operator Matcher
<Container
>() const {
3074 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
3075 typedef internal::StlContainerView
<RawContainer
> View
;
3076 typedef typename
View::const_reference StlContainerReference
;
3077 typedef decltype(std::begin(
3078 std::declval
<StlContainerReference
>())) StlContainerConstIterator
;
3079 typedef typename
std::remove_reference
<
3080 decltype(*std::declval
<StlContainerConstIterator
&>())>::type Element
;
3081 typedef ::std::vector
<Matcher
<const Element
&> > MatcherVec
;
3082 MatcherVec matchers
;
3083 matchers
.reserve(::std::tuple_size
<MatcherTuple
>::value
);
3084 TransformTupleValues(CastAndAppendTransform
<const Element
&>(), matchers_
,
3085 ::std::back_inserter(matchers
));
3086 return Matcher
<Container
>(
3087 new UnorderedElementsAreMatcherImpl
<const Container
&>(
3088 UnorderedMatcherRequire::ExactMatch
, matchers
.begin(),
3093 const MatcherTuple matchers_
;
3094 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcher
);
3097 // Implements ElementsAre.
3098 template <typename MatcherTuple
>
3099 class ElementsAreMatcher
{
3101 explicit ElementsAreMatcher(const MatcherTuple
& args
) : matchers_(args
) {}
3103 template <typename Container
>
3104 operator Matcher
<Container
>() const {
3105 GTEST_COMPILE_ASSERT_(
3106 !IsHashTable
<GTEST_REMOVE_REFERENCE_AND_CONST_(Container
)>::value
||
3107 ::std::tuple_size
<MatcherTuple
>::value
< 2,
3108 use_UnorderedElementsAre_with_hash_tables
);
3110 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container
) RawContainer
;
3111 typedef internal::StlContainerView
<RawContainer
> View
;
3112 typedef typename
View::const_reference StlContainerReference
;
3113 typedef decltype(std::begin(
3114 std::declval
<StlContainerReference
>())) StlContainerConstIterator
;
3115 typedef typename
std::remove_reference
<
3116 decltype(*std::declval
<StlContainerConstIterator
&>())>::type Element
;
3117 typedef ::std::vector
<Matcher
<const Element
&> > MatcherVec
;
3118 MatcherVec matchers
;
3119 matchers
.reserve(::std::tuple_size
<MatcherTuple
>::value
);
3120 TransformTupleValues(CastAndAppendTransform
<const Element
&>(), matchers_
,
3121 ::std::back_inserter(matchers
));
3122 return Matcher
<Container
>(new ElementsAreMatcherImpl
<const Container
&>(
3123 matchers
.begin(), matchers
.end()));
3127 const MatcherTuple matchers_
;
3128 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher
);
3131 // Implements UnorderedElementsAreArray(), IsSubsetOf(), and IsSupersetOf().
3132 template <typename T
>
3133 class UnorderedElementsAreArrayMatcher
{
3135 template <typename Iter
>
3136 UnorderedElementsAreArrayMatcher(UnorderedMatcherRequire::Flags match_flags
,
3137 Iter first
, Iter last
)
3138 : match_flags_(match_flags
), matchers_(first
, last
) {}
3140 template <typename Container
>
3141 operator Matcher
<Container
>() const {
3142 return Matcher
<Container
>(
3143 new UnorderedElementsAreMatcherImpl
<const Container
&>(
3144 match_flags_
, matchers_
.begin(), matchers_
.end()));
3148 UnorderedMatcherRequire::Flags match_flags_
;
3149 ::std::vector
<T
> matchers_
;
3151 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreArrayMatcher
);
3154 // Implements ElementsAreArray().
3155 template <typename T
>
3156 class ElementsAreArrayMatcher
{
3158 template <typename Iter
>
3159 ElementsAreArrayMatcher(Iter first
, Iter last
) : matchers_(first
, last
) {}
3161 template <typename Container
>
3162 operator Matcher
<Container
>() const {
3163 GTEST_COMPILE_ASSERT_(
3164 !IsHashTable
<GTEST_REMOVE_REFERENCE_AND_CONST_(Container
)>::value
,
3165 use_UnorderedElementsAreArray_with_hash_tables
);
3167 return Matcher
<Container
>(new ElementsAreMatcherImpl
<const Container
&>(
3168 matchers_
.begin(), matchers_
.end()));
3172 const ::std::vector
<T
> matchers_
;
3174 GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher
);
3177 // Given a 2-tuple matcher tm of type Tuple2Matcher and a value second
3178 // of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,
3179 // second) is a polymorphic matcher that matches a value x if and only if
3180 // tm matches tuple (x, second). Useful for implementing
3181 // UnorderedPointwise() in terms of UnorderedElementsAreArray().
3183 // BoundSecondMatcher is copyable and assignable, as we need to put
3184 // instances of this class in a vector when implementing
3185 // UnorderedPointwise().
3186 template <typename Tuple2Matcher
, typename Second
>
3187 class BoundSecondMatcher
{
3189 BoundSecondMatcher(const Tuple2Matcher
& tm
, const Second
& second
)
3190 : tuple2_matcher_(tm
), second_value_(second
) {}
3192 template <typename T
>
3193 operator Matcher
<T
>() const {
3194 return MakeMatcher(new Impl
<T
>(tuple2_matcher_
, second_value_
));
3197 // We have to define this for UnorderedPointwise() to compile in
3198 // C++98 mode, as it puts BoundSecondMatcher instances in a vector,
3199 // which requires the elements to be assignable in C++98. The
3200 // compiler cannot generate the operator= for us, as Tuple2Matcher
3201 // and Second may not be assignable.
3203 // However, this should never be called, so the implementation just
3205 void operator=(const BoundSecondMatcher
& /*rhs*/) {
3206 GTEST_LOG_(FATAL
) << "BoundSecondMatcher should never be assigned.";
3210 template <typename T
>
3211 class Impl
: public MatcherInterface
<T
> {
3213 typedef ::std::tuple
<T
, Second
> ArgTuple
;
3215 Impl(const Tuple2Matcher
& tm
, const Second
& second
)
3216 : mono_tuple2_matcher_(SafeMatcherCast
<const ArgTuple
&>(tm
)),
3217 second_value_(second
) {}
3219 void DescribeTo(::std::ostream
* os
) const override
{
3221 UniversalPrint(second_value_
, os
);
3223 mono_tuple2_matcher_
.DescribeTo(os
);
3226 bool MatchAndExplain(T x
, MatchResultListener
* listener
) const override
{
3227 return mono_tuple2_matcher_
.MatchAndExplain(ArgTuple(x
, second_value_
),
3232 const Matcher
<const ArgTuple
&> mono_tuple2_matcher_
;
3233 const Second second_value_
;
3235 GTEST_DISALLOW_ASSIGN_(Impl
);
3238 const Tuple2Matcher tuple2_matcher_
;
3239 const Second second_value_
;
3242 // Given a 2-tuple matcher tm and a value second,
3243 // MatcherBindSecond(tm, second) returns a matcher that matches a
3244 // value x if and only if tm matches tuple (x, second). Useful for
3245 // implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().
3246 template <typename Tuple2Matcher
, typename Second
>
3247 BoundSecondMatcher
<Tuple2Matcher
, Second
> MatcherBindSecond(
3248 const Tuple2Matcher
& tm
, const Second
& second
) {
3249 return BoundSecondMatcher
<Tuple2Matcher
, Second
>(tm
, second
);
3252 // Returns the description for a matcher defined using the MATCHER*()
3253 // macro where the user-supplied description string is "", if
3254 // 'negation' is false; otherwise returns the description of the
3255 // negation of the matcher. 'param_values' contains a list of strings
3256 // that are the print-out of the matcher's parameters.
3257 GTEST_API_
std::string
FormatMatcherDescription(bool negation
,
3258 const char* matcher_name
,
3259 const Strings
& param_values
);
3261 // Implements a matcher that checks the value of a optional<> type variable.
3262 template <typename ValueMatcher
>
3263 class OptionalMatcher
{
3265 explicit OptionalMatcher(const ValueMatcher
& value_matcher
)
3266 : value_matcher_(value_matcher
) {}
3268 template <typename Optional
>
3269 operator Matcher
<Optional
>() const {
3270 return Matcher
<Optional
>(new Impl
<const Optional
&>(value_matcher_
));
3273 template <typename Optional
>
3274 class Impl
: public MatcherInterface
<Optional
> {
3276 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional
) OptionalView
;
3277 typedef typename
OptionalView::value_type ValueType
;
3278 explicit Impl(const ValueMatcher
& value_matcher
)
3279 : value_matcher_(MatcherCast
<ValueType
>(value_matcher
)) {}
3281 void DescribeTo(::std::ostream
* os
) const override
{
3283 value_matcher_
.DescribeTo(os
);
3286 void DescribeNegationTo(::std::ostream
* os
) const override
{
3288 value_matcher_
.DescribeNegationTo(os
);
3291 bool MatchAndExplain(Optional optional
,
3292 MatchResultListener
* listener
) const override
{
3294 *listener
<< "which is not engaged";
3297 const ValueType
& value
= *optional
;
3298 StringMatchResultListener value_listener
;
3299 const bool match
= value_matcher_
.MatchAndExplain(value
, &value_listener
);
3300 *listener
<< "whose value " << PrintToString(value
)
3301 << (match
? " matches" : " doesn't match");
3302 PrintIfNotEmpty(value_listener
.str(), listener
->stream());
3307 const Matcher
<ValueType
> value_matcher_
;
3308 GTEST_DISALLOW_ASSIGN_(Impl
);
3312 const ValueMatcher value_matcher_
;
3313 GTEST_DISALLOW_ASSIGN_(OptionalMatcher
);
3316 namespace variant_matcher
{
3317 // Overloads to allow VariantMatcher to do proper ADL lookup.
3318 template <typename T
>
3319 void holds_alternative() {}
3320 template <typename T
>
3323 // Implements a matcher that checks the value of a variant<> type variable.
3324 template <typename T
>
3325 class VariantMatcher
{
3327 explicit VariantMatcher(::testing::Matcher
<const T
&> matcher
)
3328 : matcher_(std::move(matcher
)) {}
3330 template <typename Variant
>
3331 bool MatchAndExplain(const Variant
& value
,
3332 ::testing::MatchResultListener
* listener
) const {
3334 if (!listener
->IsInterested()) {
3335 return holds_alternative
<T
>(value
) && matcher_
.Matches(get
<T
>(value
));
3338 if (!holds_alternative
<T
>(value
)) {
3339 *listener
<< "whose value is not of type '" << GetTypeName() << "'";
3343 const T
& elem
= get
<T
>(value
);
3344 StringMatchResultListener elem_listener
;
3345 const bool match
= matcher_
.MatchAndExplain(elem
, &elem_listener
);
3346 *listener
<< "whose value " << PrintToString(elem
)
3347 << (match
? " matches" : " doesn't match");
3348 PrintIfNotEmpty(elem_listener
.str(), listener
->stream());
3352 void DescribeTo(std::ostream
* os
) const {
3353 *os
<< "is a variant<> with value of type '" << GetTypeName()
3354 << "' and the value ";
3355 matcher_
.DescribeTo(os
);
3358 void DescribeNegationTo(std::ostream
* os
) const {
3359 *os
<< "is a variant<> with value of type other than '" << GetTypeName()
3360 << "' or the value ";
3361 matcher_
.DescribeNegationTo(os
);
3365 static std::string
GetTypeName() {
3367 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
3368 return internal::GetTypeName
<T
>());
3370 return "the element type";
3373 const ::testing::Matcher
<const T
&> matcher_
;
3376 } // namespace variant_matcher
3378 namespace any_cast_matcher
{
3380 // Overloads to allow AnyCastMatcher to do proper ADL lookup.
3381 template <typename T
>
3384 // Implements a matcher that any_casts the value.
3385 template <typename T
>
3386 class AnyCastMatcher
{
3388 explicit AnyCastMatcher(const ::testing::Matcher
<const T
&>& matcher
)
3389 : matcher_(matcher
) {}
3391 template <typename AnyType
>
3392 bool MatchAndExplain(const AnyType
& value
,
3393 ::testing::MatchResultListener
* listener
) const {
3394 if (!listener
->IsInterested()) {
3395 const T
* ptr
= any_cast
<T
>(&value
);
3396 return ptr
!= nullptr && matcher_
.Matches(*ptr
);
3399 const T
* elem
= any_cast
<T
>(&value
);
3400 if (elem
== nullptr) {
3401 *listener
<< "whose value is not of type '" << GetTypeName() << "'";
3405 StringMatchResultListener elem_listener
;
3406 const bool match
= matcher_
.MatchAndExplain(*elem
, &elem_listener
);
3407 *listener
<< "whose value " << PrintToString(*elem
)
3408 << (match
? " matches" : " doesn't match");
3409 PrintIfNotEmpty(elem_listener
.str(), listener
->stream());
3413 void DescribeTo(std::ostream
* os
) const {
3414 *os
<< "is an 'any' type with value of type '" << GetTypeName()
3415 << "' and the value ";
3416 matcher_
.DescribeTo(os
);
3419 void DescribeNegationTo(std::ostream
* os
) const {
3420 *os
<< "is an 'any' type with value of type other than '" << GetTypeName()
3421 << "' or the value ";
3422 matcher_
.DescribeNegationTo(os
);
3426 static std::string
GetTypeName() {
3428 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
3429 return internal::GetTypeName
<T
>());
3431 return "the element type";
3434 const ::testing::Matcher
<const T
&> matcher_
;
3437 } // namespace any_cast_matcher
3439 // Implements the Args() matcher.
3440 template <class ArgsTuple
, size_t... k
>
3441 class ArgsMatcherImpl
: public MatcherInterface
<ArgsTuple
> {
3443 using RawArgsTuple
= typename
std::decay
<ArgsTuple
>::type
;
3444 using SelectedArgs
=
3445 std::tuple
<typename
std::tuple_element
<k
, RawArgsTuple
>::type
...>;
3446 using MonomorphicInnerMatcher
= Matcher
<const SelectedArgs
&>;
3448 template <typename InnerMatcher
>
3449 explicit ArgsMatcherImpl(const InnerMatcher
& inner_matcher
)
3450 : inner_matcher_(SafeMatcherCast
<const SelectedArgs
&>(inner_matcher
)) {}
3452 bool MatchAndExplain(ArgsTuple args
,
3453 MatchResultListener
* listener
) const override
{
3454 // Workaround spurious C4100 on MSVC<=15.7 when k is empty.
3456 const SelectedArgs
& selected_args
=
3457 std::forward_as_tuple(std::get
<k
>(args
)...);
3458 if (!listener
->IsInterested()) return inner_matcher_
.Matches(selected_args
);
3460 PrintIndices(listener
->stream());
3461 *listener
<< "are " << PrintToString(selected_args
);
3463 StringMatchResultListener inner_listener
;
3465 inner_matcher_
.MatchAndExplain(selected_args
, &inner_listener
);
3466 PrintIfNotEmpty(inner_listener
.str(), listener
->stream());
3470 void DescribeTo(::std::ostream
* os
) const override
{
3471 *os
<< "are a tuple ";
3473 inner_matcher_
.DescribeTo(os
);
3476 void DescribeNegationTo(::std::ostream
* os
) const override
{
3477 *os
<< "are a tuple ";
3479 inner_matcher_
.DescribeNegationTo(os
);
3483 // Prints the indices of the selected fields.
3484 static void PrintIndices(::std::ostream
* os
) {
3485 *os
<< "whose fields (";
3486 const char* sep
= "";
3487 // Workaround spurious C4189 on MSVC<=15.7 when k is empty.
3489 const char* dummy
[] = {"", (*os
<< sep
<< "#" << k
, sep
= ", ")...};
3494 MonomorphicInnerMatcher inner_matcher_
;
3497 template <class InnerMatcher
, size_t... k
>
3500 explicit ArgsMatcher(InnerMatcher inner_matcher
)
3501 : inner_matcher_(std::move(inner_matcher
)) {}
3503 template <typename ArgsTuple
>
3504 operator Matcher
<ArgsTuple
>() const { // NOLINT
3505 return MakeMatcher(new ArgsMatcherImpl
<ArgsTuple
, k
...>(inner_matcher_
));
3509 InnerMatcher inner_matcher_
;
3512 } // namespace internal
3514 // ElementsAreArray(iterator_first, iterator_last)
3515 // ElementsAreArray(pointer, count)
3516 // ElementsAreArray(array)
3517 // ElementsAreArray(container)
3518 // ElementsAreArray({ e1, e2, ..., en })
3520 // The ElementsAreArray() functions are like ElementsAre(...), except
3521 // that they are given a homogeneous sequence rather than taking each
3522 // element as a function argument. The sequence can be specified as an
3523 // array, a pointer and count, a vector, an initializer list, or an
3524 // STL iterator range. In each of these cases, the underlying sequence
3525 // can be either a sequence of values or a sequence of matchers.
3527 // All forms of ElementsAreArray() make a copy of the input matcher sequence.
3529 template <typename Iter
>
3530 inline internal::ElementsAreArrayMatcher
<
3531 typename ::std::iterator_traits
<Iter
>::value_type
>
3532 ElementsAreArray(Iter first
, Iter last
) {
3533 typedef typename ::std::iterator_traits
<Iter
>::value_type T
;
3534 return internal::ElementsAreArrayMatcher
<T
>(first
, last
);
3537 template <typename T
>
3538 inline internal::ElementsAreArrayMatcher
<T
> ElementsAreArray(
3539 const T
* pointer
, size_t count
) {
3540 return ElementsAreArray(pointer
, pointer
+ count
);
3543 template <typename T
, size_t N
>
3544 inline internal::ElementsAreArrayMatcher
<T
> ElementsAreArray(
3545 const T (&array
)[N
]) {
3546 return ElementsAreArray(array
, N
);
3549 template <typename Container
>
3550 inline internal::ElementsAreArrayMatcher
<typename
Container::value_type
>
3551 ElementsAreArray(const Container
& container
) {
3552 return ElementsAreArray(container
.begin(), container
.end());
3555 template <typename T
>
3556 inline internal::ElementsAreArrayMatcher
<T
>
3557 ElementsAreArray(::std::initializer_list
<T
> xs
) {
3558 return ElementsAreArray(xs
.begin(), xs
.end());
3561 // UnorderedElementsAreArray(iterator_first, iterator_last)
3562 // UnorderedElementsAreArray(pointer, count)
3563 // UnorderedElementsAreArray(array)
3564 // UnorderedElementsAreArray(container)
3565 // UnorderedElementsAreArray({ e1, e2, ..., en })
3567 // UnorderedElementsAreArray() verifies that a bijective mapping onto a
3568 // collection of matchers exists.
3570 // The matchers can be specified as an array, a pointer and count, a container,
3571 // an initializer list, or an STL iterator range. In each of these cases, the
3572 // underlying matchers can be either values or matchers.
3574 template <typename Iter
>
3575 inline internal::UnorderedElementsAreArrayMatcher
<
3576 typename ::std::iterator_traits
<Iter
>::value_type
>
3577 UnorderedElementsAreArray(Iter first
, Iter last
) {
3578 typedef typename ::std::iterator_traits
<Iter
>::value_type T
;
3579 return internal::UnorderedElementsAreArrayMatcher
<T
>(
3580 internal::UnorderedMatcherRequire::ExactMatch
, first
, last
);
3583 template <typename T
>
3584 inline internal::UnorderedElementsAreArrayMatcher
<T
>
3585 UnorderedElementsAreArray(const T
* pointer
, size_t count
) {
3586 return UnorderedElementsAreArray(pointer
, pointer
+ count
);
3589 template <typename T
, size_t N
>
3590 inline internal::UnorderedElementsAreArrayMatcher
<T
>
3591 UnorderedElementsAreArray(const T (&array
)[N
]) {
3592 return UnorderedElementsAreArray(array
, N
);
3595 template <typename Container
>
3596 inline internal::UnorderedElementsAreArrayMatcher
<
3597 typename
Container::value_type
>
3598 UnorderedElementsAreArray(const Container
& container
) {
3599 return UnorderedElementsAreArray(container
.begin(), container
.end());
3602 template <typename T
>
3603 inline internal::UnorderedElementsAreArrayMatcher
<T
>
3604 UnorderedElementsAreArray(::std::initializer_list
<T
> xs
) {
3605 return UnorderedElementsAreArray(xs
.begin(), xs
.end());
3608 // _ is a matcher that matches anything of any type.
3610 // This definition is fine as:
3612 // 1. The C++ standard permits using the name _ in a namespace that
3613 // is not the global namespace or ::std.
3614 // 2. The AnythingMatcher class has no data member or constructor,
3615 // so it's OK to create global variables of this type.
3616 // 3. c-style has approved of using _ in this case.
3617 const internal::AnythingMatcher _
= {};
3618 // Creates a matcher that matches any value of the given type T.
3619 template <typename T
>
3620 inline Matcher
<T
> A() {
3621 return Matcher
<T
>(new internal::AnyMatcherImpl
<T
>());
3624 // Creates a matcher that matches any value of the given type T.
3625 template <typename T
>
3626 inline Matcher
<T
> An() { return A
<T
>(); }
3628 template <typename T
, typename M
>
3629 Matcher
<T
> internal::MatcherCastImpl
<T
, M
>::CastImpl(
3630 const M
& value
, std::false_type
/* convertible_to_matcher */,
3631 std::false_type
/* convertible_to_T */) {
3635 // Creates a polymorphic matcher that matches any NULL pointer.
3636 inline PolymorphicMatcher
<internal::IsNullMatcher
> IsNull() {
3637 return MakePolymorphicMatcher(internal::IsNullMatcher());
3640 // Creates a polymorphic matcher that matches any non-NULL pointer.
3641 // This is convenient as Not(NULL) doesn't compile (the compiler
3642 // thinks that that expression is comparing a pointer with an integer).
3643 inline PolymorphicMatcher
<internal::NotNullMatcher
> NotNull() {
3644 return MakePolymorphicMatcher(internal::NotNullMatcher());
3647 // Creates a polymorphic matcher that matches any argument that
3648 // references variable x.
3649 template <typename T
>
3650 inline internal::RefMatcher
<T
&> Ref(T
& x
) { // NOLINT
3651 return internal::RefMatcher
<T
&>(x
);
3654 // Creates a matcher that matches any double argument approximately
3655 // equal to rhs, where two NANs are considered unequal.
3656 inline internal::FloatingEqMatcher
<double> DoubleEq(double rhs
) {
3657 return internal::FloatingEqMatcher
<double>(rhs
, false);
3660 // Creates a matcher that matches any double argument approximately
3661 // equal to rhs, including NaN values when rhs is NaN.
3662 inline internal::FloatingEqMatcher
<double> NanSensitiveDoubleEq(double rhs
) {
3663 return internal::FloatingEqMatcher
<double>(rhs
, true);
3666 // Creates a matcher that matches any double argument approximately equal to
3667 // rhs, up to the specified max absolute error bound, where two NANs are
3668 // considered unequal. The max absolute error bound must be non-negative.
3669 inline internal::FloatingEqMatcher
<double> DoubleNear(
3670 double rhs
, double max_abs_error
) {
3671 return internal::FloatingEqMatcher
<double>(rhs
, false, max_abs_error
);
3674 // Creates a matcher that matches any double argument approximately equal to
3675 // rhs, up to the specified max absolute error bound, including NaN values when
3676 // rhs is NaN. The max absolute error bound must be non-negative.
3677 inline internal::FloatingEqMatcher
<double> NanSensitiveDoubleNear(
3678 double rhs
, double max_abs_error
) {
3679 return internal::FloatingEqMatcher
<double>(rhs
, true, max_abs_error
);
3682 // Creates a matcher that matches any float argument approximately
3683 // equal to rhs, where two NANs are considered unequal.
3684 inline internal::FloatingEqMatcher
<float> FloatEq(float rhs
) {
3685 return internal::FloatingEqMatcher
<float>(rhs
, false);
3688 // Creates a matcher that matches any float argument approximately
3689 // equal to rhs, including NaN values when rhs is NaN.
3690 inline internal::FloatingEqMatcher
<float> NanSensitiveFloatEq(float rhs
) {
3691 return internal::FloatingEqMatcher
<float>(rhs
, true);
3694 // Creates a matcher that matches any float argument approximately equal to
3695 // rhs, up to the specified max absolute error bound, where two NANs are
3696 // considered unequal. The max absolute error bound must be non-negative.
3697 inline internal::FloatingEqMatcher
<float> FloatNear(
3698 float rhs
, float max_abs_error
) {
3699 return internal::FloatingEqMatcher
<float>(rhs
, false, max_abs_error
);
3702 // Creates a matcher that matches any float argument approximately equal to
3703 // rhs, up to the specified max absolute error bound, including NaN values when
3704 // rhs is NaN. The max absolute error bound must be non-negative.
3705 inline internal::FloatingEqMatcher
<float> NanSensitiveFloatNear(
3706 float rhs
, float max_abs_error
) {
3707 return internal::FloatingEqMatcher
<float>(rhs
, true, max_abs_error
);
3710 // Creates a matcher that matches a pointer (raw or smart) that points
3711 // to a value that matches inner_matcher.
3712 template <typename InnerMatcher
>
3713 inline internal::PointeeMatcher
<InnerMatcher
> Pointee(
3714 const InnerMatcher
& inner_matcher
) {
3715 return internal::PointeeMatcher
<InnerMatcher
>(inner_matcher
);
3719 // Creates a matcher that matches a pointer or reference that matches
3720 // inner_matcher when dynamic_cast<To> is applied.
3721 // The result of dynamic_cast<To> is forwarded to the inner matcher.
3722 // If To is a pointer and the cast fails, the inner matcher will receive NULL.
3723 // If To is a reference and the cast fails, this matcher returns false
3725 template <typename To
>
3726 inline PolymorphicMatcher
<internal::WhenDynamicCastToMatcher
<To
> >
3727 WhenDynamicCastTo(const Matcher
<To
>& inner_matcher
) {
3728 return MakePolymorphicMatcher(
3729 internal::WhenDynamicCastToMatcher
<To
>(inner_matcher
));
3731 #endif // GTEST_HAS_RTTI
3733 // Creates a matcher that matches an object whose given field matches
3734 // 'matcher'. For example,
3735 // Field(&Foo::number, Ge(5))
3736 // matches a Foo object x if and only if x.number >= 5.
3737 template <typename Class
, typename FieldType
, typename FieldMatcher
>
3738 inline PolymorphicMatcher
<
3739 internal::FieldMatcher
<Class
, FieldType
> > Field(
3740 FieldType
Class::*field
, const FieldMatcher
& matcher
) {
3741 return MakePolymorphicMatcher(
3742 internal::FieldMatcher
<Class
, FieldType
>(
3743 field
, MatcherCast
<const FieldType
&>(matcher
)));
3744 // The call to MatcherCast() is required for supporting inner
3745 // matchers of compatible types. For example, it allows
3746 // Field(&Foo::bar, m)
3747 // to compile where bar is an int32 and m is a matcher for int64.
3750 // Same as Field() but also takes the name of the field to provide better error
3752 template <typename Class
, typename FieldType
, typename FieldMatcher
>
3753 inline PolymorphicMatcher
<internal::FieldMatcher
<Class
, FieldType
> > Field(
3754 const std::string
& field_name
, FieldType
Class::*field
,
3755 const FieldMatcher
& matcher
) {
3756 return MakePolymorphicMatcher(internal::FieldMatcher
<Class
, FieldType
>(
3757 field_name
, field
, MatcherCast
<const FieldType
&>(matcher
)));
3760 // Creates a matcher that matches an object whose given property
3761 // matches 'matcher'. For example,
3762 // Property(&Foo::str, StartsWith("hi"))
3763 // matches a Foo object x if and only if x.str() starts with "hi".
3764 template <typename Class
, typename PropertyType
, typename PropertyMatcher
>
3765 inline PolymorphicMatcher
<internal::PropertyMatcher
<
3766 Class
, PropertyType
, PropertyType (Class::*)() const> >
3767 Property(PropertyType (Class::*property
)() const,
3768 const PropertyMatcher
& matcher
) {
3769 return MakePolymorphicMatcher(
3770 internal::PropertyMatcher
<Class
, PropertyType
,
3771 PropertyType (Class::*)() const>(
3772 property
, MatcherCast
<const PropertyType
&>(matcher
)));
3773 // The call to MatcherCast() is required for supporting inner
3774 // matchers of compatible types. For example, it allows
3775 // Property(&Foo::bar, m)
3776 // to compile where bar() returns an int32 and m is a matcher for int64.
3779 // Same as Property() above, but also takes the name of the property to provide
3780 // better error messages.
3781 template <typename Class
, typename PropertyType
, typename PropertyMatcher
>
3782 inline PolymorphicMatcher
<internal::PropertyMatcher
<
3783 Class
, PropertyType
, PropertyType (Class::*)() const> >
3784 Property(const std::string
& property_name
,
3785 PropertyType (Class::*property
)() const,
3786 const PropertyMatcher
& matcher
) {
3787 return MakePolymorphicMatcher(
3788 internal::PropertyMatcher
<Class
, PropertyType
,
3789 PropertyType (Class::*)() const>(
3790 property_name
, property
, MatcherCast
<const PropertyType
&>(matcher
)));
3793 // The same as above but for reference-qualified member functions.
3794 template <typename Class
, typename PropertyType
, typename PropertyMatcher
>
3795 inline PolymorphicMatcher
<internal::PropertyMatcher
<
3796 Class
, PropertyType
, PropertyType (Class::*)() const &> >
3797 Property(PropertyType (Class::*property
)() const &,
3798 const PropertyMatcher
& matcher
) {
3799 return MakePolymorphicMatcher(
3800 internal::PropertyMatcher
<Class
, PropertyType
,
3801 PropertyType (Class::*)() const&>(
3802 property
, MatcherCast
<const PropertyType
&>(matcher
)));
3805 // Three-argument form for reference-qualified member functions.
3806 template <typename Class
, typename PropertyType
, typename PropertyMatcher
>
3807 inline PolymorphicMatcher
<internal::PropertyMatcher
<
3808 Class
, PropertyType
, PropertyType (Class::*)() const &> >
3809 Property(const std::string
& property_name
,
3810 PropertyType (Class::*property
)() const &,
3811 const PropertyMatcher
& matcher
) {
3812 return MakePolymorphicMatcher(
3813 internal::PropertyMatcher
<Class
, PropertyType
,
3814 PropertyType (Class::*)() const&>(
3815 property_name
, property
, MatcherCast
<const PropertyType
&>(matcher
)));
3818 // Creates a matcher that matches an object if and only if the result of
3819 // applying a callable to x matches 'matcher'. For example,
3820 // ResultOf(f, StartsWith("hi"))
3821 // matches a Foo object x if and only if f(x) starts with "hi".
3822 // `callable` parameter can be a function, function pointer, or a functor. It is
3823 // required to keep no state affecting the results of the calls on it and make
3824 // no assumptions about how many calls will be made. Any state it keeps must be
3825 // protected from the concurrent access.
3826 template <typename Callable
, typename InnerMatcher
>
3827 internal::ResultOfMatcher
<Callable
, InnerMatcher
> ResultOf(
3828 Callable callable
, InnerMatcher matcher
) {
3829 return internal::ResultOfMatcher
<Callable
, InnerMatcher
>(
3830 std::move(callable
), std::move(matcher
));
3835 // Matches a string equal to str.
3836 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::string
> > StrEq(
3837 const std::string
& str
) {
3838 return MakePolymorphicMatcher(
3839 internal::StrEqualityMatcher
<std::string
>(str
, true, true));
3842 // Matches a string not equal to str.
3843 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::string
> > StrNe(
3844 const std::string
& str
) {
3845 return MakePolymorphicMatcher(
3846 internal::StrEqualityMatcher
<std::string
>(str
, false, true));
3849 // Matches a string equal to str, ignoring case.
3850 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::string
> > StrCaseEq(
3851 const std::string
& str
) {
3852 return MakePolymorphicMatcher(
3853 internal::StrEqualityMatcher
<std::string
>(str
, true, false));
3856 // Matches a string not equal to str, ignoring case.
3857 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::string
> > StrCaseNe(
3858 const std::string
& str
) {
3859 return MakePolymorphicMatcher(
3860 internal::StrEqualityMatcher
<std::string
>(str
, false, false));
3863 // Creates a matcher that matches any string, std::string, or C string
3864 // that contains the given substring.
3865 inline PolymorphicMatcher
<internal::HasSubstrMatcher
<std::string
> > HasSubstr(
3866 const std::string
& substring
) {
3867 return MakePolymorphicMatcher(
3868 internal::HasSubstrMatcher
<std::string
>(substring
));
3871 // Matches a string that starts with 'prefix' (case-sensitive).
3872 inline PolymorphicMatcher
<internal::StartsWithMatcher
<std::string
> > StartsWith(
3873 const std::string
& prefix
) {
3874 return MakePolymorphicMatcher(
3875 internal::StartsWithMatcher
<std::string
>(prefix
));
3878 // Matches a string that ends with 'suffix' (case-sensitive).
3879 inline PolymorphicMatcher
<internal::EndsWithMatcher
<std::string
> > EndsWith(
3880 const std::string
& suffix
) {
3881 return MakePolymorphicMatcher(internal::EndsWithMatcher
<std::string
>(suffix
));
3884 #if GTEST_HAS_STD_WSTRING
3885 // Wide string matchers.
3887 // Matches a string equal to str.
3888 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::wstring
> > StrEq(
3889 const std::wstring
& str
) {
3890 return MakePolymorphicMatcher(
3891 internal::StrEqualityMatcher
<std::wstring
>(str
, true, true));
3894 // Matches a string not equal to str.
3895 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::wstring
> > StrNe(
3896 const std::wstring
& str
) {
3897 return MakePolymorphicMatcher(
3898 internal::StrEqualityMatcher
<std::wstring
>(str
, false, true));
3901 // Matches a string equal to str, ignoring case.
3902 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::wstring
> >
3903 StrCaseEq(const std::wstring
& str
) {
3904 return MakePolymorphicMatcher(
3905 internal::StrEqualityMatcher
<std::wstring
>(str
, true, false));
3908 // Matches a string not equal to str, ignoring case.
3909 inline PolymorphicMatcher
<internal::StrEqualityMatcher
<std::wstring
> >
3910 StrCaseNe(const std::wstring
& str
) {
3911 return MakePolymorphicMatcher(
3912 internal::StrEqualityMatcher
<std::wstring
>(str
, false, false));
3915 // Creates a matcher that matches any ::wstring, std::wstring, or C wide string
3916 // that contains the given substring.
3917 inline PolymorphicMatcher
<internal::HasSubstrMatcher
<std::wstring
> > HasSubstr(
3918 const std::wstring
& substring
) {
3919 return MakePolymorphicMatcher(
3920 internal::HasSubstrMatcher
<std::wstring
>(substring
));
3923 // Matches a string that starts with 'prefix' (case-sensitive).
3924 inline PolymorphicMatcher
<internal::StartsWithMatcher
<std::wstring
> >
3925 StartsWith(const std::wstring
& prefix
) {
3926 return MakePolymorphicMatcher(
3927 internal::StartsWithMatcher
<std::wstring
>(prefix
));
3930 // Matches a string that ends with 'suffix' (case-sensitive).
3931 inline PolymorphicMatcher
<internal::EndsWithMatcher
<std::wstring
> > EndsWith(
3932 const std::wstring
& suffix
) {
3933 return MakePolymorphicMatcher(
3934 internal::EndsWithMatcher
<std::wstring
>(suffix
));
3937 #endif // GTEST_HAS_STD_WSTRING
3939 // Creates a polymorphic matcher that matches a 2-tuple where the
3940 // first field == the second field.
3941 inline internal::Eq2Matcher
Eq() { return internal::Eq2Matcher(); }
3943 // Creates a polymorphic matcher that matches a 2-tuple where the
3944 // first field >= the second field.
3945 inline internal::Ge2Matcher
Ge() { return internal::Ge2Matcher(); }
3947 // Creates a polymorphic matcher that matches a 2-tuple where the
3948 // first field > the second field.
3949 inline internal::Gt2Matcher
Gt() { return internal::Gt2Matcher(); }
3951 // Creates a polymorphic matcher that matches a 2-tuple where the
3952 // first field <= the second field.
3953 inline internal::Le2Matcher
Le() { return internal::Le2Matcher(); }
3955 // Creates a polymorphic matcher that matches a 2-tuple where the
3956 // first field < the second field.
3957 inline internal::Lt2Matcher
Lt() { return internal::Lt2Matcher(); }
3959 // Creates a polymorphic matcher that matches a 2-tuple where the
3960 // first field != the second field.
3961 inline internal::Ne2Matcher
Ne() { return internal::Ne2Matcher(); }
3963 // Creates a polymorphic matcher that matches a 2-tuple where
3964 // FloatEq(first field) matches the second field.
3965 inline internal::FloatingEq2Matcher
<float> FloatEq() {
3966 return internal::FloatingEq2Matcher
<float>();
3969 // Creates a polymorphic matcher that matches a 2-tuple where
3970 // DoubleEq(first field) matches the second field.
3971 inline internal::FloatingEq2Matcher
<double> DoubleEq() {
3972 return internal::FloatingEq2Matcher
<double>();
3975 // Creates a polymorphic matcher that matches a 2-tuple where
3976 // FloatEq(first field) matches the second field with NaN equality.
3977 inline internal::FloatingEq2Matcher
<float> NanSensitiveFloatEq() {
3978 return internal::FloatingEq2Matcher
<float>(true);
3981 // Creates a polymorphic matcher that matches a 2-tuple where
3982 // DoubleEq(first field) matches the second field with NaN equality.
3983 inline internal::FloatingEq2Matcher
<double> NanSensitiveDoubleEq() {
3984 return internal::FloatingEq2Matcher
<double>(true);
3987 // Creates a polymorphic matcher that matches a 2-tuple where
3988 // FloatNear(first field, max_abs_error) matches the second field.
3989 inline internal::FloatingEq2Matcher
<float> FloatNear(float max_abs_error
) {
3990 return internal::FloatingEq2Matcher
<float>(max_abs_error
);
3993 // Creates a polymorphic matcher that matches a 2-tuple where
3994 // DoubleNear(first field, max_abs_error) matches the second field.
3995 inline internal::FloatingEq2Matcher
<double> DoubleNear(double max_abs_error
) {
3996 return internal::FloatingEq2Matcher
<double>(max_abs_error
);
3999 // Creates a polymorphic matcher that matches a 2-tuple where
4000 // FloatNear(first field, max_abs_error) matches the second field with NaN
4002 inline internal::FloatingEq2Matcher
<float> NanSensitiveFloatNear(
4003 float max_abs_error
) {
4004 return internal::FloatingEq2Matcher
<float>(max_abs_error
, true);
4007 // Creates a polymorphic matcher that matches a 2-tuple where
4008 // DoubleNear(first field, max_abs_error) matches the second field with NaN
4010 inline internal::FloatingEq2Matcher
<double> NanSensitiveDoubleNear(
4011 double max_abs_error
) {
4012 return internal::FloatingEq2Matcher
<double>(max_abs_error
, true);
4015 // Creates a matcher that matches any value of type T that m doesn't
4017 template <typename InnerMatcher
>
4018 inline internal::NotMatcher
<InnerMatcher
> Not(InnerMatcher m
) {
4019 return internal::NotMatcher
<InnerMatcher
>(m
);
4022 // Returns a matcher that matches anything that satisfies the given
4023 // predicate. The predicate can be any unary function or functor
4024 // whose return type can be implicitly converted to bool.
4025 template <typename Predicate
>
4026 inline PolymorphicMatcher
<internal::TrulyMatcher
<Predicate
> >
4027 Truly(Predicate pred
) {
4028 return MakePolymorphicMatcher(internal::TrulyMatcher
<Predicate
>(pred
));
4031 // Returns a matcher that matches the container size. The container must
4032 // support both size() and size_type which all STL-like containers provide.
4033 // Note that the parameter 'size' can be a value of type size_type as well as
4034 // matcher. For instance:
4035 // EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
4036 // EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
4037 template <typename SizeMatcher
>
4038 inline internal::SizeIsMatcher
<SizeMatcher
>
4039 SizeIs(const SizeMatcher
& size_matcher
) {
4040 return internal::SizeIsMatcher
<SizeMatcher
>(size_matcher
);
4043 // Returns a matcher that matches the distance between the container's begin()
4044 // iterator and its end() iterator, i.e. the size of the container. This matcher
4045 // can be used instead of SizeIs with containers such as std::forward_list which
4046 // do not implement size(). The container must provide const_iterator (with
4047 // valid iterator_traits), begin() and end().
4048 template <typename DistanceMatcher
>
4049 inline internal::BeginEndDistanceIsMatcher
<DistanceMatcher
>
4050 BeginEndDistanceIs(const DistanceMatcher
& distance_matcher
) {
4051 return internal::BeginEndDistanceIsMatcher
<DistanceMatcher
>(distance_matcher
);
4054 // Returns a matcher that matches an equal container.
4055 // This matcher behaves like Eq(), but in the event of mismatch lists the
4056 // values that are included in one container but not the other. (Duplicate
4057 // values and order differences are not explained.)
4058 template <typename Container
>
4059 inline PolymorphicMatcher
<internal::ContainerEqMatcher
<
4060 typename
std::remove_const
<Container
>::type
>>
4061 ContainerEq(const Container
& rhs
) {
4062 // This following line is for working around a bug in MSVC 8.0,
4063 // which causes Container to be a const type sometimes.
4064 typedef typename
std::remove_const
<Container
>::type RawContainer
;
4065 return MakePolymorphicMatcher(
4066 internal::ContainerEqMatcher
<RawContainer
>(rhs
));
4069 // Returns a matcher that matches a container that, when sorted using
4070 // the given comparator, matches container_matcher.
4071 template <typename Comparator
, typename ContainerMatcher
>
4072 inline internal::WhenSortedByMatcher
<Comparator
, ContainerMatcher
>
4073 WhenSortedBy(const Comparator
& comparator
,
4074 const ContainerMatcher
& container_matcher
) {
4075 return internal::WhenSortedByMatcher
<Comparator
, ContainerMatcher
>(
4076 comparator
, container_matcher
);
4079 // Returns a matcher that matches a container that, when sorted using
4080 // the < operator, matches container_matcher.
4081 template <typename ContainerMatcher
>
4082 inline internal::WhenSortedByMatcher
<internal::LessComparator
, ContainerMatcher
>
4083 WhenSorted(const ContainerMatcher
& container_matcher
) {
4085 internal::WhenSortedByMatcher
<internal::LessComparator
, ContainerMatcher
>(
4086 internal::LessComparator(), container_matcher
);
4089 // Matches an STL-style container or a native array that contains the
4090 // same number of elements as in rhs, where its i-th element and rhs's
4091 // i-th element (as a pair) satisfy the given pair matcher, for all i.
4092 // TupleMatcher must be able to be safely cast to Matcher<std::tuple<const
4093 // T1&, const T2&> >, where T1 and T2 are the types of elements in the
4094 // LHS container and the RHS container respectively.
4095 template <typename TupleMatcher
, typename Container
>
4096 inline internal::PointwiseMatcher
<TupleMatcher
,
4097 typename
std::remove_const
<Container
>::type
>
4098 Pointwise(const TupleMatcher
& tuple_matcher
, const Container
& rhs
) {
4099 // This following line is for working around a bug in MSVC 8.0,
4100 // which causes Container to be a const type sometimes (e.g. when
4101 // rhs is a const int[])..
4102 typedef typename
std::remove_const
<Container
>::type RawContainer
;
4103 return internal::PointwiseMatcher
<TupleMatcher
, RawContainer
>(
4104 tuple_matcher
, rhs
);
4108 // Supports the Pointwise(m, {a, b, c}) syntax.
4109 template <typename TupleMatcher
, typename T
>
4110 inline internal::PointwiseMatcher
<TupleMatcher
, std::vector
<T
> > Pointwise(
4111 const TupleMatcher
& tuple_matcher
, std::initializer_list
<T
> rhs
) {
4112 return Pointwise(tuple_matcher
, std::vector
<T
>(rhs
));
4116 // UnorderedPointwise(pair_matcher, rhs) matches an STL-style
4117 // container or a native array that contains the same number of
4118 // elements as in rhs, where in some permutation of the container, its
4119 // i-th element and rhs's i-th element (as a pair) satisfy the given
4120 // pair matcher, for all i. Tuple2Matcher must be able to be safely
4121 // cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are
4122 // the types of elements in the LHS container and the RHS container
4125 // This is like Pointwise(pair_matcher, rhs), except that the element
4126 // order doesn't matter.
4127 template <typename Tuple2Matcher
, typename RhsContainer
>
4128 inline internal::UnorderedElementsAreArrayMatcher
<
4129 typename
internal::BoundSecondMatcher
<
4131 typename
internal::StlContainerView
<
4132 typename
std::remove_const
<RhsContainer
>::type
>::type::value_type
>>
4133 UnorderedPointwise(const Tuple2Matcher
& tuple2_matcher
,
4134 const RhsContainer
& rhs_container
) {
4135 // This following line is for working around a bug in MSVC 8.0,
4136 // which causes RhsContainer to be a const type sometimes (e.g. when
4137 // rhs_container is a const int[]).
4138 typedef typename
std::remove_const
<RhsContainer
>::type RawRhsContainer
;
4140 // RhsView allows the same code to handle RhsContainer being a
4141 // STL-style container and it being a native C-style array.
4142 typedef typename
internal::StlContainerView
<RawRhsContainer
> RhsView
;
4143 typedef typename
RhsView::type RhsStlContainer
;
4144 typedef typename
RhsStlContainer::value_type Second
;
4145 const RhsStlContainer
& rhs_stl_container
=
4146 RhsView::ConstReference(rhs_container
);
4148 // Create a matcher for each element in rhs_container.
4149 ::std::vector
<internal::BoundSecondMatcher
<Tuple2Matcher
, Second
> > matchers
;
4150 for (typename
RhsStlContainer::const_iterator it
= rhs_stl_container
.begin();
4151 it
!= rhs_stl_container
.end(); ++it
) {
4153 internal::MatcherBindSecond(tuple2_matcher
, *it
));
4156 // Delegate the work to UnorderedElementsAreArray().
4157 return UnorderedElementsAreArray(matchers
);
4161 // Supports the UnorderedPointwise(m, {a, b, c}) syntax.
4162 template <typename Tuple2Matcher
, typename T
>
4163 inline internal::UnorderedElementsAreArrayMatcher
<
4164 typename
internal::BoundSecondMatcher
<Tuple2Matcher
, T
> >
4165 UnorderedPointwise(const Tuple2Matcher
& tuple2_matcher
,
4166 std::initializer_list
<T
> rhs
) {
4167 return UnorderedPointwise(tuple2_matcher
, std::vector
<T
>(rhs
));
4171 // Matches an STL-style container or a native array that contains at
4172 // least one element matching the given value or matcher.
4175 // ::std::set<int> page_ids;
4176 // page_ids.insert(3);
4177 // page_ids.insert(1);
4178 // EXPECT_THAT(page_ids, Contains(1));
4179 // EXPECT_THAT(page_ids, Contains(Gt(2)));
4180 // EXPECT_THAT(page_ids, Not(Contains(4)));
4182 // ::std::map<int, size_t> page_lengths;
4183 // page_lengths[1] = 100;
4184 // EXPECT_THAT(page_lengths,
4185 // Contains(::std::pair<const int, size_t>(1, 100)));
4187 // const char* user_ids[] = { "joe", "mike", "tom" };
4188 // EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
4189 template <typename M
>
4190 inline internal::ContainsMatcher
<M
> Contains(M matcher
) {
4191 return internal::ContainsMatcher
<M
>(matcher
);
4194 // IsSupersetOf(iterator_first, iterator_last)
4195 // IsSupersetOf(pointer, count)
4196 // IsSupersetOf(array)
4197 // IsSupersetOf(container)
4198 // IsSupersetOf({e1, e2, ..., en})
4200 // IsSupersetOf() verifies that a surjective partial mapping onto a collection
4201 // of matchers exists. In other words, a container matches
4202 // IsSupersetOf({e1, ..., en}) if and only if there is a permutation
4203 // {y1, ..., yn} of some of the container's elements where y1 matches e1,
4204 // ..., and yn matches en. Obviously, the size of the container must be >= n
4205 // in order to have a match. Examples:
4207 // - {1, 2, 3} matches IsSupersetOf({Ge(3), Ne(0)}), as 3 matches Ge(3) and
4209 // - {1, 2} doesn't match IsSupersetOf({Eq(1), Lt(2)}), even though 1 matches
4210 // both Eq(1) and Lt(2). The reason is that different matchers must be used
4211 // for elements in different slots of the container.
4212 // - {1, 1, 2} matches IsSupersetOf({Eq(1), Lt(2)}), as (the first) 1 matches
4213 // Eq(1) and (the second) 1 matches Lt(2).
4214 // - {1, 2, 3} matches IsSupersetOf(Gt(1), Gt(1)), as 2 matches (the first)
4215 // Gt(1) and 3 matches (the second) Gt(1).
4217 // The matchers can be specified as an array, a pointer and count, a container,
4218 // an initializer list, or an STL iterator range. In each of these cases, the
4219 // underlying matchers can be either values or matchers.
4221 template <typename Iter
>
4222 inline internal::UnorderedElementsAreArrayMatcher
<
4223 typename ::std::iterator_traits
<Iter
>::value_type
>
4224 IsSupersetOf(Iter first
, Iter last
) {
4225 typedef typename ::std::iterator_traits
<Iter
>::value_type T
;
4226 return internal::UnorderedElementsAreArrayMatcher
<T
>(
4227 internal::UnorderedMatcherRequire::Superset
, first
, last
);
4230 template <typename T
>
4231 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSupersetOf(
4232 const T
* pointer
, size_t count
) {
4233 return IsSupersetOf(pointer
, pointer
+ count
);
4236 template <typename T
, size_t N
>
4237 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSupersetOf(
4238 const T (&array
)[N
]) {
4239 return IsSupersetOf(array
, N
);
4242 template <typename Container
>
4243 inline internal::UnorderedElementsAreArrayMatcher
<
4244 typename
Container::value_type
>
4245 IsSupersetOf(const Container
& container
) {
4246 return IsSupersetOf(container
.begin(), container
.end());
4249 template <typename T
>
4250 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSupersetOf(
4251 ::std::initializer_list
<T
> xs
) {
4252 return IsSupersetOf(xs
.begin(), xs
.end());
4255 // IsSubsetOf(iterator_first, iterator_last)
4256 // IsSubsetOf(pointer, count)
4257 // IsSubsetOf(array)
4258 // IsSubsetOf(container)
4259 // IsSubsetOf({e1, e2, ..., en})
4261 // IsSubsetOf() verifies that an injective mapping onto a collection of matchers
4262 // exists. In other words, a container matches IsSubsetOf({e1, ..., en}) if and
4263 // only if there is a subset of matchers {m1, ..., mk} which would match the
4264 // container using UnorderedElementsAre. Obviously, the size of the container
4265 // must be <= n in order to have a match. Examples:
4267 // - {1} matches IsSubsetOf({Gt(0), Lt(0)}), as 1 matches Gt(0).
4268 // - {1, -1} matches IsSubsetOf({Lt(0), Gt(0)}), as 1 matches Gt(0) and -1
4270 // - {1, 2} doesn't matches IsSubsetOf({Gt(0), Lt(0)}), even though 1 and 2 both
4271 // match Gt(0). The reason is that different matchers must be used for
4272 // elements in different slots of the container.
4274 // The matchers can be specified as an array, a pointer and count, a container,
4275 // an initializer list, or an STL iterator range. In each of these cases, the
4276 // underlying matchers can be either values or matchers.
4278 template <typename Iter
>
4279 inline internal::UnorderedElementsAreArrayMatcher
<
4280 typename ::std::iterator_traits
<Iter
>::value_type
>
4281 IsSubsetOf(Iter first
, Iter last
) {
4282 typedef typename ::std::iterator_traits
<Iter
>::value_type T
;
4283 return internal::UnorderedElementsAreArrayMatcher
<T
>(
4284 internal::UnorderedMatcherRequire::Subset
, first
, last
);
4287 template <typename T
>
4288 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSubsetOf(
4289 const T
* pointer
, size_t count
) {
4290 return IsSubsetOf(pointer
, pointer
+ count
);
4293 template <typename T
, size_t N
>
4294 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSubsetOf(
4295 const T (&array
)[N
]) {
4296 return IsSubsetOf(array
, N
);
4299 template <typename Container
>
4300 inline internal::UnorderedElementsAreArrayMatcher
<
4301 typename
Container::value_type
>
4302 IsSubsetOf(const Container
& container
) {
4303 return IsSubsetOf(container
.begin(), container
.end());
4306 template <typename T
>
4307 inline internal::UnorderedElementsAreArrayMatcher
<T
> IsSubsetOf(
4308 ::std::initializer_list
<T
> xs
) {
4309 return IsSubsetOf(xs
.begin(), xs
.end());
4312 // Matches an STL-style container or a native array that contains only
4313 // elements matching the given value or matcher.
4315 // Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
4316 // the messages are different.
4319 // ::std::set<int> page_ids;
4320 // // Each(m) matches an empty container, regardless of what m is.
4321 // EXPECT_THAT(page_ids, Each(Eq(1)));
4322 // EXPECT_THAT(page_ids, Each(Eq(77)));
4324 // page_ids.insert(3);
4325 // EXPECT_THAT(page_ids, Each(Gt(0)));
4326 // EXPECT_THAT(page_ids, Not(Each(Gt(4))));
4327 // page_ids.insert(1);
4328 // EXPECT_THAT(page_ids, Not(Each(Lt(2))));
4330 // ::std::map<int, size_t> page_lengths;
4331 // page_lengths[1] = 100;
4332 // page_lengths[2] = 200;
4333 // page_lengths[3] = 300;
4334 // EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
4335 // EXPECT_THAT(page_lengths, Each(Key(Le(3))));
4337 // const char* user_ids[] = { "joe", "mike", "tom" };
4338 // EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
4339 template <typename M
>
4340 inline internal::EachMatcher
<M
> Each(M matcher
) {
4341 return internal::EachMatcher
<M
>(matcher
);
4344 // Key(inner_matcher) matches an std::pair whose 'first' field matches
4345 // inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
4346 // std::map that contains at least one element whose key is >= 5.
4347 template <typename M
>
4348 inline internal::KeyMatcher
<M
> Key(M inner_matcher
) {
4349 return internal::KeyMatcher
<M
>(inner_matcher
);
4352 // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
4353 // matches first_matcher and whose 'second' field matches second_matcher. For
4354 // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
4355 // to match a std::map<int, string> that contains exactly one element whose key
4356 // is >= 5 and whose value equals "foo".
4357 template <typename FirstMatcher
, typename SecondMatcher
>
4358 inline internal::PairMatcher
<FirstMatcher
, SecondMatcher
>
4359 Pair(FirstMatcher first_matcher
, SecondMatcher second_matcher
) {
4360 return internal::PairMatcher
<FirstMatcher
, SecondMatcher
>(
4361 first_matcher
, second_matcher
);
4364 // Returns a predicate that is satisfied by anything that matches the
4366 template <typename M
>
4367 inline internal::MatcherAsPredicate
<M
> Matches(M matcher
) {
4368 return internal::MatcherAsPredicate
<M
>(matcher
);
4371 // Returns true if and only if the value matches the matcher.
4372 template <typename T
, typename M
>
4373 inline bool Value(const T
& value
, M matcher
) {
4374 return testing::Matches(matcher
)(value
);
4377 // Matches the value against the given matcher and explains the match
4378 // result to listener.
4379 template <typename T
, typename M
>
4380 inline bool ExplainMatchResult(
4381 M matcher
, const T
& value
, MatchResultListener
* listener
) {
4382 return SafeMatcherCast
<const T
&>(matcher
).MatchAndExplain(value
, listener
);
4385 // Returns a string representation of the given matcher. Useful for description
4386 // strings of matchers defined using MATCHER_P* macros that accept matchers as
4387 // their arguments. For example:
4389 // MATCHER_P(XAndYThat, matcher,
4390 // "X that " + DescribeMatcher<int>(matcher, negation) +
4391 // " and Y that " + DescribeMatcher<double>(matcher, negation)) {
4392 // return ExplainMatchResult(matcher, arg.x(), result_listener) &&
4393 // ExplainMatchResult(matcher, arg.y(), result_listener);
4395 template <typename T
, typename M
>
4396 std::string
DescribeMatcher(const M
& matcher
, bool negation
= false) {
4397 ::std::stringstream ss
;
4398 Matcher
<T
> monomorphic_matcher
= SafeMatcherCast
<T
>(matcher
);
4400 monomorphic_matcher
.DescribeNegationTo(&ss
);
4402 monomorphic_matcher
.DescribeTo(&ss
);
4407 template <typename
... Args
>
4408 internal::ElementsAreMatcher
<
4409 std::tuple
<typename
std::decay
<const Args
&>::type
...>>
4410 ElementsAre(const Args
&... matchers
) {
4411 return internal::ElementsAreMatcher
<
4412 std::tuple
<typename
std::decay
<const Args
&>::type
...>>(
4413 std::make_tuple(matchers
...));
4416 template <typename
... Args
>
4417 internal::UnorderedElementsAreMatcher
<
4418 std::tuple
<typename
std::decay
<const Args
&>::type
...>>
4419 UnorderedElementsAre(const Args
&... matchers
) {
4420 return internal::UnorderedElementsAreMatcher
<
4421 std::tuple
<typename
std::decay
<const Args
&>::type
...>>(
4422 std::make_tuple(matchers
...));
4425 // Define variadic matcher versions.
4426 template <typename
... Args
>
4427 internal::AllOfMatcher
<typename
std::decay
<const Args
&>::type
...> AllOf(
4428 const Args
&... matchers
) {
4429 return internal::AllOfMatcher
<typename
std::decay
<const Args
&>::type
...>(
4433 template <typename
... Args
>
4434 internal::AnyOfMatcher
<typename
std::decay
<const Args
&>::type
...> AnyOf(
4435 const Args
&... matchers
) {
4436 return internal::AnyOfMatcher
<typename
std::decay
<const Args
&>::type
...>(
4440 // AnyOfArray(array)
4441 // AnyOfArray(pointer, count)
4442 // AnyOfArray(container)
4443 // AnyOfArray({ e1, e2, ..., en })
4444 // AnyOfArray(iterator_first, iterator_last)
4446 // AnyOfArray() verifies whether a given value matches any member of a
4447 // collection of matchers.
4449 // AllOfArray(array)
4450 // AllOfArray(pointer, count)
4451 // AllOfArray(container)
4452 // AllOfArray({ e1, e2, ..., en })
4453 // AllOfArray(iterator_first, iterator_last)
4455 // AllOfArray() verifies whether a given value matches all members of a
4456 // collection of matchers.
4458 // The matchers can be specified as an array, a pointer and count, a container,
4459 // an initializer list, or an STL iterator range. In each of these cases, the
4460 // underlying matchers can be either values or matchers.
4462 template <typename Iter
>
4463 inline internal::AnyOfArrayMatcher
<
4464 typename ::std::iterator_traits
<Iter
>::value_type
>
4465 AnyOfArray(Iter first
, Iter last
) {
4466 return internal::AnyOfArrayMatcher
<
4467 typename ::std::iterator_traits
<Iter
>::value_type
>(first
, last
);
4470 template <typename Iter
>
4471 inline internal::AllOfArrayMatcher
<
4472 typename ::std::iterator_traits
<Iter
>::value_type
>
4473 AllOfArray(Iter first
, Iter last
) {
4474 return internal::AllOfArrayMatcher
<
4475 typename ::std::iterator_traits
<Iter
>::value_type
>(first
, last
);
4478 template <typename T
>
4479 inline internal::AnyOfArrayMatcher
<T
> AnyOfArray(const T
* ptr
, size_t count
) {
4480 return AnyOfArray(ptr
, ptr
+ count
);
4483 template <typename T
>
4484 inline internal::AllOfArrayMatcher
<T
> AllOfArray(const T
* ptr
, size_t count
) {
4485 return AllOfArray(ptr
, ptr
+ count
);
4488 template <typename T
, size_t N
>
4489 inline internal::AnyOfArrayMatcher
<T
> AnyOfArray(const T (&array
)[N
]) {
4490 return AnyOfArray(array
, N
);
4493 template <typename T
, size_t N
>
4494 inline internal::AllOfArrayMatcher
<T
> AllOfArray(const T (&array
)[N
]) {
4495 return AllOfArray(array
, N
);
4498 template <typename Container
>
4499 inline internal::AnyOfArrayMatcher
<typename
Container::value_type
> AnyOfArray(
4500 const Container
& container
) {
4501 return AnyOfArray(container
.begin(), container
.end());
4504 template <typename Container
>
4505 inline internal::AllOfArrayMatcher
<typename
Container::value_type
> AllOfArray(
4506 const Container
& container
) {
4507 return AllOfArray(container
.begin(), container
.end());
4510 template <typename T
>
4511 inline internal::AnyOfArrayMatcher
<T
> AnyOfArray(
4512 ::std::initializer_list
<T
> xs
) {
4513 return AnyOfArray(xs
.begin(), xs
.end());
4516 template <typename T
>
4517 inline internal::AllOfArrayMatcher
<T
> AllOfArray(
4518 ::std::initializer_list
<T
> xs
) {
4519 return AllOfArray(xs
.begin(), xs
.end());
4522 // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
4523 // fields of it matches a_matcher. C++ doesn't support default
4524 // arguments for function templates, so we have to overload it.
4525 template <size_t... k
, typename InnerMatcher
>
4526 internal::ArgsMatcher
<typename
std::decay
<InnerMatcher
>::type
, k
...> Args(
4527 InnerMatcher
&& matcher
) {
4528 return internal::ArgsMatcher
<typename
std::decay
<InnerMatcher
>::type
, k
...>(
4529 std::forward
<InnerMatcher
>(matcher
));
4532 // AllArgs(m) is a synonym of m. This is useful in
4534 // EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
4536 // which is easier to read than
4538 // EXPECT_CALL(foo, Bar(_, _)).With(Eq());
4539 template <typename InnerMatcher
>
4540 inline InnerMatcher
AllArgs(const InnerMatcher
& matcher
) { return matcher
; }
4542 // Returns a matcher that matches the value of an optional<> type variable.
4543 // The matcher implementation only uses '!arg' and requires that the optional<>
4544 // type has a 'value_type' member type and that '*arg' is of type 'value_type'
4545 // and is printable using 'PrintToString'. It is compatible with
4546 // std::optional/std::experimental::optional.
4547 // Note that to compare an optional type variable against nullopt you should
4548 // use Eq(nullopt) and not Optional(Eq(nullopt)). The latter implies that the
4549 // optional value contains an optional itself.
4550 template <typename ValueMatcher
>
4551 inline internal::OptionalMatcher
<ValueMatcher
> Optional(
4552 const ValueMatcher
& value_matcher
) {
4553 return internal::OptionalMatcher
<ValueMatcher
>(value_matcher
);
4556 // Returns a matcher that matches the value of a absl::any type variable.
4557 template <typename T
>
4558 PolymorphicMatcher
<internal::any_cast_matcher::AnyCastMatcher
<T
> > AnyWith(
4559 const Matcher
<const T
&>& matcher
) {
4560 return MakePolymorphicMatcher(
4561 internal::any_cast_matcher::AnyCastMatcher
<T
>(matcher
));
4564 // Returns a matcher that matches the value of a variant<> type variable.
4565 // The matcher implementation uses ADL to find the holds_alternative and get
4567 // It is compatible with std::variant.
4568 template <typename T
>
4569 PolymorphicMatcher
<internal::variant_matcher::VariantMatcher
<T
> > VariantWith(
4570 const Matcher
<const T
&>& matcher
) {
4571 return MakePolymorphicMatcher(
4572 internal::variant_matcher::VariantMatcher
<T
>(matcher
));
4575 // These macros allow using matchers to check values in Google Test
4576 // tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
4577 // succeed if and only if the value matches the matcher. If the assertion
4578 // fails, the value and the description of the matcher will be printed.
4579 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
4580 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
4581 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
4582 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
4584 } // namespace testing
4587 #if __has_warning("-Wdeprecated-copy")
4588 #pragma clang diagnostic pop
4592 GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046
4594 // Include any custom callback matchers added by the local installation.
4595 // We must include this header at the end to make sure it can use the
4596 // declarations from this file.
4597 #include "gmock/internal/custom/gmock-matchers.h"
4599 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_