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