1// Copyright 2007, Google Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
31// Google Mock - a framework for writing C++ mock classes.
32//
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.
36//
37// See googletest/include/gtest/gtest-matchers.h for the definition of class
38// Matcher, class MatcherInterface, and others.
39
40// GOOGLETEST_CM0002 DO NOT DELETE
41
42#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
43#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
44
45#include <math.h>
46#include <algorithm>
47#include <initializer_list>
48#include <iterator>
49#include <limits>
50#include <memory>
51#include <ostream> // NOLINT
52#include <sstream>
53#include <string>
54#include <type_traits>
55#include <utility>
56#include <vector>
57#include "gmock/internal/gmock-internal-utils.h"
58#include "gmock/internal/gmock-port.h"
59#include "gtest/gtest.h"
60
61// MSVC warning C5046 is new as of VS2017 version 15.8.
62#if defined(_MSC_VER) && _MSC_VER >= 1915
63#define GMOCK_MAYBE_5046_ 5046
64#else
65#define GMOCK_MAYBE_5046_
66#endif
67
68GTEST_DISABLE_MSC_WARNINGS_PUSH_(
69 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by
70 clients of class B */
71 /* Symbol involving type with internal linkage not defined */)
72
73namespace testing {
74
75// To implement a matcher Foo for type T, define:
76// 1. a class FooMatcherImpl that implements the
77// MatcherInterface<T> interface, and
78// 2. a factory function that creates a Matcher<T> object from a
79// FooMatcherImpl*.
80//
81// The two-level delegation design makes it possible to allow a user
82// to write "v" instead of "Eq(v)" where a Matcher is expected, which
83// is impossible if we pass matchers by pointers. It also eases
84// ownership management as Matcher objects can now be copied like
85// plain values.
86
87// A match result listener that stores the explanation in a string.
88class StringMatchResultListener : public MatchResultListener {
89 public:
90 StringMatchResultListener() : MatchResultListener(&ss_) {}
91
92 // Returns the explanation accumulated so far.
93 std::string str() const { return ss_.str(); }
94
95 // Clears the explanation accumulated so far.
96 void Clear() { ss_.str(""); }
97
98 private:
99 ::std::stringstream ss_;
100
101 GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);
102};
103
104// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
105// and MUST NOT BE USED IN USER CODE!!!
106namespace internal {
107
108// The MatcherCastImpl class template is a helper for implementing
109// MatcherCast(). We need this helper in order to partially
110// specialize the implementation of MatcherCast() (C++ allows
111// class/struct templates to be partially specialized, but not
112// function templates.).
113
114// This general version is used when MatcherCast()'s argument is a
115// polymorphic matcher (i.e. something that can be converted to a
116// Matcher but is not one yet; for example, Eq(value)) or a value (for
117// example, "hello").
118template <typename T, typename M>
119class MatcherCastImpl {
120 public:
121 static Matcher<T> Cast(const M& polymorphic_matcher_or_value) {
122 // M can be a polymorphic matcher, in which case we want to use
123 // its conversion operator to create Matcher<T>. Or it can be a value
124 // that should be passed to the Matcher<T>'s constructor.
125 //
126 // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
127 // polymorphic matcher because it'll be ambiguous if T has an implicit
128 // constructor from M (this usually happens when T has an implicit
129 // constructor from any type).
130 //
131 // It won't work to unconditionally implict_cast
132 // polymorphic_matcher_or_value to Matcher<T> because it won't trigger
133 // a user-defined conversion from M to T if one exists (assuming M is
134 // a value).
135 return CastImpl(polymorphic_matcher_or_value,
136 std::is_convertible<M, Matcher<T>>{},
137 std::is_convertible<M, T>{});
138 }
139
140 private:
141 template <bool Ignore>
142 static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,
143 std::true_type /* convertible_to_matcher */,
144 bool_constant<Ignore>) {
145 // M is implicitly convertible to Matcher<T>, which means that either
146 // M is a polymorphic matcher or Matcher<T> has an implicit constructor
147 // from M. In both cases using the implicit conversion will produce a
148 // matcher.
149 //
150 // Even if T has an implicit constructor from M, it won't be called because
151 // creating Matcher<T> would require a chain of two user-defined conversions
152 // (first to create T from M and then to create Matcher<T> from T).
153 return polymorphic_matcher_or_value;
154 }
155
156 // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
157 // matcher. It's a value of a type implicitly convertible to T. Use direct
158 // initialization to create a matcher.
159 static Matcher<T> CastImpl(const M& value,
160 std::false_type /* convertible_to_matcher */,
161 std::true_type /* convertible_to_T */) {
162 return Matcher<T>(ImplicitCast_<T>(value));
163 }
164
165 // M can't be implicitly converted to either Matcher<T> or T. Attempt to use
166 // polymorphic matcher Eq(value) in this case.
167 //
168 // Note that we first attempt to perform an implicit cast on the value and
169 // only fall back to the polymorphic Eq() matcher afterwards because the
170 // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end
171 // which might be undefined even when Rhs is implicitly convertible to Lhs
172 // (e.g. std::pair<const int, int> vs. std::pair<int, int>).
173 //
174 // We don't define this method inline as we need the declaration of Eq().
175 static Matcher<T> CastImpl(const M& value,
176 std::false_type /* convertible_to_matcher */,
177 std::false_type /* convertible_to_T */);
178};
179
180// This more specialized version is used when MatcherCast()'s argument
181// is already a Matcher. This only compiles when type T can be
182// statically converted to type U.
183template <typename T, typename U>
184class MatcherCastImpl<T, Matcher<U> > {
185 public:
186 static Matcher<T> Cast(const Matcher<U>& source_matcher) {
187 return Matcher<T>(new Impl(source_matcher));
188 }
189
190 private:
191 class Impl : public MatcherInterface<T> {
192 public:
193 explicit Impl(const Matcher<U>& source_matcher)
194 : source_matcher_(source_matcher) {}
195
196 // We delegate the matching logic to the source matcher.
197 bool MatchAndExplain(T x, MatchResultListener* listener) const override {
198 using FromType = typename std::remove_cv<typename std::remove_pointer<
199 typename std::remove_reference<T>::type>::type>::type;
200 using ToType = typename std::remove_cv<typename std::remove_pointer<
201 typename std::remove_reference<U>::type>::type>::type;
202 // Do not allow implicitly converting base*/& to derived*/&.
203 static_assert(
204 // Do not trigger if only one of them is a pointer. That implies a
205 // regular conversion and not a down_cast.
206 (std::is_pointer<typename std::remove_reference<T>::type>::value !=
207 std::is_pointer<typename std::remove_reference<U>::type>::value) ||
208 std::is_same<FromType, ToType>::value ||
209 !std::is_base_of<FromType, ToType>::value,
210 "Can't implicitly convert from <base> to <derived>");
211
212 return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
213 }
214
215 void DescribeTo(::std::ostream* os) const override {
216 source_matcher_.DescribeTo(os);
217 }
218
219 void DescribeNegationTo(::std::ostream* os) const override {
220 source_matcher_.DescribeNegationTo(os);
221 }
222
223 private:
224 const Matcher<U> source_matcher_;
225
226 GTEST_DISALLOW_ASSIGN_(Impl);
227 };
228};
229
230// This even more specialized version is used for efficiently casting
231// a matcher to its own type.
232template <typename T>
233class MatcherCastImpl<T, Matcher<T> > {
234 public:
235 static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
236};
237
238} // namespace internal
239
240// In order to be safe and clear, casting between different matcher
241// types is done explicitly via MatcherCast<T>(m), which takes a
242// matcher m and returns a Matcher<T>. It compiles only when T can be
243// statically converted to the argument type of m.
244template <typename T, typename M>
245inline Matcher<T> MatcherCast(const M& matcher) {
246 return internal::MatcherCastImpl<T, M>::Cast(matcher);
247}
248
249// Implements SafeMatcherCast().
250//
251// FIXME: The intermediate SafeMatcherCastImpl class was introduced as a
252// workaround for a compiler bug, and can now be removed.
253template <typename T>
254class SafeMatcherCastImpl {
255 public:
256 // This overload handles polymorphic matchers and values only since
257 // monomorphic matchers are handled by the next one.
258 template <typename M>
259 static inline Matcher<T> Cast(const M& polymorphic_matcher_or_value) {
260 return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);
261 }
262
263 // This overload handles monomorphic matchers.
264 //
265 // In general, if type T can be implicitly converted to type U, we can
266 // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
267 // contravariant): just keep a copy of the original Matcher<U>, convert the
268 // argument from type T to U, and then pass it to the underlying Matcher<U>.
269 // The only exception is when U is a reference and T is not, as the
270 // underlying Matcher<U> may be interested in the argument's address, which
271 // is not preserved in the conversion from T to U.
272 template <typename U>
273 static inline Matcher<T> Cast(const Matcher<U>& matcher) {
274 // Enforce that T can be implicitly converted to U.
275 GTEST_COMPILE_ASSERT_((std::is_convertible<T, U>::value),
276 "T must be implicitly convertible to U");
277 // Enforce that we are not converting a non-reference type T to a reference
278 // type U.
279 GTEST_COMPILE_ASSERT_(
280 std::is_reference<T>::value || !std::is_reference<U>::value,
281 cannot_convert_non_reference_arg_to_reference);
282 // In case both T and U are arithmetic types, enforce that the
283 // conversion is not lossy.
284 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;
285 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;
286 const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;
287 const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;
288 GTEST_COMPILE_ASSERT_(
289 kTIsOther || kUIsOther ||
290 (internal::LosslessArithmeticConvertible<RawT, RawU>::value),
291 conversion_of_arithmetic_types_must_be_lossless);
292 return MatcherCast<T>(matcher);
293 }
294};
295
296template <typename T, typename M>
297inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) {
298 return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);
299}
300
301// A<T>() returns a matcher that matches any value of type T.
302template <typename T>
303Matcher<T> A();
304
305// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
306// and MUST NOT BE USED IN USER CODE!!!
307namespace internal {
308
309// If the explanation is not empty, prints it to the ostream.
310inline void PrintIfNotEmpty(const std::string& explanation,
311 ::std::ostream* os) {
312 if (explanation != "" && os != nullptr) {
313 *os << ", " << explanation;
314 }
315}
316
317// Returns true if the given type name is easy to read by a human.
318// This is used to decide whether printing the type of a value might
319// be helpful.
320inline bool IsReadableTypeName(const std::string& type_name) {
321 // We consider a type name readable if it's short or doesn't contain
322 // a template or function type.
323 return (type_name.length() <= 20 ||
324 type_name.find_first_of("<(") == std::string::npos);
325}
326
327// Matches the value against the given matcher, prints the value and explains
328// the match result to the listener. Returns the match result.
329// 'listener' must not be NULL.
330// Value cannot be passed by const reference, because some matchers take a
331// non-const argument.
332template <typename Value, typename T>
333bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
334 MatchResultListener* listener) {
335 if (!listener->IsInterested()) {
336 // If the listener is not interested, we do not need to construct the
337 // inner explanation.
338 return matcher.Matches(value);
339 }
340
341 StringMatchResultListener inner_listener;
342 const bool match = matcher.MatchAndExplain(value, &inner_listener);
343
344 UniversalPrint(value, listener->stream());
345#if GTEST_HAS_RTTI
346 const std::string& type_name = GetTypeName<Value>();
347 if (IsReadableTypeName(type_name))
348 *listener->stream() << " (of type " << type_name << ")";
349#endif
350 PrintIfNotEmpty(inner_listener.str(), listener->stream());
351
352 return match;
353}
354
355// An internal helper class for doing compile-time loop on a tuple's
356// fields.
357template <size_t N>
358class TuplePrefix {
359 public:
360 // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
361 // if and only if the first N fields of matcher_tuple matches
362 // the first N fields of value_tuple, respectively.
363 template <typename MatcherTuple, typename ValueTuple>
364 static bool Matches(const MatcherTuple& matcher_tuple,
365 const ValueTuple& value_tuple) {
366 return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) &&
367 std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple));
368 }
369
370 // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
371 // describes failures in matching the first N fields of matchers
372 // against the first N fields of values. If there is no failure,
373 // nothing will be streamed to os.
374 template <typename MatcherTuple, typename ValueTuple>
375 static void ExplainMatchFailuresTo(const MatcherTuple& matchers,
376 const ValueTuple& values,
377 ::std::ostream* os) {
378 // First, describes failures in the first N - 1 fields.
379 TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);
380
381 // Then describes the failure (if any) in the (N - 1)-th (0-based)
382 // field.
383 typename std::tuple_element<N - 1, MatcherTuple>::type matcher =
384 std::get<N - 1>(matchers);
385 typedef typename std::tuple_element<N - 1, ValueTuple>::type Value;
386 const Value& value = std::get<N - 1>(values);
387 StringMatchResultListener listener;
388 if (!matcher.MatchAndExplain(value, &listener)) {
389 *os << " Expected arg #" << N - 1 << ": ";
390 std::get<N - 1>(matchers).DescribeTo(os);
391 *os << "\n Actual: ";
392 // We remove the reference in type Value to prevent the
393 // universal printer from printing the address of value, which
394 // isn't interesting to the user most of the time. The
395 // matcher's MatchAndExplain() method handles the case when
396 // the address is interesting.
397 internal::UniversalPrint(value, os);
398 PrintIfNotEmpty(listener.str(), os);
399 *os << "\n";
400 }
401 }
402};
403
404// The base case.
405template <>
406class TuplePrefix<0> {
407 public:
408 template <typename MatcherTuple, typename ValueTuple>
409 static bool Matches(const MatcherTuple& /* matcher_tuple */,
410 const ValueTuple& /* value_tuple */) {
411 return true;
412 }
413
414 template <typename MatcherTuple, typename ValueTuple>
415 static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,
416 const ValueTuple& /* values */,
417 ::std::ostream* /* os */) {}
418};
419
420// TupleMatches(matcher_tuple, value_tuple) returns true if and only if
421// all matchers in matcher_tuple match the corresponding fields in
422// value_tuple. It is a compiler error if matcher_tuple and
423// value_tuple have different number of fields or incompatible field
424// types.
425template <typename MatcherTuple, typename ValueTuple>
426bool TupleMatches(const MatcherTuple& matcher_tuple,
427 const ValueTuple& value_tuple) {
428 // Makes sure that matcher_tuple and value_tuple have the same
429 // number of fields.
430 GTEST_COMPILE_ASSERT_(std::tuple_size<MatcherTuple>::value ==
431 std::tuple_size<ValueTuple>::value,
432 matcher_and_value_have_different_numbers_of_fields);
433 return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple,
434 value_tuple);
435}
436
437// Describes failures in matching matchers against values. If there
438// is no failure, nothing will be streamed to os.
439template <typename MatcherTuple, typename ValueTuple>
440void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
441 const ValueTuple& values,
442 ::std::ostream* os) {
443 TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(
444 matchers, values, os);
445}
446
447// TransformTupleValues and its helper.
448//
449// TransformTupleValuesHelper hides the internal machinery that
450// TransformTupleValues uses to implement a tuple traversal.
451template <typename Tuple, typename Func, typename OutIter>
452class TransformTupleValuesHelper {
453 private:
454 typedef ::std::tuple_size<Tuple> TupleSize;
455
456 public:
457 // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
458 // Returns the final value of 'out' in case the caller needs it.
459 static OutIter Run(Func f, const Tuple& t, OutIter out) {
460 return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);
461 }
462
463 private:
464 template <typename Tup, size_t kRemainingSize>
465 struct IterateOverTuple {
466 OutIter operator() (Func f, const Tup& t, OutIter out) const {
467 *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t));
468 return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);
469 }
470 };
471 template <typename Tup>
472 struct IterateOverTuple<Tup, 0> {
473 OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const {
474 return out;
475 }
476 };
477};
478
479// Successively invokes 'f(element)' on each element of the tuple 't',
480// appending each result to the 'out' iterator. Returns the final value
481// of 'out'.
482template <typename Tuple, typename Func, typename OutIter>
483OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {
484 return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);
485}
486
487// Implements A<T>().
488template <typename T>
489class AnyMatcherImpl : public MatcherInterface<const T&> {
490 public:
491 bool MatchAndExplain(const T& /* x */,
492 MatchResultListener* /* listener */) const override {
493 return true;
494 }
495 void DescribeTo(::std::ostream* os) const override { *os << "is anything"; }
496 void DescribeNegationTo(::std::ostream* os) const override {
497 // This is mostly for completeness' safe, as it's not very useful
498 // to write Not(A<bool>()). However we cannot completely rule out
499 // such a possibility, and it doesn't hurt to be prepared.
500 *os << "never matches";
501 }
502};
503
504// Implements _, a matcher that matches any value of any
505// type. This is a polymorphic matcher, so we need a template type
506// conversion operator to make it appearing as a Matcher<T> for any
507// type T.
508class AnythingMatcher {
509 public:
510 template <typename T>
511 operator Matcher<T>() const { return A<T>(); }
512};
513
514// Implements the polymorphic IsNull() matcher, which matches any raw or smart
515// pointer that is NULL.
516class IsNullMatcher {
517 public:
518 template <typename Pointer>
519 bool MatchAndExplain(const Pointer& p,
520 MatchResultListener* /* listener */) const {
521 return p == nullptr;
522 }
523
524 void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
525 void DescribeNegationTo(::std::ostream* os) const {
526 *os << "isn't NULL";
527 }
528};
529
530// Implements the polymorphic NotNull() matcher, which matches any raw or smart
531// pointer that is not NULL.
532class NotNullMatcher {
533 public:
534 template <typename Pointer>
535 bool MatchAndExplain(const Pointer& p,
536 MatchResultListener* /* listener */) const {
537 return p != nullptr;
538 }
539
540 void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }
541 void DescribeNegationTo(::std::ostream* os) const {
542 *os << "is NULL";
543 }
544};
545
546// Ref(variable) matches any argument that is a reference to
547// 'variable'. This matcher is polymorphic as it can match any
548// super type of the type of 'variable'.
549//
550// The RefMatcher template class implements Ref(variable). It can
551// only be instantiated with a reference type. This prevents a user
552// from mistakenly using Ref(x) to match a non-reference function
553// argument. For example, the following will righteously cause a
554// compiler error:
555//
556// int n;
557// Matcher<int> m1 = Ref(n); // This won't compile.
558// Matcher<int&> m2 = Ref(n); // This will compile.
559template <typename T>
560class RefMatcher;
561
562template <typename T>
563class RefMatcher<T&> {
564 // Google Mock is a generic framework and thus needs to support
565 // mocking any function types, including those that take non-const
566 // reference arguments. Therefore the template parameter T (and
567 // Super below) can be instantiated to either a const type or a
568 // non-const type.
569 public:
570 // RefMatcher() takes a T& instead of const T&, as we want the
571 // compiler to catch using Ref(const_value) as a matcher for a
572 // non-const reference.
573 explicit RefMatcher(T& x) : object_(x) {} // NOLINT
574
575 template <typename Super>
576 operator Matcher<Super&>() const {
577 // By passing object_ (type T&) to Impl(), which expects a Super&,
578 // we make sure that Super is a super type of T. In particular,
579 // this catches using Ref(const_value) as a matcher for a
580 // non-const reference, as you cannot implicitly convert a const
581 // reference to a non-const reference.
582 return MakeMatcher(new Impl<Super>(object_));
583 }
584
585 private:
586 template <typename Super>
587 class Impl : public MatcherInterface<Super&> {
588 public:
589 explicit Impl(Super& x) : object_(x) {} // NOLINT
590
591 // MatchAndExplain() takes a Super& (as opposed to const Super&)
592 // in order to match the interface MatcherInterface<Super&>.
593 bool MatchAndExplain(Super& x,
594 MatchResultListener* listener) const override {
595 *listener << "which is located @" << static_cast<const void*>(&x);
596 return &x == &object_;
597 }
598
599 void DescribeTo(::std::ostream* os) const override {
600 *os << "references the variable ";
601 UniversalPrinter<Super&>::Print(object_, os);
602 }
603
604 void DescribeNegationTo(::std::ostream* os) const override {
605 *os << "does not reference the variable ";
606 UniversalPrinter<Super&>::Print(object_, os);
607 }
608
609 private:
610 const Super& object_;
611
612 GTEST_DISALLOW_ASSIGN_(Impl);
613 };
614
615 T& object_;
616
617 GTEST_DISALLOW_ASSIGN_(RefMatcher);
618};
619
620// Polymorphic helper functions for narrow and wide string matchers.
621inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
622 return String::CaseInsensitiveCStringEquals(lhs, rhs);
623}
624
625inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,
626 const wchar_t* rhs) {
627 return String::CaseInsensitiveWideCStringEquals(lhs, rhs);
628}
629
630// String comparison for narrow or wide strings that can have embedded NUL
631// characters.
632template <typename StringType>
633bool CaseInsensitiveStringEquals(const StringType& s1,
634 const StringType& s2) {
635 // Are the heads equal?
636 if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {
637 return false;
638 }
639
640 // Skip the equal heads.
641 const typename StringType::value_type nul = 0;
642 const size_t i1 = s1.find(nul), i2 = s2.find(nul);
643
644 // Are we at the end of either s1 or s2?
645 if (i1 == StringType::npos || i2 == StringType::npos) {
646 return i1 == i2;
647 }
648
649 // Are the tails equal?
650 return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));
651}
652
653// String matchers.
654
655// Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
656template <typename StringType>
657class StrEqualityMatcher {
658 public:
659 StrEqualityMatcher(const StringType& str, bool expect_eq,
660 bool case_sensitive)
661 : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {}
662
663#if GTEST_HAS_ABSL
664 bool MatchAndExplain(const absl::string_view& s,
665 MatchResultListener* listener) const {
666 // This should fail to compile if absl::string_view is used with wide
667 // strings.
668 const StringType& str = std::string(s);
669 return MatchAndExplain(str, listener);
670 }
671#endif // GTEST_HAS_ABSL
672
673 // Accepts pointer types, particularly:
674 // const char*
675 // char*
676 // const wchar_t*
677 // wchar_t*
678 template <typename CharType>
679 bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
680 if (s == nullptr) {
681 return !expect_eq_;
682 }
683 return MatchAndExplain(StringType(s), listener);
684 }
685
686 // Matches anything that can convert to StringType.
687 //
688 // This is a template, not just a plain function with const StringType&,
689 // because absl::string_view has some interfering non-explicit constructors.
690 template <typename MatcheeStringType>
691 bool MatchAndExplain(const MatcheeStringType& s,
692 MatchResultListener* /* listener */) const {
693 const StringType& s2(s);
694 const bool eq = case_sensitive_ ? s2 == string_ :
695 CaseInsensitiveStringEquals(s2, string_);
696 return expect_eq_ == eq;
697 }
698
699 void DescribeTo(::std::ostream* os) const {
700 DescribeToHelper(expect_eq_, os);
701 }
702
703 void DescribeNegationTo(::std::ostream* os) const {
704 DescribeToHelper(!expect_eq_, os);
705 }
706
707 private:
708 void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {
709 *os << (expect_eq ? "is " : "isn't ");
710 *os << "equal to ";
711 if (!case_sensitive_) {
712 *os << "(ignoring case) ";
713 }
714 UniversalPrint(string_, os);
715 }
716
717 const StringType string_;
718 const bool expect_eq_;
719 const bool case_sensitive_;
720
721 GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);
722};
723
724// Implements the polymorphic HasSubstr(substring) matcher, which
725// can be used as a Matcher<T> as long as T can be converted to a
726// string.
727template <typename StringType>
728class HasSubstrMatcher {
729 public:
730 explicit HasSubstrMatcher(const StringType& substring)
731 : substring_(substring) {}
732
733#if GTEST_HAS_ABSL
734 bool MatchAndExplain(const absl::string_view& s,
735 MatchResultListener* listener) const {
736 // This should fail to compile if absl::string_view is used with wide
737 // strings.
738 const StringType& str = std::string(s);
739 return MatchAndExplain(str, listener);
740 }
741#endif // GTEST_HAS_ABSL
742
743 // Accepts pointer types, particularly:
744 // const char*
745 // char*
746 // const wchar_t*
747 // wchar_t*
748 template <typename CharType>
749 bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
750 return s != nullptr && MatchAndExplain(StringType(s), listener);
751 }
752
753 // Matches anything that can convert to StringType.
754 //
755 // This is a template, not just a plain function with const StringType&,
756 // because absl::string_view has some interfering non-explicit constructors.
757 template <typename MatcheeStringType>
758 bool MatchAndExplain(const MatcheeStringType& s,
759 MatchResultListener* /* listener */) const {
760 const StringType& s2(s);
761 return s2.find(substring_) != StringType::npos;
762 }
763
764 // Describes what this matcher matches.
765 void DescribeTo(::std::ostream* os) const {
766 *os << "has substring ";
767 UniversalPrint(substring_, os);
768 }
769
770 void DescribeNegationTo(::std::ostream* os) const {
771 *os << "has no substring ";
772 UniversalPrint(substring_, os);
773 }
774
775 private:
776 const StringType substring_;
777
778 GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);
779};
780
781// Implements the polymorphic StartsWith(substring) matcher, which
782// can be used as a Matcher<T> as long as T can be converted to a
783// string.
784template <typename StringType>
785class StartsWithMatcher {
786 public:
787 explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {
788 }
789
790#if GTEST_HAS_ABSL
791 bool MatchAndExplain(const absl::string_view& s,
792 MatchResultListener* listener) const {
793 // This should fail to compile if absl::string_view is used with wide
794 // strings.
795 const StringType& str = std::string(s);
796 return MatchAndExplain(str, listener);
797 }
798#endif // GTEST_HAS_ABSL
799
800 // Accepts pointer types, particularly:
801 // const char*
802 // char*
803 // const wchar_t*
804 // wchar_t*
805 template <typename CharType>
806 bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
807 return s != nullptr && MatchAndExplain(StringType(s), listener);
808 }
809
810 // Matches anything that can convert to StringType.
811 //
812 // This is a template, not just a plain function with const StringType&,
813 // because absl::string_view has some interfering non-explicit constructors.
814 template <typename MatcheeStringType>
815 bool MatchAndExplain(const MatcheeStringType& s,
816 MatchResultListener* /* listener */) const {
817 const StringType& s2(s);
818 return s2.length() >= prefix_.length() &&
819 s2.substr(0, prefix_.length()) == prefix_;
820 }
821
822 void DescribeTo(::std::ostream* os) const {
823 *os << "starts with ";
824 UniversalPrint(prefix_, os);
825 }
826
827 void DescribeNegationTo(::std::ostream* os) const {
828 *os << "doesn't start with ";
829 UniversalPrint(prefix_, os);
830 }
831
832 private:
833 const StringType prefix_;
834
835 GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);
836};
837
838// Implements the polymorphic EndsWith(substring) matcher, which
839// can be used as a Matcher<T> as long as T can be converted to a
840// string.
841template <typename StringType>
842class EndsWithMatcher {
843 public:
844 explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}
845
846#if GTEST_HAS_ABSL
847 bool MatchAndExplain(const absl::string_view& s,
848 MatchResultListener* listener) const {
849 // This should fail to compile if absl::string_view is used with wide
850 // strings.
851 const StringType& str = std::string(s);
852 return MatchAndExplain(str, listener);
853 }
854#endif // GTEST_HAS_ABSL
855
856 // Accepts pointer types, particularly:
857 // const char*
858 // char*
859 // const wchar_t*
860 // wchar_t*
861 template <typename CharType>
862 bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
863 return s != nullptr && MatchAndExplain(StringType(s), listener);
864 }
865
866 // Matches anything that can convert to StringType.
867 //
868 // This is a template, not just a plain function with const StringType&,
869 // because absl::string_view has some interfering non-explicit constructors.
870 template <typename MatcheeStringType>
871 bool MatchAndExplain(const MatcheeStringType& s,
872 MatchResultListener* /* listener */) const {
873 const StringType& s2(s);
874 return s2.length() >= suffix_.length() &&
875 s2.substr(s2.length() - suffix_.length()) == suffix_;
876 }
877
878 void DescribeTo(::std::ostream* os) const {
879 *os << "ends with ";
880 UniversalPrint(suffix_, os);
881 }
882
883 void DescribeNegationTo(::std::ostream* os) const {
884 *os << "doesn't end with ";
885 UniversalPrint(suffix_, os);
886 }
887
888 private:
889 const StringType suffix_;
890
891 GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);
892};
893
894// Implements a matcher that compares the two fields of a 2-tuple
895// using one of the ==, <=, <, etc, operators. The two fields being
896// compared don't have to have the same type.
897//
898// The matcher defined here is polymorphic (for example, Eq() can be
899// used to match a std::tuple<int, short>, a std::tuple<const long&, double>,
900// etc). Therefore we use a template type conversion operator in the
901// implementation.
902template <typename D, typename Op>
903class PairMatchBase {
904 public:
905 template <typename T1, typename T2>
906 operator Matcher<::std::tuple<T1, T2>>() const {
907 return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>);
908 }
909 template <typename T1, typename T2>
910 operator Matcher<const ::std::tuple<T1, T2>&>() const {
911 return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>);
912 }
913
914 private:
915 static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT
916 return os << D::Desc();
917 }
918
919 template <typename Tuple>
920 class Impl : public MatcherInterface<Tuple> {
921 public:
922 bool MatchAndExplain(Tuple args,
923 MatchResultListener* /* listener */) const override {
924 return Op()(::std::get<0>(args), ::std::get<1>(args));
925 }
926 void DescribeTo(::std::ostream* os) const override {
927 *os << "are " << GetDesc;
928 }
929 void DescribeNegationTo(::std::ostream* os) const override {
930 *os << "aren't " << GetDesc;
931 }
932 };
933};
934
935class Eq2Matcher : public PairMatchBase<Eq2Matcher, AnyEq> {
936 public:
937 static const char* Desc() { return "an equal pair"; }
938};
939class Ne2Matcher : public PairMatchBase<Ne2Matcher, AnyNe> {
940 public:
941 static const char* Desc() { return "an unequal pair"; }
942};
943class Lt2Matcher : public PairMatchBase<Lt2Matcher, AnyLt> {
944 public:
945 static const char* Desc() { return "a pair where the first < the second"; }
946};
947class Gt2Matcher : public PairMatchBase<Gt2Matcher, AnyGt> {
948 public:
949 static const char* Desc() { return "a pair where the first > the second"; }
950};
951class Le2Matcher : public PairMatchBase<Le2Matcher, AnyLe> {
952 public:
953 static const char* Desc() { return "a pair where the first <= the second"; }
954};
955class Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {
956 public:
957 static const char* Desc() { return "a pair where the first >= the second"; }
958};
959
960// Implements the Not(...) matcher for a particular argument type T.
961// We do not nest it inside the NotMatcher class template, as that
962// will prevent different instantiations of NotMatcher from sharing
963// the same NotMatcherImpl<T> class.
964template <typename T>
965class NotMatcherImpl : public MatcherInterface<const T&> {
966 public:
967 explicit NotMatcherImpl(const Matcher<T>& matcher)
968 : matcher_(matcher) {}
969
970 bool MatchAndExplain(const T& x,
971 MatchResultListener* listener) const override {
972 return !matcher_.MatchAndExplain(x, listener);
973 }
974
975 void DescribeTo(::std::ostream* os) const override {
976 matcher_.DescribeNegationTo(os);
977 }
978
979 void DescribeNegationTo(::std::ostream* os) const override {
980 matcher_.DescribeTo(os);
981 }
982
983 private:
984 const Matcher<T> matcher_;
985
986 GTEST_DISALLOW_ASSIGN_(NotMatcherImpl);
987};
988
989// Implements the Not(m) matcher, which matches a value that doesn't
990// match matcher m.
991template <typename InnerMatcher>
992class NotMatcher {
993 public:
994 explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}
995
996 // This template type conversion operator allows Not(m) to be used
997 // to match any type m can match.
998 template <typename T>
999 operator Matcher<T>() const {
1000 return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));
1001 }
1002
1003 private:
1004 InnerMatcher matcher_;
1005
1006 GTEST_DISALLOW_ASSIGN_(NotMatcher);
1007};
1008
1009// Implements the AllOf(m1, m2) matcher for a particular argument type
1010// T. We do not nest it inside the BothOfMatcher class template, as
1011// that will prevent different instantiations of BothOfMatcher from
1012// sharing the same BothOfMatcherImpl<T> class.
1013template <typename T>
1014class AllOfMatcherImpl : public MatcherInterface<const T&> {
1015 public:
1016 explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)
1017 : matchers_(std::move(matchers)) {}
1018
1019 void DescribeTo(::std::ostream* os) const override {
1020 *os << "(";
1021 for (size_t i = 0; i < matchers_.size(); ++i) {
1022 if (i != 0) *os << ") and (";
1023 matchers_[i].DescribeTo(os);
1024 }
1025 *os << ")";
1026 }
1027
1028 void DescribeNegationTo(::std::ostream* os) const override {
1029 *os << "(";
1030 for (size_t i = 0; i < matchers_.size(); ++i) {
1031 if (i != 0) *os << ") or (";
1032 matchers_[i].DescribeNegationTo(os);
1033 }
1034 *os << ")";
1035 }
1036
1037 bool MatchAndExplain(const T& x,
1038 MatchResultListener* listener) const override {
1039 // If either matcher1_ or matcher2_ doesn't match x, we only need
1040 // to explain why one of them fails.
1041 std::string all_match_result;
1042
1043 for (size_t i = 0; i < matchers_.size(); ++i) {
1044 StringMatchResultListener slistener;
1045 if (matchers_[i].MatchAndExplain(x, &slistener)) {
1046 if (all_match_result.empty()) {
1047 all_match_result = slistener.str();
1048 } else {
1049 std::string result = slistener.str();
1050 if (!result.empty()) {
1051 all_match_result += ", and ";
1052 all_match_result += result;
1053 }
1054 }
1055 } else {
1056 *listener << slistener.str();
1057 return false;
1058 }
1059 }
1060
1061 // Otherwise we need to explain why *both* of them match.
1062 *listener << all_match_result;
1063 return true;
1064 }
1065
1066 private:
1067 const std::vector<Matcher<T> > matchers_;
1068
1069 GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl);
1070};
1071
1072// VariadicMatcher is used for the variadic implementation of
1073// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
1074// CombiningMatcher<T> is used to recursively combine the provided matchers
1075// (of type Args...).
1076template <template <typename T> class CombiningMatcher, typename... Args>
1077class VariadicMatcher {
1078 public:
1079 VariadicMatcher(const Args&... matchers) // NOLINT
1080 : matchers_(matchers...) {
1081 static_assert(sizeof...(Args) > 0, "Must have at least one matcher.");
1082 }
1083
1084 // This template type conversion operator allows an
1085 // VariadicMatcher<Matcher1, Matcher2...> object to match any type that
1086 // all of the provided matchers (Matcher1, Matcher2, ...) can match.
1087 template <typename T>
1088 operator Matcher<T>() const {
1089 std::vector<Matcher<T> > values;
1090 CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());
1091 return Matcher<T>(new CombiningMatcher<T>(std::move(values)));
1092 }
1093
1094 private:
1095 template <typename T, size_t I>
1096 void CreateVariadicMatcher(std::vector<Matcher<T> >* values,
1097 std::integral_constant<size_t, I>) const {
1098 values->push_back(SafeMatcherCast<T>(std::get<I>(matchers_)));
1099 CreateVariadicMatcher<T>(values, std::integral_constant<size_t, I + 1>());
1100 }
1101
1102 template <typename T>
1103 void CreateVariadicMatcher(
1104 std::vector<Matcher<T> >*,
1105 std::integral_constant<size_t, sizeof...(Args)>) const {}
1106
1107 std::tuple<Args...> matchers_;
1108
1109 GTEST_DISALLOW_ASSIGN_(VariadicMatcher);
1110};
1111
1112template <typename... Args>
1113using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;
1114
1115// Implements the AnyOf(m1, m2) matcher for a particular argument type
1116// T. We do not nest it inside the AnyOfMatcher class template, as
1117// that will prevent different instantiations of AnyOfMatcher from
1118// sharing the same EitherOfMatcherImpl<T> class.
1119template <typename T>
1120class AnyOfMatcherImpl : public MatcherInterface<const T&> {
1121 public:
1122 explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)
1123 : matchers_(std::move(matchers)) {}
1124
1125 void DescribeTo(::std::ostream* os) const override {
1126 *os << "(";
1127 for (size_t i = 0; i < matchers_.size(); ++i) {
1128 if (i != 0) *os << ") or (";
1129 matchers_[i].DescribeTo(os);
1130 }
1131 *os << ")";
1132 }
1133
1134 void DescribeNegationTo(::std::ostream* os) const override {
1135 *os << "(";
1136 for (size_t i = 0; i < matchers_.size(); ++i) {
1137 if (i != 0) *os << ") and (";
1138 matchers_[i].DescribeNegationTo(os);
1139 }
1140 *os << ")";
1141 }
1142
1143 bool MatchAndExplain(const T& x,
1144 MatchResultListener* listener) const override {
1145 std::string no_match_result;
1146
1147 // If either matcher1_ or matcher2_ matches x, we just need to
1148 // explain why *one* of them matches.
1149 for (size_t i = 0; i < matchers_.size(); ++i) {
1150 StringMatchResultListener slistener;
1151 if (matchers_[i].MatchAndExplain(x, &slistener)) {
1152 *listener << slistener.str();
1153 return true;
1154 } else {
1155 if (no_match_result.empty()) {
1156 no_match_result = slistener.str();
1157 } else {
1158 std::string result = slistener.str();
1159 if (!result.empty()) {
1160 no_match_result += ", and ";
1161 no_match_result += result;
1162 }
1163 }
1164 }
1165 }
1166
1167 // Otherwise we need to explain why *both* of them fail.
1168 *listener << no_match_result;
1169 return false;
1170 }
1171
1172 private:
1173 const std::vector<Matcher<T> > matchers_;
1174
1175 GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl);
1176};
1177
1178// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
1179template <typename... Args>
1180using AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;
1181
1182// Wrapper for implementation of Any/AllOfArray().
1183template <template <class> class MatcherImpl, typename T>
1184class SomeOfArrayMatcher {
1185 public:
1186 // Constructs the matcher from a sequence of element values or
1187 // element matchers.
1188 template <typename Iter>
1189 SomeOfArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
1190
1191 template <typename U>
1192 operator Matcher<U>() const { // NOLINT
1193 using RawU = typename std::decay<U>::type;
1194 std::vector<Matcher<RawU>> matchers;
1195 for (const auto& matcher : matchers_) {
1196 matchers.push_back(MatcherCast<RawU>(matcher));
1197 }
1198 return Matcher<U>(new MatcherImpl<RawU>(std::move(matchers)));
1199 }
1200
1201 private:
1202 const ::std::vector<T> matchers_;
1203
1204 GTEST_DISALLOW_ASSIGN_(SomeOfArrayMatcher);
1205};
1206
1207template <typename T>
1208using AllOfArrayMatcher = SomeOfArrayMatcher<AllOfMatcherImpl, T>;
1209
1210template <typename T>
1211using AnyOfArrayMatcher = SomeOfArrayMatcher<AnyOfMatcherImpl, T>;
1212
1213// Used for implementing Truly(pred), which turns a predicate into a
1214// matcher.
1215template <typename Predicate>
1216class TrulyMatcher {
1217 public:
1218 explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}
1219
1220 // This method template allows Truly(pred) to be used as a matcher
1221 // for type T where T is the argument type of predicate 'pred'. The
1222 // argument is passed by reference as the predicate may be
1223 // interested in the address of the argument.
1224 template <typename T>
1225 bool MatchAndExplain(T& x, // NOLINT
1226 MatchResultListener* /* listener */) const {
1227 // Without the if-statement, MSVC sometimes warns about converting
1228 // a value to bool (warning 4800).
1229 //
1230 // We cannot write 'return !!predicate_(x);' as that doesn't work
1231 // when predicate_(x) returns a class convertible to bool but
1232 // having no operator!().
1233 if (predicate_(x))
1234 return true;
1235 return false;
1236 }
1237
1238 void DescribeTo(::std::ostream* os) const {
1239 *os << "satisfies the given predicate";
1240 }
1241
1242 void DescribeNegationTo(::std::ostream* os) const {
1243 *os << "doesn't satisfy the given predicate";
1244 }
1245
1246 private:
1247 Predicate predicate_;
1248
1249 GTEST_DISALLOW_ASSIGN_(TrulyMatcher);
1250};
1251
1252// Used for implementing Matches(matcher), which turns a matcher into
1253// a predicate.
1254template <typename M>
1255class MatcherAsPredicate {
1256 public:
1257 explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}
1258
1259 // This template operator() allows Matches(m) to be used as a
1260 // predicate on type T where m is a matcher on type T.
1261 //
1262 // The argument x is passed by reference instead of by value, as
1263 // some matcher may be interested in its address (e.g. as in
1264 // Matches(Ref(n))(x)).
1265 template <typename T>
1266 bool operator()(const T& x) const {
1267 // We let matcher_ commit to a particular type here instead of
1268 // when the MatcherAsPredicate object was constructed. This
1269 // allows us to write Matches(m) where m is a polymorphic matcher
1270 // (e.g. Eq(5)).
1271 //
1272 // If we write Matcher<T>(matcher_).Matches(x) here, it won't
1273 // compile when matcher_ has type Matcher<const T&>; if we write
1274 // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
1275 // when matcher_ has type Matcher<T>; if we just write
1276 // matcher_.Matches(x), it won't compile when matcher_ is
1277 // polymorphic, e.g. Eq(5).
1278 //
1279 // MatcherCast<const T&>() is necessary for making the code work
1280 // in all of the above situations.
1281 return MatcherCast<const T&>(matcher_).Matches(x);
1282 }
1283
1284 private:
1285 M matcher_;
1286
1287 GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate);
1288};
1289
1290// For implementing ASSERT_THAT() and EXPECT_THAT(). The template
1291// argument M must be a type that can be converted to a matcher.
1292template <typename M>
1293class PredicateFormatterFromMatcher {
1294 public:
1295 explicit PredicateFormatterFromMatcher(M m) : matcher_(std::move(m)) {}
1296
1297 // This template () operator allows a PredicateFormatterFromMatcher
1298 // object to act as a predicate-formatter suitable for using with
1299 // Google Test's EXPECT_PRED_FORMAT1() macro.
1300 template <typename T>
1301 AssertionResult operator()(const char* value_text, const T& x) const {
1302 // We convert matcher_ to a Matcher<const T&> *now* instead of
1303 // when the PredicateFormatterFromMatcher object was constructed,
1304 // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
1305 // know which type to instantiate it to until we actually see the
1306 // type of x here.
1307 //
1308 // We write SafeMatcherCast<const T&>(matcher_) instead of
1309 // Matcher<const T&>(matcher_), as the latter won't compile when
1310 // matcher_ has type Matcher<T> (e.g. An<int>()).
1311 // We don't write MatcherCast<const T&> either, as that allows
1312 // potentially unsafe downcasting of the matcher argument.
1313 const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
1314
1315 // The expected path here is that the matcher should match (i.e. that most
1316 // tests pass) so optimize for this case.
1317 if (matcher.Matches(x)) {
1318 return AssertionSuccess();
1319 }
1320
1321 ::std::stringstream ss;
1322 ss << "Value of: " << value_text << "\n"
1323 << "Expected: ";
1324 matcher.DescribeTo(&ss);
1325
1326 // Rerun the matcher to "PrintAndExain" the failure.
1327 StringMatchResultListener listener;
1328 if (MatchPrintAndExplain(x, matcher, &listener)) {
1329 ss << "\n The matcher failed on the initial attempt; but passed when "
1330 "rerun to generate the explanation.";
1331 }
1332 ss << "\n Actual: " << listener.str();
1333 return AssertionFailure() << ss.str();
1334 }
1335
1336 private:
1337 const M matcher_;
1338
1339 GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher);
1340};
1341
1342// A helper function for converting a matcher to a predicate-formatter
1343// without the user needing to explicitly write the type. This is
1344// used for implementing ASSERT_THAT() and EXPECT_THAT().
1345// Implementation detail: 'matcher' is received by-value to force decaying.
1346template <typename M>
1347inline PredicateFormatterFromMatcher<M>
1348MakePredicateFormatterFromMatcher(M matcher) {
1349 return PredicateFormatterFromMatcher<M>(std::move(matcher));
1350}
1351
1352// Implements the polymorphic floating point equality matcher, which matches
1353// two float values using ULP-based approximation or, optionally, a
1354// user-specified epsilon. The template is meant to be instantiated with
1355// FloatType being either float or double.
1356template <typename FloatType>
1357class FloatingEqMatcher {
1358 public:
1359 // Constructor for FloatingEqMatcher.
1360 // The matcher's input will be compared with expected. The matcher treats two
1361 // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards,
1362 // equality comparisons between NANs will always return false. We specify a
1363 // negative max_abs_error_ term to indicate that ULP-based approximation will
1364 // be used for comparison.
1365 FloatingEqMatcher(FloatType expected, bool nan_eq_nan) :
1366 expected_(expected), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {
1367 }
1368
1369 // Constructor that supports a user-specified max_abs_error that will be used
1370 // for comparison instead of ULP-based approximation. The max absolute
1371 // should be non-negative.
1372 FloatingEqMatcher(FloatType expected, bool nan_eq_nan,
1373 FloatType max_abs_error)
1374 : expected_(expected),
1375 nan_eq_nan_(nan_eq_nan),
1376 max_abs_error_(max_abs_error) {
1377 GTEST_CHECK_(max_abs_error >= 0)
1378 << ", where max_abs_error is" << max_abs_error;
1379 }
1380
1381 // Implements floating point equality matcher as a Matcher<T>.
1382 template <typename T>
1383 class Impl : public MatcherInterface<T> {
1384 public:
1385 Impl(FloatType expected, bool nan_eq_nan, FloatType max_abs_error)
1386 : expected_(expected),
1387 nan_eq_nan_(nan_eq_nan),
1388 max_abs_error_(max_abs_error) {}
1389
1390 bool MatchAndExplain(T value,
1391 MatchResultListener* listener) const override {
1392 const FloatingPoint<FloatType> actual(value), expected(expected_);
1393
1394 // Compares NaNs first, if nan_eq_nan_ is true.
1395 if (actual.is_nan() || expected.is_nan()) {
1396 if (actual.is_nan() && expected.is_nan()) {
1397 return nan_eq_nan_;
1398 }
1399 // One is nan; the other is not nan.
1400 return false;
1401 }
1402 if (HasMaxAbsError()) {
1403 // We perform an equality check so that inf will match inf, regardless
1404 // of error bounds. If the result of value - expected_ would result in
1405 // overflow or if either value is inf, the default result is infinity,
1406 // which should only match if max_abs_error_ is also infinity.
1407 if (value == expected_) {
1408 return true;
1409 }
1410
1411 const FloatType diff = value - expected_;
1412 if (fabs(diff) <= max_abs_error_) {
1413 return true;
1414 }
1415
1416 if (listener->IsInterested()) {
1417 *listener << "which is " << diff << " from " << expected_;
1418 }
1419 return false;
1420 } else {
1421 return actual.AlmostEquals(expected);
1422 }
1423 }
1424
1425 void DescribeTo(::std::ostream* os) const override {
1426 // os->precision() returns the previously set precision, which we
1427 // store to restore the ostream to its original configuration
1428 // after outputting.
1429 const ::std::streamsize old_precision = os->precision(
1430 ::std::numeric_limits<FloatType>::digits10 + 2);
1431 if (FloatingPoint<FloatType>(expected_).is_nan()) {
1432 if (nan_eq_nan_) {
1433 *os << "is NaN";
1434 } else {
1435 *os << "never matches";
1436 }
1437 } else {
1438 *os << "is approximately " << expected_;
1439 if (HasMaxAbsError()) {
1440 *os << " (absolute error <= " << max_abs_error_ << ")";
1441 }
1442 }
1443 os->precision(old_precision);
1444 }
1445
1446 void DescribeNegationTo(::std::ostream* os) const override {
1447 // As before, get original precision.
1448 const ::std::streamsize old_precision = os->precision(
1449 ::std::numeric_limits<FloatType>::digits10 + 2);
1450 if (FloatingPoint<FloatType>(expected_).is_nan()) {
1451 if (nan_eq_nan_) {
1452 *os << "isn't NaN";
1453 } else {
1454 *os << "is anything";
1455 }
1456 } else {
1457 *os << "isn't approximately " << expected_;
1458 if (HasMaxAbsError()) {
1459 *os << " (absolute error > " << max_abs_error_ << ")";
1460 }
1461 }
1462 // Restore original precision.
1463 os->precision(old_precision);
1464 }
1465
1466 private:
1467 bool HasMaxAbsError() const {
1468 return max_abs_error_ >= 0;
1469 }
1470
1471 const FloatType expected_;
1472 const bool nan_eq_nan_;
1473 // max_abs_error will be used for value comparison when >= 0.
1474 const FloatType max_abs_error_;
1475
1476 GTEST_DISALLOW_ASSIGN_(Impl);
1477 };
1478
1479 // The following 3 type conversion operators allow FloatEq(expected) and
1480 // NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a
1481 // Matcher<const float&>, or a Matcher<float&>, but nothing else.
1482 // (While Google's C++ coding style doesn't allow arguments passed
1483 // by non-const reference, we may see them in code not conforming to
1484 // the style. Therefore Google Mock needs to support them.)
1485 operator Matcher<FloatType>() const {
1486 return MakeMatcher(
1487 new Impl<FloatType>(expected_, nan_eq_nan_, max_abs_error_));
1488 }
1489
1490 operator Matcher<const FloatType&>() const {
1491 return MakeMatcher(
1492 new Impl<const FloatType&>(expected_, nan_eq_nan_, max_abs_error_));
1493 }
1494
1495 operator Matcher<FloatType&>() const {
1496 return MakeMatcher(
1497 new Impl<FloatType&>(expected_, nan_eq_nan_, max_abs_error_));
1498 }
1499
1500 private:
1501 const FloatType expected_;
1502 const bool nan_eq_nan_;
1503 // max_abs_error will be used for value comparison when >= 0.
1504 const FloatType max_abs_error_;
1505
1506 GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher);
1507};
1508
1509// A 2-tuple ("binary") wrapper around FloatingEqMatcher:
1510// FloatingEq2Matcher() matches (x, y) by matching FloatingEqMatcher(x, false)
1511// against y, and FloatingEq2Matcher(e) matches FloatingEqMatcher(x, false, e)
1512// against y. The former implements "Eq", the latter "Near". At present, there
1513// is no version that compares NaNs as equal.
1514template <typename FloatType>
1515class FloatingEq2Matcher {
1516 public:
1517 FloatingEq2Matcher() { Init(-1, false); }
1518
1519 explicit FloatingEq2Matcher(bool nan_eq_nan) { Init(-1, nan_eq_nan); }
1520
1521 explicit FloatingEq2Matcher(FloatType max_abs_error) {
1522 Init(max_abs_error, false);
1523 }
1524
1525 FloatingEq2Matcher(FloatType max_abs_error, bool nan_eq_nan) {
1526 Init(max_abs_error, nan_eq_nan);
1527 }
1528
1529 template <typename T1, typename T2>
1530 operator Matcher<::std::tuple<T1, T2>>() const {
1531 return MakeMatcher(
1532 new Impl<::std::tuple<T1, T2>>(max_abs_error_, nan_eq_nan_));
1533 }
1534 template <typename T1, typename T2>
1535 operator Matcher<const ::std::tuple<T1, T2>&>() const {
1536 return MakeMatcher(
1537 new Impl<const ::std::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));
1538 }
1539
1540 private:
1541 static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT
1542 return os << "an almost-equal pair";
1543 }
1544
1545 template <typename Tuple>
1546 class Impl : public MatcherInterface<Tuple> {
1547 public:
1548 Impl(FloatType max_abs_error, bool nan_eq_nan) :
1549 max_abs_error_(max_abs_error),
1550 nan_eq_nan_(nan_eq_nan) {}
1551
1552 bool MatchAndExplain(Tuple args,
1553 MatchResultListener* listener) const override {
1554 if (max_abs_error_ == -1) {
1555 FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_);
1556 return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(
1557 ::std::get<1>(args), listener);
1558 } else {
1559 FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_,
1560 max_abs_error_);
1561 return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(
1562 ::std::get<1>(args), listener);
1563 }
1564 }
1565 void DescribeTo(::std::ostream* os) const override {
1566 *os << "are " << GetDesc;
1567 }
1568 void DescribeNegationTo(::std::ostream* os) const override {
1569 *os << "aren't " << GetDesc;
1570 }
1571
1572 private:
1573 FloatType max_abs_error_;
1574 const bool nan_eq_nan_;
1575 };
1576
1577 void Init(FloatType max_abs_error_val, bool nan_eq_nan_val) {
1578 max_abs_error_ = max_abs_error_val;
1579 nan_eq_nan_ = nan_eq_nan_val;
1580 }
1581 FloatType max_abs_error_;
1582 bool nan_eq_nan_;
1583};
1584
1585// Implements the Pointee(m) matcher for matching a pointer whose
1586// pointee matches matcher m. The pointer can be either raw or smart.
1587template <typename InnerMatcher>
1588class PointeeMatcher {
1589 public:
1590 explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
1591
1592 // This type conversion operator template allows Pointee(m) to be
1593 // used as a matcher for any pointer type whose pointee type is
1594 // compatible with the inner matcher, where type Pointer can be
1595 // either a raw pointer or a smart pointer.
1596 //
1597 // The reason we do this instead of relying on
1598 // MakePolymorphicMatcher() is that the latter is not flexible
1599 // enough for implementing the DescribeTo() method of Pointee().
1600 template <typename Pointer>
1601 operator Matcher<Pointer>() const {
1602 return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));
1603 }
1604
1605 private:
1606 // The monomorphic implementation that works for a particular pointer type.
1607 template <typename Pointer>
1608 class Impl : public MatcherInterface<Pointer> {
1609 public:
1610 typedef typename PointeeOf<typename std::remove_const<
1611 typename std::remove_reference<Pointer>::type>::type>::type Pointee;
1612
1613 explicit Impl(const InnerMatcher& matcher)
1614 : matcher_(MatcherCast<const Pointee&>(matcher)) {}
1615
1616 void DescribeTo(::std::ostream* os) const override {
1617 *os << "points to a value that ";
1618 matcher_.DescribeTo(os);
1619 }
1620
1621 void DescribeNegationTo(::std::ostream* os) const override {
1622 *os << "does not point to a value that ";
1623 matcher_.DescribeTo(os);
1624 }
1625
1626 bool MatchAndExplain(Pointer pointer,
1627 MatchResultListener* listener) const override {
1628 if (GetRawPointer(pointer) == nullptr) return false;
1629
1630 *listener << "which points to ";
1631 return MatchPrintAndExplain(*pointer, matcher_, listener);
1632 }
1633
1634 private:
1635 const Matcher<const Pointee&> matcher_;
1636
1637 GTEST_DISALLOW_ASSIGN_(Impl);
1638 };
1639
1640 const InnerMatcher matcher_;
1641
1642 GTEST_DISALLOW_ASSIGN_(PointeeMatcher);
1643};
1644
1645#if GTEST_HAS_RTTI
1646// Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or
1647// reference that matches inner_matcher when dynamic_cast<T> is applied.
1648// The result of dynamic_cast<To> is forwarded to the inner matcher.
1649// If To is a pointer and the cast fails, the inner matcher will receive NULL.
1650// If To is a reference and the cast fails, this matcher returns false
1651// immediately.
1652template <typename To>
1653class WhenDynamicCastToMatcherBase {
1654 public:
1655 explicit WhenDynamicCastToMatcherBase(const Matcher<To>& matcher)
1656 : matcher_(matcher) {}
1657
1658 void DescribeTo(::std::ostream* os) const {
1659 GetCastTypeDescription(os);
1660 matcher_.DescribeTo(os);
1661 }
1662
1663 void DescribeNegationTo(::std::ostream* os) const {
1664 GetCastTypeDescription(os);
1665 matcher_.DescribeNegationTo(os);
1666 }
1667
1668 protected:
1669 const Matcher<To> matcher_;
1670
1671 static std::string GetToName() {
1672 return GetTypeName<To>();
1673 }
1674
1675 private:
1676 static void GetCastTypeDescription(::std::ostream* os) {
1677 *os << "when dynamic_cast to " << GetToName() << ", ";
1678 }
1679
1680 GTEST_DISALLOW_ASSIGN_(WhenDynamicCastToMatcherBase);
1681};
1682
1683// Primary template.
1684// To is a pointer. Cast and forward the result.
1685template <typename To>
1686class WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {
1687 public:
1688 explicit WhenDynamicCastToMatcher(const Matcher<To>& matcher)
1689 : WhenDynamicCastToMatcherBase<To>(matcher) {}
1690
1691 template <typename From>
1692 bool MatchAndExplain(From from, MatchResultListener* listener) const {
1693 To to = dynamic_cast<To>(from);
1694 return MatchPrintAndExplain(to, this->matcher_, listener);
1695 }
1696};
1697
1698// Specialize for references.
1699// In this case we return false if the dynamic_cast fails.
1700template <typename To>
1701class WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {
1702 public:
1703 explicit WhenDynamicCastToMatcher(const Matcher<To&>& matcher)
1704 : WhenDynamicCastToMatcherBase<To&>(matcher) {}
1705
1706 template <typename From>
1707 bool MatchAndExplain(From& from, MatchResultListener* listener) const {
1708 // We don't want an std::bad_cast here, so do the cast with pointers.
1709 To* to = dynamic_cast<To*>(&from);
1710 if (to == nullptr) {
1711 *listener << "which cannot be dynamic_cast to " << this->GetToName();
1712 return false;
1713 }
1714 return MatchPrintAndExplain(*to, this->matcher_, listener);
1715 }
1716};
1717#endif // GTEST_HAS_RTTI
1718
1719// Implements the Field() matcher for matching a field (i.e. member
1720// variable) of an object.
1721template <typename Class, typename FieldType>
1722class FieldMatcher {
1723 public:
1724 FieldMatcher(FieldType Class::*field,
1725 const Matcher<const FieldType&>& matcher)
1726 : field_(field), matcher_(matcher), whose_field_("whose given field ") {}
1727
1728 FieldMatcher(const std::string& field_name, FieldType Class::*field,
1729 const Matcher<const FieldType&>& matcher)
1730 : field_(field),
1731 matcher_(matcher),
1732 whose_field_("whose field `" + field_name + "` ") {}
1733
1734 void DescribeTo(::std::ostream* os) const {
1735 *os << "is an object " << whose_field_;
1736 matcher_.DescribeTo(os);
1737 }
1738
1739 void DescribeNegationTo(::std::ostream* os) const {
1740 *os << "is an object " << whose_field_;
1741 matcher_.DescribeNegationTo(os);
1742 }
1743
1744 template <typename T>
1745 bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
1746 // FIXME: The dispatch on std::is_pointer was introduced as a workaround for
1747 // a compiler bug, and can now be removed.
1748 return MatchAndExplainImpl(
1749 typename std::is_pointer<typename std::remove_const<T>::type>::type(),
1750 value, listener);
1751 }
1752
1753 private:
1754 bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,
1755 const Class& obj,
1756 MatchResultListener* listener) const {
1757 *listener << whose_field_ << "is ";
1758 return MatchPrintAndExplain(obj.*field_, matcher_, listener);
1759 }
1760
1761 bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,
1762 MatchResultListener* listener) const {
1763 if (p == nullptr) return false;
1764
1765 *listener << "which points to an object ";
1766 // Since *p has a field, it must be a class/struct/union type and
1767 // thus cannot be a pointer. Therefore we pass false_type() as
1768 // the first argument.
1769 return MatchAndExplainImpl(std::false_type(), *p, listener);
1770 }
1771
1772 const FieldType Class::*field_;
1773 const Matcher<const FieldType&> matcher_;
1774
1775 // Contains either "whose given field " if the name of the field is unknown
1776 // or "whose field `name_of_field` " if the name is known.
1777 const std::string whose_field_;
1778
1779 GTEST_DISALLOW_ASSIGN_(FieldMatcher);
1780};
1781
1782// Implements the Property() matcher for matching a property
1783// (i.e. return value of a getter method) of an object.
1784//
1785// Property is a const-qualified member function of Class returning
1786// PropertyType.
1787template <typename Class, typename PropertyType, typename Property>
1788class PropertyMatcher {
1789 public:
1790 typedef const PropertyType& RefToConstProperty;
1791
1792 PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)
1793 : property_(property),
1794 matcher_(matcher),
1795 whose_property_("whose given property ") {}
1796
1797 PropertyMatcher(const std::string& property_name, Property property,
1798 const Matcher<RefToConstProperty>& matcher)
1799 : property_(property),
1800 matcher_(matcher),
1801 whose_property_("whose property `" + property_name + "` ") {}
1802
1803 void DescribeTo(::std::ostream* os) const {
1804 *os << "is an object " << whose_property_;
1805 matcher_.DescribeTo(os);
1806 }
1807
1808 void DescribeNegationTo(::std::ostream* os) const {
1809 *os << "is an object " << whose_property_;
1810 matcher_.DescribeNegationTo(os);
1811 }
1812
1813 template <typename T>
1814 bool MatchAndExplain(const T&value, MatchResultListener* listener) const {
1815 return MatchAndExplainImpl(
1816 typename std::is_pointer<typename std::remove_const<T>::type>::type(),
1817 value, listener);
1818 }
1819
1820 private:
1821 bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,
1822 const Class& obj,
1823 MatchResultListener* listener) const {
1824 *listener << whose_property_ << "is ";
1825 // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
1826 // which takes a non-const reference as argument.
1827 RefToConstProperty result = (obj.*property_)();
1828 return MatchPrintAndExplain(result, matcher_, listener);
1829 }
1830
1831 bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,
1832 MatchResultListener* listener) const {
1833 if (p == nullptr) return false;
1834
1835 *listener << "which points to an object ";
1836 // Since *p has a property method, it must be a class/struct/union
1837 // type and thus cannot be a pointer. Therefore we pass
1838 // false_type() as the first argument.
1839 return MatchAndExplainImpl(std::false_type(), *p, listener);
1840 }
1841
1842 Property property_;
1843 const Matcher<RefToConstProperty> matcher_;
1844
1845 // Contains either "whose given property " if the name of the property is
1846 // unknown or "whose property `name_of_property` " if the name is known.
1847 const std::string whose_property_;
1848
1849 GTEST_DISALLOW_ASSIGN_(PropertyMatcher);
1850};
1851
1852// Type traits specifying various features of different functors for ResultOf.
1853// The default template specifies features for functor objects.
1854template <typename Functor>
1855struct CallableTraits {
1856 typedef Functor StorageType;
1857
1858 static void CheckIsValid(Functor /* functor */) {}
1859
1860 template <typename T>
1861 static auto Invoke(Functor f, const T& arg) -> decltype(f(arg)) {
1862 return f(arg);
1863 }
1864};
1865
1866// Specialization for function pointers.
1867template <typename ArgType, typename ResType>
1868struct CallableTraits<ResType(*)(ArgType)> {
1869 typedef ResType ResultType;
1870 typedef ResType(*StorageType)(ArgType);
1871
1872 static void CheckIsValid(ResType(*f)(ArgType)) {
1873 GTEST_CHECK_(f != nullptr)
1874 << "NULL function pointer is passed into ResultOf().";
1875 }
1876 template <typename T>
1877 static ResType Invoke(ResType(*f)(ArgType), T arg) {
1878 return (*f)(arg);
1879 }
1880};
1881
1882// Implements the ResultOf() matcher for matching a return value of a
1883// unary function of an object.
1884template <typename Callable, typename InnerMatcher>
1885class ResultOfMatcher {
1886 public:
1887 ResultOfMatcher(Callable callable, InnerMatcher matcher)
1888 : callable_(std::move(callable)), matcher_(std::move(matcher)) {
1889 CallableTraits<Callable>::CheckIsValid(callable_);
1890 }
1891
1892 template <typename T>
1893 operator Matcher<T>() const {
1894 return Matcher<T>(new Impl<const T&>(callable_, matcher_));
1895 }
1896
1897 private:
1898 typedef typename CallableTraits<Callable>::StorageType CallableStorageType;
1899
1900 template <typename T>
1901 class Impl : public MatcherInterface<T> {
1902 using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(
1903 std::declval<CallableStorageType>(), std::declval<T>()));
1904
1905 public:
1906 template <typename M>
1907 Impl(const CallableStorageType& callable, const M& matcher)
1908 : callable_(callable), matcher_(MatcherCast<ResultType>(matcher)) {}
1909
1910 void DescribeTo(::std::ostream* os) const override {
1911 *os << "is mapped by the given callable to a value that ";
1912 matcher_.DescribeTo(os);
1913 }
1914
1915 void DescribeNegationTo(::std::ostream* os) const override {
1916 *os << "is mapped by the given callable to a value that ";
1917 matcher_.DescribeNegationTo(os);
1918 }
1919
1920 bool MatchAndExplain(T obj, MatchResultListener* listener) const override {
1921 *listener << "which is mapped by the given callable to ";
1922 // Cannot pass the return value directly to MatchPrintAndExplain, which
1923 // takes a non-const reference as argument.
1924 // Also, specifying template argument explicitly is needed because T could
1925 // be a non-const reference (e.g. Matcher<Uncopyable&>).
1926 ResultType result =
1927 CallableTraits<Callable>::template Invoke<T>(callable_, obj);
1928 return MatchPrintAndExplain(result, matcher_, listener);
1929 }
1930
1931 private:
1932 // Functors often define operator() as non-const method even though
1933 // they are actually stateless. But we need to use them even when
1934 // 'this' is a const pointer. It's the user's responsibility not to
1935 // use stateful callables with ResultOf(), which doesn't guarantee
1936 // how many times the callable will be invoked.
1937 mutable CallableStorageType callable_;
1938 const Matcher<ResultType> matcher_;
1939
1940 GTEST_DISALLOW_ASSIGN_(Impl);
1941 }; // class Impl
1942
1943 const CallableStorageType callable_;
1944 const InnerMatcher matcher_;
1945
1946 GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);
1947};
1948
1949// Implements a matcher that checks the size of an STL-style container.
1950template <typename SizeMatcher>
1951class SizeIsMatcher {
1952 public:
1953 explicit SizeIsMatcher(const SizeMatcher& size_matcher)
1954 : size_matcher_(size_matcher) {
1955 }
1956
1957 template <typename Container>
1958 operator Matcher<Container>() const {
1959 return Matcher<Container>(new Impl<const Container&>(size_matcher_));
1960 }
1961
1962 template <typename Container>
1963 class Impl : public MatcherInterface<Container> {
1964 public:
1965 using SizeType = decltype(std::declval<Container>().size());
1966 explicit Impl(const SizeMatcher& size_matcher)
1967 : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}
1968
1969 void DescribeTo(::std::ostream* os) const override {
1970 *os << "size ";
1971 size_matcher_.DescribeTo(os);
1972 }
1973 void DescribeNegationTo(::std::ostream* os) const override {
1974 *os << "size ";
1975 size_matcher_.DescribeNegationTo(os);
1976 }
1977
1978 bool MatchAndExplain(Container container,
1979 MatchResultListener* listener) const override {
1980 SizeType size = container.size();
1981 StringMatchResultListener size_listener;
1982 const bool result = size_matcher_.MatchAndExplain(size, &size_listener);
1983 *listener
1984 << "whose size " << size << (result ? " matches" : " doesn't match");
1985 PrintIfNotEmpty(size_listener.str(), listener->stream());
1986 return result;
1987 }
1988
1989 private:
1990 const Matcher<SizeType> size_matcher_;
1991 GTEST_DISALLOW_ASSIGN_(Impl);
1992 };
1993
1994 private:
1995 const SizeMatcher size_matcher_;
1996 GTEST_DISALLOW_ASSIGN_(SizeIsMatcher);
1997};
1998
1999// Implements a matcher that checks the begin()..end() distance of an STL-style
2000// container.
2001template <typename DistanceMatcher>
2002class BeginEndDistanceIsMatcher {
2003 public:
2004 explicit BeginEndDistanceIsMatcher(const DistanceMatcher& distance_matcher)
2005 : distance_matcher_(distance_matcher) {}
2006
2007 template <typename Container>
2008 operator Matcher<Container>() const {
2009 return Matcher<Container>(new Impl<const Container&>(distance_matcher_));
2010 }
2011
2012 template <typename Container>
2013 class Impl : public MatcherInterface<Container> {
2014 public:
2015 typedef internal::StlContainerView<
2016 GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;
2017 typedef typename std::iterator_traits<
2018 typename ContainerView::type::const_iterator>::difference_type
2019 DistanceType;
2020 explicit Impl(const DistanceMatcher& distance_matcher)
2021 : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}
2022
2023 void DescribeTo(::std::ostream* os) const override {
2024 *os << "distance between begin() and end() ";
2025 distance_matcher_.DescribeTo(os);
2026 }
2027 void DescribeNegationTo(::std::ostream* os) const override {
2028 *os << "distance between begin() and end() ";
2029 distance_matcher_.DescribeNegationTo(os);
2030 }
2031
2032 bool MatchAndExplain(Container container,
2033 MatchResultListener* listener) const override {
2034 using std::begin;
2035 using std::end;
2036 DistanceType distance = std::distance(begin(container), end(container));
2037 StringMatchResultListener distance_listener;
2038 const bool result =
2039 distance_matcher_.MatchAndExplain(distance, &distance_listener);
2040 *listener << "whose distance between begin() and end() " << distance
2041 << (result ? " matches" : " doesn't match");
2042 PrintIfNotEmpty(distance_listener.str(), listener->stream());
2043 return result;
2044 }
2045
2046 private:
2047 const Matcher<DistanceType> distance_matcher_;
2048 GTEST_DISALLOW_ASSIGN_(Impl);
2049 };
2050
2051 private:
2052 const DistanceMatcher distance_matcher_;
2053 GTEST_DISALLOW_ASSIGN_(BeginEndDistanceIsMatcher);
2054};
2055
2056// Implements an equality matcher for any STL-style container whose elements
2057// support ==. This matcher is like Eq(), but its failure explanations provide
2058// more detailed information that is useful when the container is used as a set.
2059// The failure message reports elements that are in one of the operands but not
2060// the other. The failure messages do not report duplicate or out-of-order
2061// elements in the containers (which don't properly matter to sets, but can
2062// occur if the containers are vectors or lists, for example).
2063//
2064// Uses the container's const_iterator, value_type, operator ==,
2065// begin(), and end().
2066template <typename Container>
2067class ContainerEqMatcher {
2068 public:
2069 typedef internal::StlContainerView<Container> View;
2070 typedef typename View::type StlContainer;
2071 typedef typename View::const_reference StlContainerReference;
2072
2073 static_assert(!std::is_const<Container>::value,
2074 "Container type must not be const");
2075 static_assert(!std::is_reference<Container>::value,
2076 "Container type must not be a reference");
2077
2078 // We make a copy of expected in case the elements in it are modified
2079 // after this matcher is created.
2080 explicit ContainerEqMatcher(const Container& expected)
2081 : expected_(View::Copy(expected)) {}
2082
2083 void DescribeTo(::std::ostream* os) const {
2084 *os << "equals ";
2085 UniversalPrint(expected_, os);
2086 }
2087 void DescribeNegationTo(::std::ostream* os) const {
2088 *os << "does not equal ";
2089 UniversalPrint(expected_, os);
2090 }
2091
2092 template <typename LhsContainer>
2093 bool MatchAndExplain(const LhsContainer& lhs,
2094 MatchResultListener* listener) const {
2095 typedef internal::StlContainerView<
2096 typename std::remove_const<LhsContainer>::type>
2097 LhsView;
2098 typedef typename LhsView::type LhsStlContainer;
2099 StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2100 if (lhs_stl_container == expected_)
2101 return true;
2102
2103 ::std::ostream* const os = listener->stream();
2104 if (os != nullptr) {
2105 // Something is different. Check for extra values first.
2106 bool printed_header = false;
2107 for (typename LhsStlContainer::const_iterator it =
2108 lhs_stl_container.begin();
2109 it != lhs_stl_container.end(); ++it) {
2110 if (internal::ArrayAwareFind(expected_.begin(), expected_.end(), *it) ==
2111 expected_.end()) {
2112 if (printed_header) {
2113 *os << ", ";
2114 } else {
2115 *os << "which has these unexpected elements: ";
2116 printed_header = true;
2117 }
2118 UniversalPrint(*it, os);
2119 }
2120 }
2121
2122 // Now check for missing values.
2123 bool printed_header2 = false;
2124 for (typename StlContainer::const_iterator it = expected_.begin();
2125 it != expected_.end(); ++it) {
2126 if (internal::ArrayAwareFind(
2127 lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==
2128 lhs_stl_container.end()) {
2129 if (printed_header2) {
2130 *os << ", ";
2131 } else {
2132 *os << (printed_header ? ",\nand" : "which")
2133 << " doesn't have these expected elements: ";
2134 printed_header2 = true;
2135 }
2136 UniversalPrint(*it, os);
2137 }
2138 }
2139 }
2140
2141 return false;
2142 }
2143
2144 private:
2145 const StlContainer expected_;
2146
2147 GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
2148};
2149
2150// A comparator functor that uses the < operator to compare two values.
2151struct LessComparator {
2152 template <typename T, typename U>
2153 bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }
2154};
2155
2156// Implements WhenSortedBy(comparator, container_matcher).
2157template <typename Comparator, typename ContainerMatcher>
2158class WhenSortedByMatcher {
2159 public:
2160 WhenSortedByMatcher(const Comparator& comparator,
2161 const ContainerMatcher& matcher)
2162 : comparator_(comparator), matcher_(matcher) {}
2163
2164 template <typename LhsContainer>
2165 operator Matcher<LhsContainer>() const {
2166 return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));
2167 }
2168
2169 template <typename LhsContainer>
2170 class Impl : public MatcherInterface<LhsContainer> {
2171 public:
2172 typedef internal::StlContainerView<
2173 GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
2174 typedef typename LhsView::type LhsStlContainer;
2175 typedef typename LhsView::const_reference LhsStlContainerReference;
2176 // Transforms std::pair<const Key, Value> into std::pair<Key, Value>
2177 // so that we can match associative containers.
2178 typedef typename RemoveConstFromKey<
2179 typename LhsStlContainer::value_type>::type LhsValue;
2180
2181 Impl(const Comparator& comparator, const ContainerMatcher& matcher)
2182 : comparator_(comparator), matcher_(matcher) {}
2183
2184 void DescribeTo(::std::ostream* os) const override {
2185 *os << "(when sorted) ";
2186 matcher_.DescribeTo(os);
2187 }
2188
2189 void DescribeNegationTo(::std::ostream* os) const override {
2190 *os << "(when sorted) ";
2191 matcher_.DescribeNegationTo(os);
2192 }
2193
2194 bool MatchAndExplain(LhsContainer lhs,
2195 MatchResultListener* listener) const override {
2196 LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2197 ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),
2198 lhs_stl_container.end());
2199 ::std::sort(
2200 sorted_container.begin(), sorted_container.end(), comparator_);
2201
2202 if (!listener->IsInterested()) {
2203 // If the listener is not interested, we do not need to
2204 // construct the inner explanation.
2205 return matcher_.Matches(sorted_container);
2206 }
2207
2208 *listener << "which is ";
2209 UniversalPrint(sorted_container, listener->stream());
2210 *listener << " when sorted";
2211
2212 StringMatchResultListener inner_listener;
2213 const bool match = matcher_.MatchAndExplain(sorted_container,
2214 &inner_listener);
2215 PrintIfNotEmpty(inner_listener.str(), listener->stream());
2216 return match;
2217 }
2218
2219 private:
2220 const Comparator comparator_;
2221 const Matcher<const ::std::vector<LhsValue>&> matcher_;
2222
2223 GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
2224 };
2225
2226 private:
2227 const Comparator comparator_;
2228 const ContainerMatcher matcher_;
2229
2230 GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher);
2231};
2232
2233// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
2234// must be able to be safely cast to Matcher<std::tuple<const T1&, const
2235// T2&> >, where T1 and T2 are the types of elements in the LHS
2236// container and the RHS container respectively.
2237template <typename TupleMatcher, typename RhsContainer>
2238class PointwiseMatcher {
2239 GTEST_COMPILE_ASSERT_(
2240 !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>::value,
2241 use_UnorderedPointwise_with_hash_tables);
2242
2243 public:
2244 typedef internal::StlContainerView<RhsContainer> RhsView;
2245 typedef typename RhsView::type RhsStlContainer;
2246 typedef typename RhsStlContainer::value_type RhsValue;
2247
2248 static_assert(!std::is_const<RhsContainer>::value,
2249 "RhsContainer type must not be const");
2250 static_assert(!std::is_reference<RhsContainer>::value,
2251 "RhsContainer type must not be a reference");
2252
2253 // Like ContainerEq, we make a copy of rhs in case the elements in
2254 // it are modified after this matcher is created.
2255 PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)
2256 : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {}
2257
2258 template <typename LhsContainer>
2259 operator Matcher<LhsContainer>() const {
2260 GTEST_COMPILE_ASSERT_(
2261 !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,
2262 use_UnorderedPointwise_with_hash_tables);
2263
2264 return Matcher<LhsContainer>(
2265 new Impl<const LhsContainer&>(tuple_matcher_, rhs_));
2266 }
2267
2268 template <typename LhsContainer>
2269 class Impl : public MatcherInterface<LhsContainer> {
2270 public:
2271 typedef internal::StlContainerView<
2272 GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
2273 typedef typename LhsView::type LhsStlContainer;
2274 typedef typename LhsView::const_reference LhsStlContainerReference;
2275 typedef typename LhsStlContainer::value_type LhsValue;
2276 // We pass the LHS value and the RHS value to the inner matcher by
2277 // reference, as they may be expensive to copy. We must use tuple
2278 // instead of pair here, as a pair cannot hold references (C++ 98,
2279 // 20.2.2 [lib.pairs]).
2280 typedef ::std::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;
2281
2282 Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)
2283 // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
2284 : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),
2285 rhs_(rhs) {}
2286
2287 void DescribeTo(::std::ostream* os) const override {
2288 *os << "contains " << rhs_.size()
2289 << " values, where each value and its corresponding value in ";
2290 UniversalPrinter<RhsStlContainer>::Print(rhs_, os);
2291 *os << " ";
2292 mono_tuple_matcher_.DescribeTo(os);
2293 }
2294 void DescribeNegationTo(::std::ostream* os) const override {
2295 *os << "doesn't contain exactly " << rhs_.size()
2296 << " values, or contains a value x at some index i"
2297 << " where x and the i-th value of ";
2298 UniversalPrint(rhs_, os);
2299 *os << " ";
2300 mono_tuple_matcher_.DescribeNegationTo(os);
2301 }
2302
2303 bool MatchAndExplain(LhsContainer lhs,
2304 MatchResultListener* listener) const override {
2305 LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
2306 const size_t actual_size = lhs_stl_container.size();
2307 if (actual_size != rhs_.size()) {
2308 *listener << "which contains " << actual_size << " values";
2309 return false;
2310 }
2311
2312 typename LhsStlContainer::const_iterator left = lhs_stl_container.begin();
2313 typename RhsStlContainer::const_iterator right = rhs_.begin();
2314 for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {
2315 if (listener->IsInterested()) {
2316 StringMatchResultListener inner_listener;
2317 // Create InnerMatcherArg as a temporarily object to avoid it outlives
2318 // *left and *right. Dereference or the conversion to `const T&` may
2319 // return temp objects, e.g for vector<bool>.
2320 if (!mono_tuple_matcher_.MatchAndExplain(
2321 InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),
2322 ImplicitCast_<const RhsValue&>(*right)),
2323 &inner_listener)) {
2324 *listener << "where the value pair (";
2325 UniversalPrint(*left, listener->stream());
2326 *listener << ", ";
2327 UniversalPrint(*right, listener->stream());
2328 *listener << ") at index #" << i << " don't match";
2329 PrintIfNotEmpty(inner_listener.str(), listener->stream());
2330 return false;
2331 }
2332 } else {
2333 if (!mono_tuple_matcher_.Matches(
2334 InnerMatcherArg(ImplicitCast_<const LhsValue&>(*left),
2335 ImplicitCast_<const RhsValue&>(*right))))
2336 return false;
2337 }
2338 }
2339
2340 return true;
2341 }
2342
2343 private:
2344 const Matcher<InnerMatcherArg> mono_tuple_matcher_;
2345 const RhsStlContainer rhs_;
2346
2347 GTEST_DISALLOW_ASSIGN_(Impl);
2348 };
2349
2350 private:
2351 const TupleMatcher tuple_matcher_;
2352 const RhsStlContainer rhs_;
2353
2354 GTEST_DISALLOW_ASSIGN_(PointwiseMatcher);
2355};
2356
2357// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
2358template <typename Container>
2359class QuantifierMatcherImpl : public MatcherInterface<Container> {
2360 public:
2361 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2362 typedef StlContainerView<RawContainer> View;
2363 typedef typename View::type StlContainer;
2364 typedef typename View::const_reference StlContainerReference;
2365 typedef typename StlContainer::value_type Element;
2366
2367 template <typename InnerMatcher>
2368 explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)
2369 : inner_matcher_(
2370 testing::SafeMatcherCast<const Element&>(inner_matcher)) {}
2371
2372 // Checks whether:
2373 // * All elements in the container match, if all_elements_should_match.
2374 // * Any element in the container matches, if !all_elements_should_match.
2375 bool MatchAndExplainImpl(bool all_elements_should_match,
2376 Container container,
2377 MatchResultListener* listener) const {
2378 StlContainerReference stl_container = View::ConstReference(container);
2379 size_t i = 0;
2380 for (typename StlContainer::const_iterator it = stl_container.begin();
2381 it != stl_container.end(); ++it, ++i) {
2382 StringMatchResultListener inner_listener;
2383 const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
2384
2385 if (matches != all_elements_should_match) {
2386 *listener << "whose element #" << i
2387 << (matches ? " matches" : " doesn't match");
2388 PrintIfNotEmpty(inner_listener.str(), listener->stream());
2389 return !all_elements_should_match;
2390 }
2391 }
2392 return all_elements_should_match;
2393 }
2394
2395 protected:
2396 const Matcher<const Element&> inner_matcher_;
2397
2398 GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl);
2399};
2400
2401// Implements Contains(element_matcher) for the given argument type Container.
2402// Symmetric to EachMatcherImpl.
2403template <typename Container>
2404class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {
2405 public:
2406 template <typename InnerMatcher>
2407 explicit ContainsMatcherImpl(InnerMatcher inner_matcher)
2408 : QuantifierMatcherImpl<Container>(inner_matcher) {}
2409
2410 // Describes what this matcher does.
2411 void DescribeTo(::std::ostream* os) const override {
2412 *os << "contains at least one element that ";
2413 this->inner_matcher_.DescribeTo(os);
2414 }
2415
2416 void DescribeNegationTo(::std::ostream* os) const override {
2417 *os << "doesn't contain any element that ";
2418 this->inner_matcher_.DescribeTo(os);
2419 }
2420
2421 bool MatchAndExplain(Container container,
2422 MatchResultListener* listener) const override {
2423 return this->MatchAndExplainImpl(false, container, listener);
2424 }
2425
2426 private:
2427 GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl);
2428};
2429
2430// Implements Each(element_matcher) for the given argument type Container.
2431// Symmetric to ContainsMatcherImpl.
2432template <typename Container>
2433class EachMatcherImpl : public QuantifierMatcherImpl<Container> {
2434 public:
2435 template <typename InnerMatcher>
2436 explicit EachMatcherImpl(InnerMatcher inner_matcher)
2437 : QuantifierMatcherImpl<Container>(inner_matcher) {}
2438
2439 // Describes what this matcher does.
2440 void DescribeTo(::std::ostream* os) const override {
2441 *os << "only contains elements that ";
2442 this->inner_matcher_.DescribeTo(os);
2443 }
2444
2445 void DescribeNegationTo(::std::ostream* os) const override {
2446 *os << "contains some element that ";
2447 this->inner_matcher_.DescribeNegationTo(os);
2448 }
2449
2450 bool MatchAndExplain(Container container,
2451 MatchResultListener* listener) const override {
2452 return this->MatchAndExplainImpl(true, container, listener);
2453 }
2454
2455 private:
2456 GTEST_DISALLOW_ASSIGN_(EachMatcherImpl);
2457};
2458
2459// Implements polymorphic Contains(element_matcher).
2460template <typename M>
2461class ContainsMatcher {
2462 public:
2463 explicit ContainsMatcher(M m) : inner_matcher_(m) {}
2464
2465 template <typename Container>
2466 operator Matcher<Container>() const {
2467 return Matcher<Container>(
2468 new ContainsMatcherImpl<const Container&>(inner_matcher_));
2469 }
2470
2471 private:
2472 const M inner_matcher_;
2473
2474 GTEST_DISALLOW_ASSIGN_(ContainsMatcher);
2475};
2476
2477// Implements polymorphic Each(element_matcher).
2478template <typename M>
2479class EachMatcher {
2480 public:
2481 explicit EachMatcher(M m) : inner_matcher_(m) {}
2482
2483 template <typename Container>
2484 operator Matcher<Container>() const {
2485 return Matcher<Container>(
2486 new EachMatcherImpl<const Container&>(inner_matcher_));
2487 }
2488
2489 private:
2490 const M inner_matcher_;
2491
2492 GTEST_DISALLOW_ASSIGN_(EachMatcher);
2493};
2494
2495struct Rank1 {};
2496struct Rank0 : Rank1 {};
2497
2498namespace pair_getters {
2499using std::get;
2500template <typename T>
2501auto First(T& x, Rank1) -> decltype(get<0>(x)) { // NOLINT
2502 return get<0>(x);
2503}
2504template <typename T>
2505auto First(T& x, Rank0) -> decltype((x.first)) { // NOLINT
2506 return x.first;
2507}
2508
2509template <typename T>
2510auto Second(T& x, Rank1) -> decltype(get<1>(x)) { // NOLINT
2511 return get<1>(x);
2512}
2513template <typename T>
2514auto Second(T& x, Rank0) -> decltype((x.second)) { // NOLINT
2515 return x.second;
2516}
2517} // namespace pair_getters
2518
2519// Implements Key(inner_matcher) for the given argument pair type.
2520// Key(inner_matcher) matches an std::pair whose 'first' field matches
2521// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
2522// std::map that contains at least one element whose key is >= 5.
2523template <typename PairType>
2524class KeyMatcherImpl : public MatcherInterface<PairType> {
2525 public:
2526 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
2527 typedef typename RawPairType::first_type KeyType;
2528
2529 template <typename InnerMatcher>
2530 explicit KeyMatcherImpl(InnerMatcher inner_matcher)
2531 : inner_matcher_(
2532 testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {
2533 }
2534
2535 // Returns true if and only if 'key_value.first' (the key) matches the inner
2536 // matcher.
2537 bool MatchAndExplain(PairType key_value,
2538 MatchResultListener* listener) const override {
2539 StringMatchResultListener inner_listener;
2540 const bool match = inner_matcher_.MatchAndExplain(
2541 pair_getters::First(key_value, Rank0()), &inner_listener);
2542 const std::string explanation = inner_listener.str();
2543 if (explanation != "") {
2544 *listener << "whose first field is a value " << explanation;
2545 }
2546 return match;
2547 }
2548
2549 // Describes what this matcher does.
2550 void DescribeTo(::std::ostream* os) const override {
2551 *os << "has a key that ";
2552 inner_matcher_.DescribeTo(os);
2553 }
2554
2555 // Describes what the negation of this matcher does.
2556 void DescribeNegationTo(::std::ostream* os) const override {
2557 *os << "doesn't have a key that ";
2558 inner_matcher_.DescribeTo(os);
2559 }
2560
2561 private:
2562 const Matcher<const KeyType&> inner_matcher_;
2563
2564 GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl);
2565};
2566
2567// Implements polymorphic Key(matcher_for_key).
2568template <typename M>
2569class KeyMatcher {
2570 public:
2571 explicit KeyMatcher(M m) : matcher_for_key_(m) {}
2572
2573 template <typename PairType>
2574 operator Matcher<PairType>() const {
2575 return Matcher<PairType>(
2576 new KeyMatcherImpl<const PairType&>(matcher_for_key_));
2577 }
2578
2579 private:
2580 const M matcher_for_key_;
2581
2582 GTEST_DISALLOW_ASSIGN_(KeyMatcher);
2583};
2584
2585// Implements Pair(first_matcher, second_matcher) for the given argument pair
2586// type with its two matchers. See Pair() function below.
2587template <typename PairType>
2588class PairMatcherImpl : public MatcherInterface<PairType> {
2589 public:
2590 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
2591 typedef typename RawPairType::first_type FirstType;
2592 typedef typename RawPairType::second_type SecondType;
2593
2594 template <typename FirstMatcher, typename SecondMatcher>
2595 PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)
2596 : first_matcher_(
2597 testing::SafeMatcherCast<const FirstType&>(first_matcher)),
2598 second_matcher_(
2599 testing::SafeMatcherCast<const SecondType&>(second_matcher)) {
2600 }
2601
2602 // Describes what this matcher does.
2603 void DescribeTo(::std::ostream* os) const override {
2604 *os << "has a first field that ";
2605 first_matcher_.DescribeTo(os);
2606 *os << ", and has a second field that ";
2607 second_matcher_.DescribeTo(os);
2608 }
2609
2610 // Describes what the negation of this matcher does.
2611 void DescribeNegationTo(::std::ostream* os) const override {
2612 *os << "has a first field that ";
2613 first_matcher_.DescribeNegationTo(os);
2614 *os << ", or has a second field that ";
2615 second_matcher_.DescribeNegationTo(os);
2616 }
2617
2618 // Returns true if and only if 'a_pair.first' matches first_matcher and
2619 // 'a_pair.second' matches second_matcher.
2620 bool MatchAndExplain(PairType a_pair,
2621 MatchResultListener* listener) const override {
2622 if (!listener->IsInterested()) {
2623 // If the listener is not interested, we don't need to construct the
2624 // explanation.
2625 return first_matcher_.Matches(pair_getters::First(a_pair, Rank0())) &&
2626 second_matcher_.Matches(pair_getters::Second(a_pair, Rank0()));
2627 }
2628 StringMatchResultListener first_inner_listener;
2629 if (!first_matcher_.MatchAndExplain(pair_getters::First(a_pair, Rank0()),
2630 &first_inner_listener)) {
2631 *listener << "whose first field does not match";
2632 PrintIfNotEmpty(first_inner_listener.str(), listener->stream());
2633 return false;
2634 }
2635 StringMatchResultListener second_inner_listener;
2636 if (!second_matcher_.MatchAndExplain(pair_getters::Second(a_pair, Rank0()),
2637 &second_inner_listener)) {
2638 *listener << "whose second field does not match";
2639 PrintIfNotEmpty(second_inner_listener.str(), listener->stream());
2640 return false;
2641 }
2642 ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),
2643 listener);
2644 return true;
2645 }
2646
2647 private:
2648 void ExplainSuccess(const std::string& first_explanation,
2649 const std::string& second_explanation,
2650 MatchResultListener* listener) const {
2651 *listener << "whose both fields match";
2652 if (first_explanation != "") {
2653 *listener << ", where the first field is a value " << first_explanation;
2654 }
2655 if (second_explanation != "") {
2656 *listener << ", ";
2657 if (first_explanation != "") {
2658 *listener << "and ";
2659 } else {
2660 *listener << "where ";
2661 }
2662 *listener << "the second field is a value " << second_explanation;
2663 }
2664 }
2665
2666 const Matcher<const FirstType&> first_matcher_;
2667 const Matcher<const SecondType&> second_matcher_;
2668
2669 GTEST_DISALLOW_ASSIGN_(PairMatcherImpl);
2670};
2671
2672// Implements polymorphic Pair(first_matcher, second_matcher).
2673template <typename FirstMatcher, typename SecondMatcher>
2674class PairMatcher {
2675 public:
2676 PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)
2677 : first_matcher_(first_matcher), second_matcher_(second_matcher) {}
2678
2679 template <typename PairType>
2680 operator Matcher<PairType> () const {
2681 return Matcher<PairType>(
2682 new PairMatcherImpl<const PairType&>(first_matcher_, second_matcher_));
2683 }
2684
2685 private:
2686 const FirstMatcher first_matcher_;
2687 const SecondMatcher second_matcher_;
2688
2689 GTEST_DISALLOW_ASSIGN_(PairMatcher);
2690};
2691
2692// Implements ElementsAre() and ElementsAreArray().
2693template <typename Container>
2694class ElementsAreMatcherImpl : public MatcherInterface<Container> {
2695 public:
2696 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2697 typedef internal::StlContainerView<RawContainer> View;
2698 typedef typename View::type StlContainer;
2699 typedef typename View::const_reference StlContainerReference;
2700 typedef typename StlContainer::value_type Element;
2701
2702 // Constructs the matcher from a sequence of element values or
2703 // element matchers.
2704 template <typename InputIter>
2705 ElementsAreMatcherImpl(InputIter first, InputIter last) {
2706 while (first != last) {
2707 matchers_.push_back(MatcherCast<const Element&>(*first++));
2708 }
2709 }
2710
2711 // Describes what this matcher does.
2712 void DescribeTo(::std::ostream* os) const override {
2713 if (count() == 0) {
2714 *os << "is empty";
2715 } else if (count() == 1) {
2716 *os << "has 1 element that ";
2717 matchers_[0].DescribeTo(os);
2718 } else {
2719 *os << "has " << Elements(count()) << " where\n";
2720 for (size_t i = 0; i != count(); ++i) {
2721 *os << "element #" << i << " ";
2722 matchers_[i].DescribeTo(os);
2723 if (i + 1 < count()) {
2724 *os << ",\n";
2725 }
2726 }
2727 }
2728 }
2729
2730 // Describes what the negation of this matcher does.
2731 void DescribeNegationTo(::std::ostream* os) const override {
2732 if (count() == 0) {
2733 *os << "isn't empty";
2734 return;
2735 }
2736
2737 *os << "doesn't have " << Elements(count()) << ", or\n";
2738 for (size_t i = 0; i != count(); ++i) {
2739 *os << "element #" << i << " ";
2740 matchers_[i].DescribeNegationTo(os);
2741 if (i + 1 < count()) {
2742 *os << ", or\n";
2743 }
2744 }
2745 }
2746
2747 bool MatchAndExplain(Container container,
2748 MatchResultListener* listener) const override {
2749 // To work with stream-like "containers", we must only walk
2750 // through the elements in one pass.
2751
2752 const bool listener_interested = listener->IsInterested();
2753
2754 // explanations[i] is the explanation of the element at index i.
2755 ::std::vector<std::string> explanations(count());
2756 StlContainerReference stl_container = View::ConstReference(container);
2757 typename StlContainer::const_iterator it = stl_container.begin();
2758 size_t exam_pos = 0;
2759 bool mismatch_found = false; // Have we found a mismatched element yet?
2760
2761 // Go through the elements and matchers in pairs, until we reach
2762 // the end of either the elements or the matchers, or until we find a
2763 // mismatch.
2764 for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {
2765 bool match; // Does the current element match the current matcher?
2766 if (listener_interested) {
2767 StringMatchResultListener s;
2768 match = matchers_[exam_pos].MatchAndExplain(*it, &s);
2769 explanations[exam_pos] = s.str();
2770 } else {
2771 match = matchers_[exam_pos].Matches(*it);
2772 }
2773
2774 if (!match) {
2775 mismatch_found = true;
2776 break;
2777 }
2778 }
2779 // If mismatch_found is true, 'exam_pos' is the index of the mismatch.
2780
2781 // Find how many elements the actual container has. We avoid
2782 // calling size() s.t. this code works for stream-like "containers"
2783 // that don't define size().
2784 size_t actual_count = exam_pos;
2785 for (; it != stl_container.end(); ++it) {
2786 ++actual_count;
2787 }
2788
2789 if (actual_count != count()) {
2790 // The element count doesn't match. If the container is empty,
2791 // there's no need to explain anything as Google Mock already
2792 // prints the empty container. Otherwise we just need to show
2793 // how many elements there actually are.
2794 if (listener_interested && (actual_count != 0)) {
2795 *listener << "which has " << Elements(actual_count);
2796 }
2797 return false;
2798 }
2799
2800 if (mismatch_found) {
2801 // The element count matches, but the exam_pos-th element doesn't match.
2802 if (listener_interested) {
2803 *listener << "whose element #" << exam_pos << " doesn't match";
2804 PrintIfNotEmpty(explanations[exam_pos], listener->stream());
2805 }
2806 return false;
2807 }
2808
2809 // Every element matches its expectation. We need to explain why
2810 // (the obvious ones can be skipped).
2811 if (listener_interested) {
2812 bool reason_printed = false;
2813 for (size_t i = 0; i != count(); ++i) {
2814 const std::string& s = explanations[i];
2815 if (!s.empty()) {
2816 if (reason_printed) {
2817 *listener << ",\nand ";
2818 }
2819 *listener << "whose element #" << i << " matches, " << s;
2820 reason_printed = true;
2821 }
2822 }
2823 }
2824 return true;
2825 }
2826
2827 private:
2828 static Message Elements(size_t count) {
2829 return Message() << count << (count == 1 ? " element" : " elements");
2830 }
2831
2832 size_t count() const { return matchers_.size(); }
2833
2834 ::std::vector<Matcher<const Element&> > matchers_;
2835
2836 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl);
2837};
2838
2839// Connectivity matrix of (elements X matchers), in element-major order.
2840// Initially, there are no edges.
2841// Use NextGraph() to iterate over all possible edge configurations.
2842// Use Randomize() to generate a random edge configuration.
2843class GTEST_API_ MatchMatrix {
2844 public:
2845 MatchMatrix(size_t num_elements, size_t num_matchers)
2846 : num_elements_(num_elements),
2847 num_matchers_(num_matchers),
2848 matched_(num_elements_* num_matchers_, 0) {
2849 }
2850
2851 size_t LhsSize() const { return num_elements_; }
2852 size_t RhsSize() const { return num_matchers_; }
2853 bool HasEdge(size_t ilhs, size_t irhs) const {
2854 return matched_[SpaceIndex(ilhs, irhs)] == 1;
2855 }
2856 void SetEdge(size_t ilhs, size_t irhs, bool b) {
2857 matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;
2858 }
2859
2860 // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
2861 // adds 1 to that number; returns false if incrementing the graph left it
2862 // empty.
2863 bool NextGraph();
2864
2865 void Randomize();
2866
2867 std::string DebugString() const;
2868
2869 private:
2870 size_t SpaceIndex(size_t ilhs, size_t irhs) const {
2871 return ilhs * num_matchers_ + irhs;
2872 }
2873
2874 size_t num_elements_;
2875 size_t num_matchers_;
2876
2877 // Each element is a char interpreted as bool. They are stored as a
2878 // flattened array in lhs-major order, use 'SpaceIndex()' to translate
2879 // a (ilhs, irhs) matrix coordinate into an offset.
2880 ::std::vector<char> matched_;
2881};
2882
2883typedef ::std::pair<size_t, size_t> ElementMatcherPair;
2884typedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;
2885
2886// Returns a maximum bipartite matching for the specified graph 'g'.
2887// The matching is represented as a vector of {element, matcher} pairs.
2888GTEST_API_ ElementMatcherPairs
2889FindMaxBipartiteMatching(const MatchMatrix& g);
2890
2891struct UnorderedMatcherRequire {
2892 enum Flags {
2893 Superset = 1 << 0,
2894 Subset = 1 << 1,
2895 ExactMatch = Superset | Subset,
2896 };
2897};
2898
2899// Untyped base class for implementing UnorderedElementsAre. By
2900// putting logic that's not specific to the element type here, we
2901// reduce binary bloat and increase compilation speed.
2902class GTEST_API_ UnorderedElementsAreMatcherImplBase {
2903 protected:
2904 explicit UnorderedElementsAreMatcherImplBase(
2905 UnorderedMatcherRequire::Flags matcher_flags)
2906 : match_flags_(matcher_flags) {}
2907
2908 // A vector of matcher describers, one for each element matcher.
2909 // Does not own the describers (and thus can be used only when the
2910 // element matchers are alive).
2911 typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;
2912
2913 // Describes this UnorderedElementsAre matcher.
2914 void DescribeToImpl(::std::ostream* os) const;
2915
2916 // Describes the negation of this UnorderedElementsAre matcher.
2917 void DescribeNegationToImpl(::std::ostream* os) const;
2918
2919 bool VerifyMatchMatrix(const ::std::vector<std::string>& element_printouts,
2920 const MatchMatrix& matrix,
2921 MatchResultListener* listener) const;
2922
2923 bool FindPairing(const MatchMatrix& matrix,
2924 MatchResultListener* listener) const;
2925
2926 MatcherDescriberVec& matcher_describers() {
2927 return matcher_describers_;
2928 }
2929
2930 static Message Elements(size_t n) {
2931 return Message() << n << " element" << (n == 1 ? "" : "s");
2932 }
2933
2934 UnorderedMatcherRequire::Flags match_flags() const { return match_flags_; }
2935
2936 private:
2937 UnorderedMatcherRequire::Flags match_flags_;
2938 MatcherDescriberVec matcher_describers_;
2939
2940 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImplBase);
2941};
2942
2943// Implements UnorderedElementsAre, UnorderedElementsAreArray, IsSubsetOf, and
2944// IsSupersetOf.
2945template <typename Container>
2946class UnorderedElementsAreMatcherImpl
2947 : public MatcherInterface<Container>,
2948 public UnorderedElementsAreMatcherImplBase {
2949 public:
2950 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
2951 typedef internal::StlContainerView<RawContainer> View;
2952 typedef typename View::type StlContainer;
2953 typedef typename View::const_reference StlContainerReference;
2954 typedef typename StlContainer::const_iterator StlContainerConstIterator;
2955 typedef typename StlContainer::value_type Element;
2956
2957 template <typename InputIter>
2958 UnorderedElementsAreMatcherImpl(UnorderedMatcherRequire::Flags matcher_flags,
2959 InputIter first, InputIter last)
2960 : UnorderedElementsAreMatcherImplBase(matcher_flags) {
2961 for (; first != last; ++first) {
2962 matchers_.push_back(MatcherCast<const Element&>(*first));
2963 matcher_describers().push_back(matchers_.back().GetDescriber());
2964 }
2965 }
2966
2967 // Describes what this matcher does.
2968 void DescribeTo(::std::ostream* os) const override {
2969 return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);
2970 }
2971
2972 // Describes what the negation of this matcher does.
2973 void DescribeNegationTo(::std::ostream* os) const override {
2974 return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);
2975 }
2976
2977 bool MatchAndExplain(Container container,
2978 MatchResultListener* listener) const override {
2979 StlContainerReference stl_container = View::ConstReference(container);
2980 ::std::vector<std::string> element_printouts;
2981 MatchMatrix matrix =
2982 AnalyzeElements(stl_container.begin(), stl_container.end(),
2983 &element_printouts, listener);
2984
2985 if (matrix.LhsSize() == 0 && matrix.RhsSize() == 0) {
2986 return true;
2987 }
2988
2989 if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
2990 if (matrix.LhsSize() != matrix.RhsSize()) {
2991 // The element count doesn't match. If the container is empty,
2992 // there's no need to explain anything as Google Mock already
2993 // prints the empty container. Otherwise we just need to show
2994 // how many elements there actually are.
2995 if (matrix.LhsSize() != 0 && listener->IsInterested()) {
2996 *listener << "which has " << Elements(matrix.LhsSize());
2997 }
2998 return false;
2999 }
3000 }
3001
3002 return VerifyMatchMatrix(element_printouts, matrix, listener) &&
3003 FindPairing(matrix, listener);
3004 }
3005
3006 private:
3007 template <typename ElementIter>
3008 MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,
3009 ::std::vector<std::string>* element_printouts,
3010 MatchResultListener* listener) const {
3011 element_printouts->clear();
3012 ::std::vector<char> did_match;
3013 size_t num_elements = 0;
3014 for (; elem_first != elem_last; ++num_elements, ++elem_first) {
3015 if (listener->IsInterested()) {
3016 element_printouts->push_back(PrintToString(*elem_first));
3017 }
3018 for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3019 did_match.push_back(Matches(matchers_[irhs])(*elem_first));
3020 }
3021 }
3022
3023 MatchMatrix matrix(num_elements, matchers_.size());
3024 ::std::vector<char>::const_iterator did_match_iter = did_match.begin();
3025 for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {
3026 for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
3027 matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);
3028 }
3029 }
3030 return matrix;
3031 }
3032
3033 ::std::vector<Matcher<const Element&> > matchers_;
3034
3035 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImpl);
3036};
3037
3038// Functor for use in TransformTuple.
3039// Performs MatcherCast<Target> on an input argument of any type.
3040template <typename Target>
3041struct CastAndAppendTransform {
3042 template <typename Arg>
3043 Matcher<Target> operator()(const Arg& a) const {
3044 return MatcherCast<Target>(a);
3045 }
3046};
3047
3048// Implements UnorderedElementsAre.
3049template <typename MatcherTuple>
3050class UnorderedElementsAreMatcher {
3051 public:
3052 explicit UnorderedElementsAreMatcher(const MatcherTuple& args)
3053 : matchers_(args) {}
3054
3055 template <typename Container>
3056 operator Matcher<Container>() const {
3057 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3058 typedef typename internal::StlContainerView<RawContainer>::type View;
3059 typedef typename View::value_type Element;
3060 typedef ::std::vector<Matcher<const Element&> > MatcherVec;
3061 MatcherVec matchers;
3062 matchers.reserve(::std::tuple_size<MatcherTuple>::value);
3063 TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3064 ::std::back_inserter(matchers));
3065 return Matcher<Container>(
3066 new UnorderedElementsAreMatcherImpl<const Container&>(
3067 UnorderedMatcherRequire::ExactMatch, matchers.begin(),
3068 matchers.end()));
3069 }
3070
3071 private:
3072 const MatcherTuple matchers_;
3073 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcher);
3074};
3075
3076// Implements ElementsAre.
3077template <typename MatcherTuple>
3078class ElementsAreMatcher {
3079 public:
3080 explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}
3081
3082 template <typename Container>
3083 operator Matcher<Container>() const {
3084 GTEST_COMPILE_ASSERT_(
3085 !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||
3086 ::std::tuple_size<MatcherTuple>::value < 2,
3087 use_UnorderedElementsAre_with_hash_tables);
3088
3089 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
3090 typedef typename internal::StlContainerView<RawContainer>::type View;
3091 typedef typename View::value_type Element;
3092 typedef ::std::vector<Matcher<const Element&> > MatcherVec;
3093 MatcherVec matchers;
3094 matchers.reserve(::std::tuple_size<MatcherTuple>::value);
3095 TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
3096 ::std::back_inserter(matchers));
3097 return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(
3098 matchers.begin(), matchers.end()));
3099 }
3100
3101 private:
3102 const MatcherTuple matchers_;
3103 GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher);
3104};
3105
3106// Implements UnorderedElementsAreArray(), IsSubsetOf(), and IsSupersetOf().
3107template <typename T>
3108class UnorderedElementsAreArrayMatcher {
3109 public:
3110 template <typename Iter>
3111 UnorderedElementsAreArrayMatcher(UnorderedMatcherRequire::Flags match_flags,
3112 Iter first, Iter last)
3113 : match_flags_(match_flags), matchers_(first, last) {}
3114
3115 template <typename Container>
3116 operator Matcher<Container>() const {
3117 return Matcher<Container>(
3118 new UnorderedElementsAreMatcherImpl<const Container&>(
3119 match_flags_, matchers_.begin(), matchers_.end()));
3120 }
3121
3122 private:
3123 UnorderedMatcherRequire::Flags match_flags_;
3124 ::std::vector<T> matchers_;
3125
3126 GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreArrayMatcher);
3127};
3128
3129// Implements ElementsAreArray().
3130template <typename T>
3131class ElementsAreArrayMatcher {
3132 public:
3133 template <typename Iter>
3134 ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
3135
3136 template <typename Container>
3137 operator Matcher<Container>() const {
3138 GTEST_COMPILE_ASSERT_(
3139 !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,
3140 use_UnorderedElementsAreArray_with_hash_tables);
3141
3142 return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(
3143 matchers_.begin(), matchers_.end()));
3144 }
3145
3146 private:
3147 const ::std::vector<T> matchers_;
3148
3149 GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher);
3150};
3151
3152// Given a 2-tuple matcher tm of type Tuple2Matcher and a value second
3153// of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,
3154// second) is a polymorphic matcher that matches a value x if and only if
3155// tm matches tuple (x, second). Useful for implementing
3156// UnorderedPointwise() in terms of UnorderedElementsAreArray().
3157//
3158// BoundSecondMatcher is copyable and assignable, as we need to put
3159// instances of this class in a vector when implementing
3160// UnorderedPointwise().
3161template <typename Tuple2Matcher, typename Second>
3162class BoundSecondMatcher {
3163 public:
3164 BoundSecondMatcher(const Tuple2Matcher& tm, const Second& second)
3165 : tuple2_matcher_(tm), second_value_(second) {}
3166
3167 template <typename T>
3168 operator Matcher<T>() const {
3169 return MakeMatcher(new Impl<T>(tuple2_matcher_, second_value_));
3170 }
3171
3172 // We have to define this for UnorderedPointwise() to compile in
3173 // C++98 mode, as it puts BoundSecondMatcher instances in a vector,
3174 // which requires the elements to be assignable in C++98. The
3175 // compiler cannot generate the operator= for us, as Tuple2Matcher
3176 // and Second may not be assignable.
3177 //
3178 // However, this should never be called, so the implementation just
3179 // need to assert.
3180 void operator=(const BoundSecondMatcher& /*rhs*/) {
3181 GTEST_LOG_(FATAL) << "BoundSecondMatcher should never be assigned.";
3182 }
3183
3184 private:
3185 template <typename T>
3186 class Impl : public MatcherInterface<T> {
3187 public:
3188 typedef ::std::tuple<T, Second> ArgTuple;
3189
3190 Impl(const Tuple2Matcher& tm, const Second& second)
3191 : mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),
3192 second_value_(second) {}
3193
3194 void DescribeTo(::std::ostream* os) const override {
3195 *os << "and ";
3196 UniversalPrint(second_value_, os);
3197 *os << " ";
3198 mono_tuple2_matcher_.DescribeTo(os);
3199 }
3200
3201 bool MatchAndExplain(T x, MatchResultListener* listener) const override {
3202 return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),
3203 listener);
3204 }
3205
3206 private:
3207 const Matcher<const ArgTuple&> mono_tuple2_matcher_;
3208 const Second second_value_;
3209
3210 GTEST_DISALLOW_ASSIGN_(Impl);
3211 };
3212
3213 const Tuple2Matcher tuple2_matcher_;
3214 const Second second_value_;
3215};
3216
3217// Given a 2-tuple matcher tm and a value second,
3218// MatcherBindSecond(tm, second) returns a matcher that matches a
3219// value x if and only if tm matches tuple (x, second). Useful for
3220// implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().
3221template <typename Tuple2Matcher, typename Second>
3222BoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(
3223 const Tuple2Matcher& tm, const Second& second) {
3224 return BoundSecondMatcher<Tuple2Matcher, Second>(tm, second);
3225}
3226
3227// Returns the description for a matcher defined using the MATCHER*()
3228// macro where the user-supplied description string is "", if
3229// 'negation' is false; otherwise returns the description of the
3230// negation of the matcher. 'param_values' contains a list of strings
3231// that are the print-out of the matcher's parameters.
3232GTEST_API_ std::string FormatMatcherDescription(bool negation,
3233 const char* matcher_name,
3234 const Strings& param_values);
3235
3236// Implements a matcher that checks the value of a optional<> type variable.
3237template <typename ValueMatcher>
3238class OptionalMatcher {
3239 public:
3240 explicit OptionalMatcher(const ValueMatcher& value_matcher)
3241 : value_matcher_(value_matcher) {}
3242
3243 template <typename Optional>
3244 operator Matcher<Optional>() const {
3245 return Matcher<Optional>(new Impl<const Optional&>(value_matcher_));
3246 }
3247
3248 template <typename Optional>
3249 class Impl : public MatcherInterface<Optional> {
3250 public:
3251 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional) OptionalView;
3252 typedef typename OptionalView::value_type ValueType;
3253 explicit Impl(const ValueMatcher& value_matcher)
3254 : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}
3255
3256 void DescribeTo(::std::ostream* os) const override {
3257 *os << "value ";
3258 value_matcher_.DescribeTo(os);
3259 }
3260
3261 void DescribeNegationTo(::std::ostream* os) const override {
3262 *os << "value ";
3263 value_matcher_.DescribeNegationTo(os);
3264 }
3265
3266 bool MatchAndExplain(Optional optional,
3267 MatchResultListener* listener) const override {
3268 if (!optional) {
3269 *listener << "which is not engaged";
3270 return false;
3271 }
3272 const ValueType& value = *optional;
3273 StringMatchResultListener value_listener;
3274 const bool match = value_matcher_.MatchAndExplain(value, &value_listener);
3275 *listener << "whose value " << PrintToString(value)
3276 << (match ? " matches" : " doesn't match");
3277 PrintIfNotEmpty(value_listener.str(), listener->stream());
3278 return match;
3279 }
3280
3281 private:
3282 const Matcher<ValueType> value_matcher_;
3283 GTEST_DISALLOW_ASSIGN_(Impl);
3284 };
3285
3286 private:
3287 const ValueMatcher value_matcher_;
3288 GTEST_DISALLOW_ASSIGN_(OptionalMatcher);
3289};
3290
3291namespace variant_matcher {
3292// Overloads to allow VariantMatcher to do proper ADL lookup.
3293template <typename T>
3294void holds_alternative() {}
3295template <typename T>
3296void get() {}
3297
3298// Implements a matcher that checks the value of a variant<> type variable.
3299template <typename T>
3300class VariantMatcher {
3301 public:
3302 explicit VariantMatcher(::testing::Matcher<const T&> matcher)
3303 : matcher_(std::move(matcher)) {}
3304
3305 template <typename Variant>
3306 bool MatchAndExplain(const Variant& value,
3307 ::testing::MatchResultListener* listener) const {
3308 using std::get;
3309 if (!listener->IsInterested()) {
3310 return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));
3311 }
3312
3313 if (!holds_alternative<T>(value)) {
3314 *listener << "whose value is not of type '" << GetTypeName() << "'";
3315 return false;
3316 }
3317
3318 const T& elem = get<T>(value);
3319 StringMatchResultListener elem_listener;
3320 const bool match = matcher_.MatchAndExplain(elem, &elem_listener);
3321 *listener << "whose value " << PrintToString(elem)
3322 << (match ? " matches" : " doesn't match");
3323 PrintIfNotEmpty(elem_listener.str(), listener->stream());
3324 return match;
3325 }
3326
3327 void DescribeTo(std::ostream* os) const {
3328 *os << "is a variant<> with value of type '" << GetTypeName()
3329 << "' and the value ";
3330 matcher_.DescribeTo(os);
3331 }
3332
3333 void DescribeNegationTo(std::ostream* os) const {
3334 *os << "is a variant<> with value of type other than '" << GetTypeName()
3335 << "' or the value ";
3336 matcher_.DescribeNegationTo(os);
3337 }
3338
3339 private:
3340 static std::string GetTypeName() {
3341#if GTEST_HAS_RTTI
3342 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
3343 return internal::GetTypeName<T>());
3344#endif
3345 return "the element type";
3346 }
3347
3348 const ::testing::Matcher<const T&> matcher_;
3349};
3350
3351} // namespace variant_matcher
3352
3353namespace any_cast_matcher {
3354
3355// Overloads to allow AnyCastMatcher to do proper ADL lookup.
3356template <typename T>
3357void any_cast() {}
3358
3359// Implements a matcher that any_casts the value.
3360template <typename T>
3361class AnyCastMatcher {
3362 public:
3363 explicit AnyCastMatcher(const ::testing::Matcher<const T&>& matcher)
3364 : matcher_(matcher) {}
3365
3366 template <typename AnyType>
3367 bool MatchAndExplain(const AnyType& value,
3368 ::testing::MatchResultListener* listener) const {
3369 if (!listener->IsInterested()) {
3370 const T* ptr = any_cast<T>(&value);
3371 return ptr != nullptr && matcher_.Matches(*ptr);
3372 }
3373
3374 const T* elem = any_cast<T>(&value);
3375 if (elem == nullptr) {
3376 *listener << "whose value is not of type '" << GetTypeName() << "'";
3377 return false;
3378 }
3379
3380 StringMatchResultListener elem_listener;
3381 const bool match = matcher_.MatchAndExplain(*elem, &elem_listener);
3382 *listener << "whose value " << PrintToString(*elem)
3383 << (match ? " matches" : " doesn't match");
3384 PrintIfNotEmpty(elem_listener.str(), listener->stream());
3385 return match;
3386 }
3387
3388 void DescribeTo(std::ostream* os) const {
3389 *os << "is an 'any' type with value of type '" << GetTypeName()
3390 << "' and the value ";
3391 matcher_.DescribeTo(os);
3392 }
3393
3394 void DescribeNegationTo(std::ostream* os) const {
3395 *os << "is an 'any' type with value of type other than '" << GetTypeName()
3396 << "' or the value ";
3397 matcher_.DescribeNegationTo(os);
3398 }
3399
3400 private:
3401 static std::string GetTypeName() {
3402#if GTEST_HAS_RTTI
3403 GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
3404 return internal::GetTypeName<T>());
3405#endif
3406 return "the element type";
3407 }
3408
3409 const ::testing::Matcher<const T&> matcher_;
3410};
3411
3412} // namespace any_cast_matcher
3413
3414// Implements the Args() matcher.
3415template <class ArgsTuple, size_t... k>
3416class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
3417 public:
3418 using RawArgsTuple = typename std::decay<ArgsTuple>::type;
3419 using SelectedArgs =
3420 std::tuple<typename std::tuple_element<k, RawArgsTuple>::type...>;
3421 using MonomorphicInnerMatcher = Matcher<const SelectedArgs&>;
3422
3423 template <typename InnerMatcher>
3424 explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
3425 : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
3426
3427 bool MatchAndExplain(ArgsTuple args,
3428 MatchResultListener* listener) const override {
3429 // Workaround spurious C4100 on MSVC<=15.7 when k is empty.
3430 (void)args;
3431 const SelectedArgs& selected_args =
3432 std::forward_as_tuple(std::get<k>(args)...);
3433 if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args);
3434
3435 PrintIndices(listener->stream());
3436 *listener << "are " << PrintToString(selected_args);
3437
3438 StringMatchResultListener inner_listener;
3439 const bool match =
3440 inner_matcher_.MatchAndExplain(selected_args, &inner_listener);
3441 PrintIfNotEmpty(inner_listener.str(), listener->stream());
3442 return match;
3443 }
3444
3445 void DescribeTo(::std::ostream* os) const override {
3446 *os << "are a tuple ";
3447 PrintIndices(os);
3448 inner_matcher_.DescribeTo(os);
3449 }
3450
3451 void DescribeNegationTo(::std::ostream* os) const override {
3452 *os << "are a tuple ";
3453 PrintIndices(os);
3454 inner_matcher_.DescribeNegationTo(os);
3455 }
3456
3457 private:
3458 // Prints the indices of the selected fields.
3459 static void PrintIndices(::std::ostream* os) {
3460 *os << "whose fields (";
3461 const char* sep = "";
3462 // Workaround spurious C4189 on MSVC<=15.7 when k is empty.
3463 (void)sep;
3464 const char* dummy[] = {"", (*os << sep << "#" << k, sep = ", ")...};
3465 (void)dummy;
3466 *os << ") ";
3467 }
3468
3469 MonomorphicInnerMatcher inner_matcher_;
3470};
3471
3472template <class InnerMatcher, size_t... k>
3473class ArgsMatcher {
3474 public:
3475 explicit ArgsMatcher(InnerMatcher inner_matcher)
3476 : inner_matcher_(std::move(inner_matcher)) {}
3477
3478 template <typename ArgsTuple>
3479 operator Matcher<ArgsTuple>() const { // NOLINT
3480 return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k...>(inner_matcher_));
3481 }
3482
3483 private:
3484 InnerMatcher inner_matcher_;
3485};
3486
3487} // namespace internal
3488
3489// ElementsAreArray(iterator_first, iterator_last)
3490// ElementsAreArray(pointer, count)
3491// ElementsAreArray(array)
3492// ElementsAreArray(container)
3493// ElementsAreArray({ e1, e2, ..., en })
3494//
3495// The ElementsAreArray() functions are like ElementsAre(...), except
3496// that they are given a homogeneous sequence rather than taking each
3497// element as a function argument. The sequence can be specified as an
3498// array, a pointer and count, a vector, an initializer list, or an
3499// STL iterator range. In each of these cases, the underlying sequence
3500// can be either a sequence of values or a sequence of matchers.
3501//
3502// All forms of ElementsAreArray() make a copy of the input matcher sequence.
3503
3504template <typename Iter>
3505inline internal::ElementsAreArrayMatcher<
3506 typename ::std::iterator_traits<Iter>::value_type>
3507ElementsAreArray(Iter first, Iter last) {
3508 typedef typename ::std::iterator_traits<Iter>::value_type T;
3509 return internal::ElementsAreArrayMatcher<T>(first, last);
3510}
3511
3512template <typename T>
3513inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
3514 const T* pointer, size_t count) {
3515 return ElementsAreArray(pointer, pointer + count);
3516}
3517
3518template <typename T, size_t N>
3519inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
3520 const T (&array)[N]) {
3521 return ElementsAreArray(array, N);
3522}
3523
3524template <typename Container>
3525inline internal::ElementsAreArrayMatcher<typename Container::value_type>
3526ElementsAreArray(const Container& container) {
3527 return ElementsAreArray(container.begin(), container.end());
3528}
3529
3530template <typename T>
3531inline internal::ElementsAreArrayMatcher<T>
3532ElementsAreArray(::std::initializer_list<T> xs) {
3533 return ElementsAreArray(xs.begin(), xs.end());
3534}
3535
3536// UnorderedElementsAreArray(iterator_first, iterator_last)
3537// UnorderedElementsAreArray(pointer, count)
3538// UnorderedElementsAreArray(array)
3539// UnorderedElementsAreArray(container)
3540// UnorderedElementsAreArray({ e1, e2, ..., en })
3541//
3542// UnorderedElementsAreArray() verifies that a bijective mapping onto a
3543// collection of matchers exists.
3544//
3545// The matchers can be specified as an array, a pointer and count, a container,
3546// an initializer list, or an STL iterator range. In each of these cases, the
3547// underlying matchers can be either values or matchers.
3548
3549template <typename Iter>
3550inline internal::UnorderedElementsAreArrayMatcher<
3551 typename ::std::iterator_traits<Iter>::value_type>
3552UnorderedElementsAreArray(Iter first, Iter last) {
3553 typedef typename ::std::iterator_traits<Iter>::value_type T;
3554 return internal::UnorderedElementsAreArrayMatcher<T>(
3555 internal::UnorderedMatcherRequire::ExactMatch, first, last);
3556}
3557
3558template <typename T>
3559inline internal::UnorderedElementsAreArrayMatcher<T>
3560UnorderedElementsAreArray(const T* pointer, size_t count) {
3561 return UnorderedElementsAreArray(pointer, pointer + count);
3562}
3563
3564template <typename T, size_t N>
3565inline internal::UnorderedElementsAreArrayMatcher<T>
3566UnorderedElementsAreArray(const T (&array)[N]) {
3567 return UnorderedElementsAreArray(array, N);
3568}
3569
3570template <typename Container>
3571inline internal::UnorderedElementsAreArrayMatcher<
3572 typename Container::value_type>
3573UnorderedElementsAreArray(const Container& container) {
3574 return UnorderedElementsAreArray(container.begin(), container.end());
3575}
3576
3577template <typename T>
3578inline internal::UnorderedElementsAreArrayMatcher<T>
3579UnorderedElementsAreArray(::std::initializer_list<T> xs) {
3580 return UnorderedElementsAreArray(xs.begin(), xs.end());
3581}
3582
3583// _ is a matcher that matches anything of any type.
3584//
3585// This definition is fine as:
3586//
3587// 1. The C++ standard permits using the name _ in a namespace that
3588// is not the global namespace or ::std.
3589// 2. The AnythingMatcher class has no data member or constructor,
3590// so it's OK to create global variables of this type.
3591// 3. c-style has approved of using _ in this case.
3592const internal::AnythingMatcher _ = {};
3593// Creates a matcher that matches any value of the given type T.
3594template <typename T>
3595inline Matcher<T> A() {
3596 return Matcher<T>(new internal::AnyMatcherImpl<T>());
3597}
3598
3599// Creates a matcher that matches any value of the given type T.
3600template <typename T>
3601inline Matcher<T> An() { return A<T>(); }
3602
3603template <typename T, typename M>
3604Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(
3605 const M& value, std::false_type /* convertible_to_matcher */,
3606 std::false_type /* convertible_to_T */) {
3607 return Eq(value);
3608}
3609
3610// Creates a polymorphic matcher that matches any NULL pointer.
3611inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {
3612 return MakePolymorphicMatcher(internal::IsNullMatcher());
3613}
3614
3615// Creates a polymorphic matcher that matches any non-NULL pointer.
3616// This is convenient as Not(NULL) doesn't compile (the compiler
3617// thinks that that expression is comparing a pointer with an integer).
3618inline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {
3619 return MakePolymorphicMatcher(internal::NotNullMatcher());
3620}
3621
3622// Creates a polymorphic matcher that matches any argument that
3623// references variable x.
3624template <typename T>
3625inline internal::RefMatcher<T&> Ref(T& x) { // NOLINT
3626 return internal::RefMatcher<T&>(x);
3627}
3628
3629// Creates a matcher that matches any double argument approximately
3630// equal to rhs, where two NANs are considered unequal.
3631inline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {
3632 return internal::FloatingEqMatcher<double>(rhs, false);
3633}
3634
3635// Creates a matcher that matches any double argument approximately
3636// equal to rhs, including NaN values when rhs is NaN.
3637inline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {
3638 return internal::FloatingEqMatcher<double>(rhs, true);
3639}
3640
3641// Creates a matcher that matches any double argument approximately equal to
3642// rhs, up to the specified max absolute error bound, where two NANs are
3643// considered unequal. The max absolute error bound must be non-negative.
3644inline internal::FloatingEqMatcher<double> DoubleNear(
3645 double rhs, double max_abs_error) {
3646 return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);
3647}
3648
3649// Creates a matcher that matches any double argument approximately equal to
3650// rhs, up to the specified max absolute error bound, including NaN values when
3651// rhs is NaN. The max absolute error bound must be non-negative.
3652inline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(
3653 double rhs, double max_abs_error) {
3654 return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);
3655}
3656
3657// Creates a matcher that matches any float argument approximately
3658// equal to rhs, where two NANs are considered unequal.
3659inline internal::FloatingEqMatcher<float> FloatEq(float rhs) {
3660 return internal::FloatingEqMatcher<float>(rhs, false);
3661}
3662
3663// Creates a matcher that matches any float argument approximately
3664// equal to rhs, including NaN values when rhs is NaN.
3665inline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {
3666 return internal::FloatingEqMatcher<float>(rhs, true);
3667}
3668
3669// Creates a matcher that matches any float argument approximately equal to
3670// rhs, up to the specified max absolute error bound, where two NANs are
3671// considered unequal. The max absolute error bound must be non-negative.
3672inline internal::FloatingEqMatcher<float> FloatNear(
3673 float rhs, float max_abs_error) {
3674 return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);
3675}
3676
3677// Creates a matcher that matches any float argument approximately equal to
3678// rhs, up to the specified max absolute error bound, including NaN values when
3679// rhs is NaN. The max absolute error bound must be non-negative.
3680inline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(
3681 float rhs, float max_abs_error) {
3682 return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);
3683}
3684
3685// Creates a matcher that matches a pointer (raw or smart) that points
3686// to a value that matches inner_matcher.
3687template <typename InnerMatcher>
3688inline internal::PointeeMatcher<InnerMatcher> Pointee(
3689 const InnerMatcher& inner_matcher) {
3690 return internal::PointeeMatcher<InnerMatcher>(inner_matcher);
3691}
3692
3693#if GTEST_HAS_RTTI
3694// Creates a matcher that matches a pointer or reference that matches
3695// inner_matcher when dynamic_cast<To> is applied.
3696// The result of dynamic_cast<To> is forwarded to the inner matcher.
3697// If To is a pointer and the cast fails, the inner matcher will receive NULL.
3698// If To is a reference and the cast fails, this matcher returns false
3699// immediately.
3700template <typename To>
3701inline PolymorphicMatcher<internal::WhenDynamicCastToMatcher<To> >
3702WhenDynamicCastTo(const Matcher<To>& inner_matcher) {
3703 return MakePolymorphicMatcher(
3704 internal::WhenDynamicCastToMatcher<To>(inner_matcher));
3705}
3706#endif // GTEST_HAS_RTTI
3707
3708// Creates a matcher that matches an object whose given field matches
3709// 'matcher'. For example,
3710// Field(&Foo::number, Ge(5))
3711// matches a Foo object x if and only if x.number >= 5.
3712template <typename Class, typename FieldType, typename FieldMatcher>
3713inline PolymorphicMatcher<
3714 internal::FieldMatcher<Class, FieldType> > Field(
3715 FieldType Class::*field, const FieldMatcher& matcher) {
3716 return MakePolymorphicMatcher(
3717 internal::FieldMatcher<Class, FieldType>(
3718 field, MatcherCast<const FieldType&>(matcher)));
3719 // The call to MatcherCast() is required for supporting inner
3720 // matchers of compatible types. For example, it allows
3721 // Field(&Foo::bar, m)
3722 // to compile where bar is an int32 and m is a matcher for int64.
3723}
3724
3725// Same as Field() but also takes the name of the field to provide better error
3726// messages.
3727template <typename Class, typename FieldType, typename FieldMatcher>
3728inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(
3729 const std::string& field_name, FieldType Class::*field,
3730 const FieldMatcher& matcher) {
3731 return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(
3732 field_name, field, MatcherCast<const FieldType&>(matcher)));
3733}
3734
3735// Creates a matcher that matches an object whose given property
3736// matches 'matcher'. For example,
3737// Property(&Foo::str, StartsWith("hi"))
3738// matches a Foo object x if and only if x.str() starts with "hi".
3739template <typename Class, typename PropertyType, typename PropertyMatcher>
3740inline PolymorphicMatcher<internal::PropertyMatcher<
3741 Class, PropertyType, PropertyType (Class::*)() const> >
3742Property(PropertyType (Class::*property)() const,
3743 const PropertyMatcher& matcher) {
3744 return MakePolymorphicMatcher(
3745 internal::PropertyMatcher<Class, PropertyType,
3746 PropertyType (Class::*)() const>(
3747 property, MatcherCast<const PropertyType&>(matcher)));
3748 // The call to MatcherCast() is required for supporting inner
3749 // matchers of compatible types. For example, it allows
3750 // Property(&Foo::bar, m)
3751 // to compile where bar() returns an int32 and m is a matcher for int64.
3752}
3753
3754// Same as Property() above, but also takes the name of the property to provide
3755// better error messages.
3756template <typename Class, typename PropertyType, typename PropertyMatcher>
3757inline PolymorphicMatcher<internal::PropertyMatcher<
3758 Class, PropertyType, PropertyType (Class::*)() const> >
3759Property(const std::string& property_name,
3760 PropertyType (Class::*property)() const,
3761 const PropertyMatcher& matcher) {
3762 return MakePolymorphicMatcher(
3763 internal::PropertyMatcher<Class, PropertyType,
3764 PropertyType (Class::*)() const>(
3765 property_name, property, MatcherCast<const PropertyType&>(matcher)));
3766}
3767
3768// The same as above but for reference-qualified member functions.
3769template <typename Class, typename PropertyType, typename PropertyMatcher>
3770inline PolymorphicMatcher<internal::PropertyMatcher<
3771 Class, PropertyType, PropertyType (Class::*)() const &> >
3772Property(PropertyType (Class::*property)() const &,
3773 const PropertyMatcher& matcher) {
3774 return MakePolymorphicMatcher(
3775 internal::PropertyMatcher<Class, PropertyType,
3776 PropertyType (Class::*)() const&>(
3777 property, MatcherCast<const PropertyType&>(matcher)));
3778}
3779
3780// Three-argument form for reference-qualified member functions.
3781template <typename Class, typename PropertyType, typename PropertyMatcher>
3782inline PolymorphicMatcher<internal::PropertyMatcher<
3783 Class, PropertyType, PropertyType (Class::*)() const &> >
3784Property(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)));
3791}
3792
3793// Creates a matcher that matches an object if and only if the result of
3794// applying a callable to x matches 'matcher'. For example,
3795// ResultOf(f, StartsWith("hi"))
3796// matches a Foo object x if and only if f(x) starts with "hi".
3797// `callable` parameter can be a function, function pointer, or a functor. It is
3798// required to keep no state affecting the results of the calls on it and make
3799// no assumptions about how many calls will be made. Any state it keeps must be
3800// protected from the concurrent access.
3801template <typename Callable, typename InnerMatcher>
3802internal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(
3803 Callable callable, InnerMatcher matcher) {
3804 return internal::ResultOfMatcher<Callable, InnerMatcher>(
3805 std::move(callable), std::move(matcher));
3806}
3807
3808// String matchers.
3809
3810// Matches a string equal to str.
3811inline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrEq(
3812 const std::string& str) {
3813 return MakePolymorphicMatcher(
3814 internal::StrEqualityMatcher<std::string>(str, true, true));
3815}
3816
3817// Matches a string not equal to str.
3818inline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrNe(
3819 const std::string& str) {
3820 return MakePolymorphicMatcher(
3821 internal::StrEqualityMatcher<std::string>(str, false, true));
3822}
3823
3824// Matches a string equal to str, ignoring case.
3825inline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseEq(
3826 const std::string& str) {
3827 return MakePolymorphicMatcher(
3828 internal::StrEqualityMatcher<std::string>(str, true, false));
3829}
3830
3831// Matches a string not equal to str, ignoring case.
3832inline PolymorphicMatcher<internal::StrEqualityMatcher<std::string> > StrCaseNe(
3833 const std::string& str) {
3834 return MakePolymorphicMatcher(
3835 internal::StrEqualityMatcher<std::string>(str, false, false));
3836}
3837
3838// Creates a matcher that matches any string, std::string, or C string
3839// that contains the given substring.
3840inline PolymorphicMatcher<internal::HasSubstrMatcher<std::string> > HasSubstr(
3841 const std::string& substring) {
3842 return MakePolymorphicMatcher(
3843 internal::HasSubstrMatcher<std::string>(substring));
3844}
3845
3846// Matches a string that starts with 'prefix' (case-sensitive).
3847inline PolymorphicMatcher<internal::StartsWithMatcher<std::string> > StartsWith(
3848 const std::string& prefix) {
3849 return MakePolymorphicMatcher(
3850 internal::StartsWithMatcher<std::string>(prefix));
3851}
3852
3853// Matches a string that ends with 'suffix' (case-sensitive).
3854inline PolymorphicMatcher<internal::EndsWithMatcher<std::string> > EndsWith(
3855 const std::string& suffix) {
3856 return MakePolymorphicMatcher(internal::EndsWithMatcher<std::string>(suffix));
3857}
3858
3859#if GTEST_HAS_STD_WSTRING
3860// Wide string matchers.
3861
3862// Matches a string equal to str.
3863inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrEq(
3864 const std::wstring& str) {
3865 return MakePolymorphicMatcher(
3866 internal::StrEqualityMatcher<std::wstring>(str, true, true));
3867}
3868
3869// Matches a string not equal to str.
3870inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrNe(
3871 const std::wstring& str) {
3872 return MakePolymorphicMatcher(
3873 internal::StrEqualityMatcher<std::wstring>(str, false, true));
3874}
3875
3876// Matches a string equal to str, ignoring case.
3877inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
3878StrCaseEq(const std::wstring& str) {
3879 return MakePolymorphicMatcher(
3880 internal::StrEqualityMatcher<std::wstring>(str, true, false));
3881}
3882
3883// Matches a string not equal to str, ignoring case.
3884inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
3885StrCaseNe(const std::wstring& str) {
3886 return MakePolymorphicMatcher(
3887 internal::StrEqualityMatcher<std::wstring>(str, false, false));
3888}
3889
3890// Creates a matcher that matches any ::wstring, std::wstring, or C wide string
3891// that contains the given substring.
3892inline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring> > HasSubstr(
3893 const std::wstring& substring) {
3894 return MakePolymorphicMatcher(
3895 internal::HasSubstrMatcher<std::wstring>(substring));
3896}
3897
3898// Matches a string that starts with 'prefix' (case-sensitive).
3899inline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring> >
3900StartsWith(const std::wstring& prefix) {
3901 return MakePolymorphicMatcher(
3902 internal::StartsWithMatcher<std::wstring>(prefix));
3903}
3904
3905// Matches a string that ends with 'suffix' (case-sensitive).
3906inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(
3907 const std::wstring& suffix) {
3908 return MakePolymorphicMatcher(
3909 internal::EndsWithMatcher<std::wstring>(suffix));
3910}
3911
3912#endif // GTEST_HAS_STD_WSTRING
3913
3914// Creates a polymorphic matcher that matches a 2-tuple where the
3915// first field == the second field.
3916inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }
3917
3918// Creates a polymorphic matcher that matches a 2-tuple where the
3919// first field >= the second field.
3920inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }
3921
3922// Creates a polymorphic matcher that matches a 2-tuple where the
3923// first field > the second field.
3924inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }
3925
3926// Creates a polymorphic matcher that matches a 2-tuple where the
3927// first field <= the second field.
3928inline internal::Le2Matcher Le() { return internal::Le2Matcher(); }
3929
3930// Creates a polymorphic matcher that matches a 2-tuple where the
3931// first field < the second field.
3932inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
3933
3934// Creates a polymorphic matcher that matches a 2-tuple where the
3935// first field != the second field.
3936inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
3937
3938// Creates a polymorphic matcher that matches a 2-tuple where
3939// FloatEq(first field) matches the second field.
3940inline internal::FloatingEq2Matcher<float> FloatEq() {
3941 return internal::FloatingEq2Matcher<float>();
3942}
3943
3944// Creates a polymorphic matcher that matches a 2-tuple where
3945// DoubleEq(first field) matches the second field.
3946inline internal::FloatingEq2Matcher<double> DoubleEq() {
3947 return internal::FloatingEq2Matcher<double>();
3948}
3949
3950// Creates a polymorphic matcher that matches a 2-tuple where
3951// FloatEq(first field) matches the second field with NaN equality.
3952inline internal::FloatingEq2Matcher<float> NanSensitiveFloatEq() {
3953 return internal::FloatingEq2Matcher<float>(true);
3954}
3955
3956// Creates a polymorphic matcher that matches a 2-tuple where
3957// DoubleEq(first field) matches the second field with NaN equality.
3958inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleEq() {
3959 return internal::FloatingEq2Matcher<double>(true);
3960}
3961
3962// Creates a polymorphic matcher that matches a 2-tuple where
3963// FloatNear(first field, max_abs_error) matches the second field.
3964inline internal::FloatingEq2Matcher<float> FloatNear(float max_abs_error) {
3965 return internal::FloatingEq2Matcher<float>(max_abs_error);
3966}
3967
3968// Creates a polymorphic matcher that matches a 2-tuple where
3969// DoubleNear(first field, max_abs_error) matches the second field.
3970inline internal::FloatingEq2Matcher<double> DoubleNear(double max_abs_error) {
3971 return internal::FloatingEq2Matcher<double>(max_abs_error);
3972}
3973
3974// Creates a polymorphic matcher that matches a 2-tuple where
3975// FloatNear(first field, max_abs_error) matches the second field with NaN
3976// equality.
3977inline internal::FloatingEq2Matcher<float> NanSensitiveFloatNear(
3978 float max_abs_error) {
3979 return internal::FloatingEq2Matcher<float>(max_abs_error, true);
3980}
3981
3982// Creates a polymorphic matcher that matches a 2-tuple where
3983// DoubleNear(first field, max_abs_error) matches the second field with NaN
3984// equality.
3985inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleNear(
3986 double max_abs_error) {
3987 return internal::FloatingEq2Matcher<double>(max_abs_error, true);
3988}
3989
3990// Creates a matcher that matches any value of type T that m doesn't
3991// match.
3992template <typename InnerMatcher>
3993inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {
3994 return internal::NotMatcher<InnerMatcher>(m);
3995}
3996
3997// Returns a matcher that matches anything that satisfies the given
3998// predicate. The predicate can be any unary function or functor
3999// whose return type can be implicitly converted to bool.
4000template <typename Predicate>
4001inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >
4002Truly(Predicate pred) {
4003 return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));
4004}
4005
4006// Returns a matcher that matches the container size. The container must
4007// support both size() and size_type which all STL-like containers provide.
4008// Note that the parameter 'size' can be a value of type size_type as well as
4009// matcher. For instance:
4010// EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
4011// EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
4012template <typename SizeMatcher>
4013inline internal::SizeIsMatcher<SizeMatcher>
4014SizeIs(const SizeMatcher& size_matcher) {
4015 return internal::SizeIsMatcher<SizeMatcher>(size_matcher);
4016}
4017
4018// Returns a matcher that matches the distance between the container's begin()
4019// iterator and its end() iterator, i.e. the size of the container. This matcher
4020// can be used instead of SizeIs with containers such as std::forward_list which
4021// do not implement size(). The container must provide const_iterator (with
4022// valid iterator_traits), begin() and end().
4023template <typename DistanceMatcher>
4024inline internal::BeginEndDistanceIsMatcher<DistanceMatcher>
4025BeginEndDistanceIs(const DistanceMatcher& distance_matcher) {
4026 return internal::BeginEndDistanceIsMatcher<DistanceMatcher>(distance_matcher);
4027}
4028
4029// Returns a matcher that matches an equal container.
4030// This matcher behaves like Eq(), but in the event of mismatch lists the
4031// values that are included in one container but not the other. (Duplicate
4032// values and order differences are not explained.)
4033template <typename Container>
4034inline PolymorphicMatcher<internal::ContainerEqMatcher<
4035 typename std::remove_const<Container>::type>>
4036ContainerEq(const Container& rhs) {
4037 // This following line is for working around a bug in MSVC 8.0,
4038 // which causes Container to be a const type sometimes.
4039 typedef typename std::remove_const<Container>::type RawContainer;
4040 return MakePolymorphicMatcher(
4041 internal::ContainerEqMatcher<RawContainer>(rhs));
4042}
4043
4044// Returns a matcher that matches a container that, when sorted using
4045// the given comparator, matches container_matcher.
4046template <typename Comparator, typename ContainerMatcher>
4047inline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>
4048WhenSortedBy(const Comparator& comparator,
4049 const ContainerMatcher& container_matcher) {
4050 return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(
4051 comparator, container_matcher);
4052}
4053
4054// Returns a matcher that matches a container that, when sorted using
4055// the < operator, matches container_matcher.
4056template <typename ContainerMatcher>
4057inline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>
4058WhenSorted(const ContainerMatcher& container_matcher) {
4059 return
4060 internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(
4061 internal::LessComparator(), container_matcher);
4062}
4063
4064// Matches an STL-style container or a native array that contains the
4065// same number of elements as in rhs, where its i-th element and rhs's
4066// i-th element (as a pair) satisfy the given pair matcher, for all i.
4067// TupleMatcher must be able to be safely cast to Matcher<std::tuple<const
4068// T1&, const T2&> >, where T1 and T2 are the types of elements in the
4069// LHS container and the RHS container respectively.
4070template <typename TupleMatcher, typename Container>
4071inline internal::PointwiseMatcher<TupleMatcher,
4072 typename std::remove_const<Container>::type>
4073Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {
4074 // This following line is for working around a bug in MSVC 8.0,
4075 // which causes Container to be a const type sometimes (e.g. when
4076 // rhs is a const int[])..
4077 typedef typename std::remove_const<Container>::type RawContainer;
4078 return internal::PointwiseMatcher<TupleMatcher, RawContainer>(
4079 tuple_matcher, rhs);
4080}
4081
4082
4083// Supports the Pointwise(m, {a, b, c}) syntax.
4084template <typename TupleMatcher, typename T>
4085inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(
4086 const TupleMatcher& tuple_matcher, std::initializer_list<T> rhs) {
4087 return Pointwise(tuple_matcher, std::vector<T>(rhs));
4088}
4089
4090
4091// UnorderedPointwise(pair_matcher, rhs) matches an STL-style
4092// container or a native array that contains the same number of
4093// elements as in rhs, where in some permutation of the container, its
4094// i-th element and rhs's i-th element (as a pair) satisfy the given
4095// pair matcher, for all i. Tuple2Matcher must be able to be safely
4096// cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are
4097// the types of elements in the LHS container and the RHS container
4098// respectively.
4099//
4100// This is like Pointwise(pair_matcher, rhs), except that the element
4101// order doesn't matter.
4102template <typename Tuple2Matcher, typename RhsContainer>
4103inline internal::UnorderedElementsAreArrayMatcher<
4104 typename internal::BoundSecondMatcher<
4105 Tuple2Matcher,
4106 typename internal::StlContainerView<
4107 typename std::remove_const<RhsContainer>::type>::type::value_type>>
4108UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,
4109 const RhsContainer& rhs_container) {
4110 // This following line is for working around a bug in MSVC 8.0,
4111 // which causes RhsContainer to be a const type sometimes (e.g. when
4112 // rhs_container is a const int[]).
4113 typedef typename std::remove_const<RhsContainer>::type RawRhsContainer;
4114
4115 // RhsView allows the same code to handle RhsContainer being a
4116 // STL-style container and it being a native C-style array.
4117 typedef typename internal::StlContainerView<RawRhsContainer> RhsView;
4118 typedef typename RhsView::type RhsStlContainer;
4119 typedef typename RhsStlContainer::value_type Second;
4120 const RhsStlContainer& rhs_stl_container =
4121 RhsView::ConstReference(rhs_container);
4122
4123 // Create a matcher for each element in rhs_container.
4124 ::std::vector<internal::BoundSecondMatcher<Tuple2Matcher, Second> > matchers;
4125 for (typename RhsStlContainer::const_iterator it = rhs_stl_container.begin();
4126 it != rhs_stl_container.end(); ++it) {
4127 matchers.push_back(
4128 internal::MatcherBindSecond(tuple2_matcher, *it));
4129 }
4130
4131 // Delegate the work to UnorderedElementsAreArray().
4132 return UnorderedElementsAreArray(matchers);
4133}
4134
4135
4136// Supports the UnorderedPointwise(m, {a, b, c}) syntax.
4137template <typename Tuple2Matcher, typename T>
4138inline internal::UnorderedElementsAreArrayMatcher<
4139 typename internal::BoundSecondMatcher<Tuple2Matcher, T> >
4140UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,
4141 std::initializer_list<T> rhs) {
4142 return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));
4143}
4144
4145
4146// Matches an STL-style container or a native array that contains at
4147// least one element matching the given value or matcher.
4148//
4149// Examples:
4150// ::std::set<int> page_ids;
4151// page_ids.insert(3);
4152// page_ids.insert(1);
4153// EXPECT_THAT(page_ids, Contains(1));
4154// EXPECT_THAT(page_ids, Contains(Gt(2)));
4155// EXPECT_THAT(page_ids, Not(Contains(4)));
4156//
4157// ::std::map<int, size_t> page_lengths;
4158// page_lengths[1] = 100;
4159// EXPECT_THAT(page_lengths,
4160// Contains(::std::pair<const int, size_t>(1, 100)));
4161//
4162// const char* user_ids[] = { "joe", "mike", "tom" };
4163// EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
4164template <typename M>
4165inline internal::ContainsMatcher<M> Contains(M matcher) {
4166 return internal::ContainsMatcher<M>(matcher);
4167}
4168
4169// IsSupersetOf(iterator_first, iterator_last)
4170// IsSupersetOf(pointer, count)
4171// IsSupersetOf(array)
4172// IsSupersetOf(container)
4173// IsSupersetOf({e1, e2, ..., en})
4174//
4175// IsSupersetOf() verifies that a surjective partial mapping onto a collection
4176// of matchers exists. In other words, a container matches
4177// IsSupersetOf({e1, ..., en}) if and only if there is a permutation
4178// {y1, ..., yn} of some of the container's elements where y1 matches e1,
4179// ..., and yn matches en. Obviously, the size of the container must be >= n
4180// in order to have a match. Examples:
4181//
4182// - {1, 2, 3} matches IsSupersetOf({Ge(3), Ne(0)}), as 3 matches Ge(3) and
4183// 1 matches Ne(0).
4184// - {1, 2} doesn't match IsSupersetOf({Eq(1), Lt(2)}), even though 1 matches
4185// both Eq(1) and Lt(2). The reason is that different matchers must be used
4186// for elements in different slots of the container.
4187// - {1, 1, 2} matches IsSupersetOf({Eq(1), Lt(2)}), as (the first) 1 matches
4188// Eq(1) and (the second) 1 matches Lt(2).
4189// - {1, 2, 3} matches IsSupersetOf(Gt(1), Gt(1)), as 2 matches (the first)
4190// Gt(1) and 3 matches (the second) Gt(1).
4191//
4192// The matchers can be specified as an array, a pointer and count, a container,
4193// an initializer list, or an STL iterator range. In each of these cases, the
4194// underlying matchers can be either values or matchers.
4195
4196template <typename Iter>
4197inline internal::UnorderedElementsAreArrayMatcher<
4198 typename ::std::iterator_traits<Iter>::value_type>
4199IsSupersetOf(Iter first, Iter last) {
4200 typedef typename ::std::iterator_traits<Iter>::value_type T;
4201 return internal::UnorderedElementsAreArrayMatcher<T>(
4202 internal::UnorderedMatcherRequire::Superset, first, last);
4203}
4204
4205template <typename T>
4206inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4207 const T* pointer, size_t count) {
4208 return IsSupersetOf(pointer, pointer + count);
4209}
4210
4211template <typename T, size_t N>
4212inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4213 const T (&array)[N]) {
4214 return IsSupersetOf(array, N);
4215}
4216
4217template <typename Container>
4218inline internal::UnorderedElementsAreArrayMatcher<
4219 typename Container::value_type>
4220IsSupersetOf(const Container& container) {
4221 return IsSupersetOf(container.begin(), container.end());
4222}
4223
4224template <typename T>
4225inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(
4226 ::std::initializer_list<T> xs) {
4227 return IsSupersetOf(xs.begin(), xs.end());
4228}
4229
4230// IsSubsetOf(iterator_first, iterator_last)
4231// IsSubsetOf(pointer, count)
4232// IsSubsetOf(array)
4233// IsSubsetOf(container)
4234// IsSubsetOf({e1, e2, ..., en})
4235//
4236// IsSubsetOf() verifies that an injective mapping onto a collection of matchers
4237// exists. In other words, a container matches IsSubsetOf({e1, ..., en}) if and
4238// only if there is a subset of matchers {m1, ..., mk} which would match the
4239// container using UnorderedElementsAre. Obviously, the size of the container
4240// must be <= n in order to have a match. Examples:
4241//
4242// - {1} matches IsSubsetOf({Gt(0), Lt(0)}), as 1 matches Gt(0).
4243// - {1, -1} matches IsSubsetOf({Lt(0), Gt(0)}), as 1 matches Gt(0) and -1
4244// matches Lt(0).
4245// - {1, 2} doesn't matches IsSubsetOf({Gt(0), Lt(0)}), even though 1 and 2 both
4246// match Gt(0). The reason is that different matchers must be used for
4247// elements in different slots of the container.
4248//
4249// The matchers can be specified as an array, a pointer and count, a container,
4250// an initializer list, or an STL iterator range. In each of these cases, the
4251// underlying matchers can be either values or matchers.
4252
4253template <typename Iter>
4254inline internal::UnorderedElementsAreArrayMatcher<
4255 typename ::std::iterator_traits<Iter>::value_type>
4256IsSubsetOf(Iter first, Iter last) {
4257 typedef typename ::std::iterator_traits<Iter>::value_type T;
4258 return internal::UnorderedElementsAreArrayMatcher<T>(
4259 internal::UnorderedMatcherRequire::Subset, first, last);
4260}
4261
4262template <typename T>
4263inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4264 const T* pointer, size_t count) {
4265 return IsSubsetOf(pointer, pointer + count);
4266}
4267
4268template <typename T, size_t N>
4269inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4270 const T (&array)[N]) {
4271 return IsSubsetOf(array, N);
4272}
4273
4274template <typename Container>
4275inline internal::UnorderedElementsAreArrayMatcher<
4276 typename Container::value_type>
4277IsSubsetOf(const Container& container) {
4278 return IsSubsetOf(container.begin(), container.end());
4279}
4280
4281template <typename T>
4282inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(
4283 ::std::initializer_list<T> xs) {
4284 return IsSubsetOf(xs.begin(), xs.end());
4285}
4286
4287// Matches an STL-style container or a native array that contains only
4288// elements matching the given value or matcher.
4289//
4290// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
4291// the messages are different.
4292//
4293// Examples:
4294// ::std::set<int> page_ids;
4295// // Each(m) matches an empty container, regardless of what m is.
4296// EXPECT_THAT(page_ids, Each(Eq(1)));
4297// EXPECT_THAT(page_ids, Each(Eq(77)));
4298//
4299// page_ids.insert(3);
4300// EXPECT_THAT(page_ids, Each(Gt(0)));
4301// EXPECT_THAT(page_ids, Not(Each(Gt(4))));
4302// page_ids.insert(1);
4303// EXPECT_THAT(page_ids, Not(Each(Lt(2))));
4304//
4305// ::std::map<int, size_t> page_lengths;
4306// page_lengths[1] = 100;
4307// page_lengths[2] = 200;
4308// page_lengths[3] = 300;
4309// EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
4310// EXPECT_THAT(page_lengths, Each(Key(Le(3))));
4311//
4312// const char* user_ids[] = { "joe", "mike", "tom" };
4313// EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
4314template <typename M>
4315inline internal::EachMatcher<M> Each(M matcher) {
4316 return internal::EachMatcher<M>(matcher);
4317}
4318
4319// Key(inner_matcher) matches an std::pair whose 'first' field matches
4320// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
4321// std::map that contains at least one element whose key is >= 5.
4322template <typename M>
4323inline internal::KeyMatcher<M> Key(M inner_matcher) {
4324 return internal::KeyMatcher<M>(inner_matcher);
4325}
4326
4327// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
4328// matches first_matcher and whose 'second' field matches second_matcher. For
4329// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
4330// to match a std::map<int, string> that contains exactly one element whose key
4331// is >= 5 and whose value equals "foo".
4332template <typename FirstMatcher, typename SecondMatcher>
4333inline internal::PairMatcher<FirstMatcher, SecondMatcher>
4334Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) {
4335 return internal::PairMatcher<FirstMatcher, SecondMatcher>(
4336 first_matcher, second_matcher);
4337}
4338
4339// Returns a predicate that is satisfied by anything that matches the
4340// given matcher.
4341template <typename M>
4342inline internal::MatcherAsPredicate<M> Matches(M matcher) {
4343 return internal::MatcherAsPredicate<M>(matcher);
4344}
4345
4346// Returns true if and only if the value matches the matcher.
4347template <typename T, typename M>
4348inline bool Value(const T& value, M matcher) {
4349 return testing::Matches(matcher)(value);
4350}
4351
4352// Matches the value against the given matcher and explains the match
4353// result to listener.
4354template <typename T, typename M>
4355inline bool ExplainMatchResult(
4356 M matcher, const T& value, MatchResultListener* listener) {
4357 return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
4358}
4359
4360// Returns a string representation of the given matcher. Useful for description
4361// strings of matchers defined using MATCHER_P* macros that accept matchers as
4362// their arguments. For example:
4363//
4364// MATCHER_P(XAndYThat, matcher,
4365// "X that " + DescribeMatcher<int>(matcher, negation) +
4366// " and Y that " + DescribeMatcher<double>(matcher, negation)) {
4367// return ExplainMatchResult(matcher, arg.x(), result_listener) &&
4368// ExplainMatchResult(matcher, arg.y(), result_listener);
4369// }
4370template <typename T, typename M>
4371std::string DescribeMatcher(const M& matcher, bool negation = false) {
4372 ::std::stringstream ss;
4373 Matcher<T> monomorphic_matcher = SafeMatcherCast<T>(matcher);
4374 if (negation) {
4375 monomorphic_matcher.DescribeNegationTo(&ss);
4376 } else {
4377 monomorphic_matcher.DescribeTo(&ss);
4378 }
4379 return ss.str();
4380}
4381
4382template <typename... Args>
4383internal::ElementsAreMatcher<
4384 std::tuple<typename std::decay<const Args&>::type...>>
4385ElementsAre(const Args&... matchers) {
4386 return internal::ElementsAreMatcher<
4387 std::tuple<typename std::decay<const Args&>::type...>>(
4388 std::make_tuple(matchers...));
4389}
4390
4391template <typename... Args>
4392internal::UnorderedElementsAreMatcher<
4393 std::tuple<typename std::decay<const Args&>::type...>>
4394UnorderedElementsAre(const Args&... matchers) {
4395 return internal::UnorderedElementsAreMatcher<
4396 std::tuple<typename std::decay<const Args&>::type...>>(
4397 std::make_tuple(matchers...));
4398}
4399
4400// Define variadic matcher versions.
4401template <typename... Args>
4402internal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(
4403 const Args&... matchers) {
4404 return internal::AllOfMatcher<typename std::decay<const Args&>::type...>(
4405 matchers...);
4406}
4407
4408template <typename... Args>
4409internal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(
4410 const Args&... matchers) {
4411 return internal::AnyOfMatcher<typename std::decay<const Args&>::type...>(
4412 matchers...);
4413}
4414
4415// AnyOfArray(array)
4416// AnyOfArray(pointer, count)
4417// AnyOfArray(container)
4418// AnyOfArray({ e1, e2, ..., en })
4419// AnyOfArray(iterator_first, iterator_last)
4420//
4421// AnyOfArray() verifies whether a given value matches any member of a
4422// collection of matchers.
4423//
4424// AllOfArray(array)
4425// AllOfArray(pointer, count)
4426// AllOfArray(container)
4427// AllOfArray({ e1, e2, ..., en })
4428// AllOfArray(iterator_first, iterator_last)
4429//
4430// AllOfArray() verifies whether a given value matches all members of a
4431// collection of matchers.
4432//
4433// The matchers can be specified as an array, a pointer and count, a container,
4434// an initializer list, or an STL iterator range. In each of these cases, the
4435// underlying matchers can be either values or matchers.
4436
4437template <typename Iter>
4438inline internal::AnyOfArrayMatcher<
4439 typename ::std::iterator_traits<Iter>::value_type>
4440AnyOfArray(Iter first, Iter last) {
4441 return internal::AnyOfArrayMatcher<
4442 typename ::std::iterator_traits<Iter>::value_type>(first, last);
4443}
4444
4445template <typename Iter>
4446inline internal::AllOfArrayMatcher<
4447 typename ::std::iterator_traits<Iter>::value_type>
4448AllOfArray(Iter first, Iter last) {
4449 return internal::AllOfArrayMatcher<
4450 typename ::std::iterator_traits<Iter>::value_type>(first, last);
4451}
4452
4453template <typename T>
4454inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T* ptr, size_t count) {
4455 return AnyOfArray(ptr, ptr + count);
4456}
4457
4458template <typename T>
4459inline internal::AllOfArrayMatcher<T> AllOfArray(const T* ptr, size_t count) {
4460 return AllOfArray(ptr, ptr + count);
4461}
4462
4463template <typename T, size_t N>
4464inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T (&array)[N]) {
4465 return AnyOfArray(array, N);
4466}
4467
4468template <typename T, size_t N>
4469inline internal::AllOfArrayMatcher<T> AllOfArray(const T (&array)[N]) {
4470 return AllOfArray(array, N);
4471}
4472
4473template <typename Container>
4474inline internal::AnyOfArrayMatcher<typename Container::value_type> AnyOfArray(
4475 const Container& container) {
4476 return AnyOfArray(container.begin(), container.end());
4477}
4478
4479template <typename Container>
4480inline internal::AllOfArrayMatcher<typename Container::value_type> AllOfArray(
4481 const Container& container) {
4482 return AllOfArray(container.begin(), container.end());
4483}
4484
4485template <typename T>
4486inline internal::AnyOfArrayMatcher<T> AnyOfArray(
4487 ::std::initializer_list<T> xs) {
4488 return AnyOfArray(xs.begin(), xs.end());
4489}
4490
4491template <typename T>
4492inline internal::AllOfArrayMatcher<T> AllOfArray(
4493 ::std::initializer_list<T> xs) {
4494 return AllOfArray(xs.begin(), xs.end());
4495}
4496
4497// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
4498// fields of it matches a_matcher. C++ doesn't support default
4499// arguments for function templates, so we have to overload it.
4500template <size_t... k, typename InnerMatcher>
4501internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...> Args(
4502 InnerMatcher&& matcher) {
4503 return internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...>(
4504 std::forward<InnerMatcher>(matcher));
4505}
4506
4507// AllArgs(m) is a synonym of m. This is useful in
4508//
4509// EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
4510//
4511// which is easier to read than
4512//
4513// EXPECT_CALL(foo, Bar(_, _)).With(Eq());
4514template <typename InnerMatcher>
4515inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
4516
4517// Returns a matcher that matches the value of an optional<> type variable.
4518// The matcher implementation only uses '!arg' and requires that the optional<>
4519// type has a 'value_type' member type and that '*arg' is of type 'value_type'
4520// and is printable using 'PrintToString'. It is compatible with
4521// std::optional/std::experimental::optional.
4522// Note that to compare an optional type variable against nullopt you should
4523// use Eq(nullopt) and not Optional(Eq(nullopt)). The latter implies that the
4524// optional value contains an optional itself.
4525template <typename ValueMatcher>
4526inline internal::OptionalMatcher<ValueMatcher> Optional(
4527 const ValueMatcher& value_matcher) {
4528 return internal::OptionalMatcher<ValueMatcher>(value_matcher);
4529}
4530
4531// Returns a matcher that matches the value of a absl::any type variable.
4532template <typename T>
4533PolymorphicMatcher<internal::any_cast_matcher::AnyCastMatcher<T> > AnyWith(
4534 const Matcher<const T&>& matcher) {
4535 return MakePolymorphicMatcher(
4536 internal::any_cast_matcher::AnyCastMatcher<T>(matcher));
4537}
4538
4539// Returns a matcher that matches the value of a variant<> type variable.
4540// The matcher implementation uses ADL to find the holds_alternative and get
4541// functions.
4542// It is compatible with std::variant.
4543template <typename T>
4544PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(
4545 const Matcher<const T&>& matcher) {
4546 return MakePolymorphicMatcher(
4547 internal::variant_matcher::VariantMatcher<T>(matcher));
4548}
4549
4550// These macros allow using matchers to check values in Google Test
4551// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
4552// succeed if and only if the value matches the matcher. If the assertion
4553// fails, the value and the description of the matcher will be printed.
4554#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
4555 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
4556#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
4557 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
4558
4559} // namespace testing
4560
4561GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046
4562
4563// Include any custom callback matchers added by the local installation.
4564// We must include this header at the end to make sure it can use the
4565// declarations from this file.
4566#include "gmock/internal/custom/gmock-matchers.h"
4567
4568#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
4569