BREAKING CHANGE: drops the old matcher API. See http://code.google.com/p/googlemock/wiki/FrequentlyAskedQuestions for details.
This commit is contained in:
		
							parent
							
								
									99643d2d1f
								
							
						
					
					
						commit
						db22c22782
					
				@ -108,10 +108,7 @@ class MatcherInterface {
 | 
			
		||||
  // Returns true iff the matcher matches x; also explains the match
 | 
			
		||||
  // result to 'listener'.
 | 
			
		||||
  //
 | 
			
		||||
  // You should override this method when defining a new matcher.  For
 | 
			
		||||
  // backward compatibility, we provide a default implementation that
 | 
			
		||||
  // just forwards to the old, deprecated matcher API (Matches() and
 | 
			
		||||
  // ExplainMatchResultTo()).
 | 
			
		||||
  // You should override this method when defining a new matcher.
 | 
			
		||||
  //
 | 
			
		||||
  // It's the responsibility of the caller (Google Mock) to guarantee
 | 
			
		||||
  // that 'listener' is not NULL.  This helps to simplify a matcher's
 | 
			
		||||
@ -119,19 +116,7 @@ class MatcherInterface {
 | 
			
		||||
  // can talk to 'listener' without checking its validity first.
 | 
			
		||||
  // However, in order to implement dummy listeners efficiently,
 | 
			
		||||
  // listener->stream() may be NULL.
 | 
			
		||||
  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
 | 
			
		||||
    const bool match = Matches(x);
 | 
			
		||||
    if (listener->stream() != NULL) {
 | 
			
		||||
      ExplainMatchResultTo(x, listener->stream());
 | 
			
		||||
    }
 | 
			
		||||
    return match;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // DEPRECATED.  This method will be removed.  Override
 | 
			
		||||
  // MatchAndExplain() instead.
 | 
			
		||||
  //
 | 
			
		||||
  // Returns true iff the matcher matches x.
 | 
			
		||||
  virtual bool Matches(T /* x */) const { return false; }
 | 
			
		||||
  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;
 | 
			
		||||
 | 
			
		||||
  // Describes this matcher to an ostream.
 | 
			
		||||
  virtual void DescribeTo(::std::ostream* os) const = 0;
 | 
			
		||||
@ -147,18 +132,6 @@ class MatcherInterface {
 | 
			
		||||
    DescribeTo(os);
 | 
			
		||||
    *os << ")";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // DEPRECATED.  This method will be removed.  Override
 | 
			
		||||
  // MatchAndExplain() instead.
 | 
			
		||||
  //
 | 
			
		||||
  // Explains why x matches, or doesn't match, the matcher.  Override
 | 
			
		||||
  // this to provide any additional information that helps a user
 | 
			
		||||
  // understand the match result.
 | 
			
		||||
  virtual void ExplainMatchResultTo(T /* x */, ::std::ostream* /* os */) const {
 | 
			
		||||
    // By default, nothing more needs to be explained, as Google Mock
 | 
			
		||||
    // has already printed the value of x when this function is
 | 
			
		||||
    // called.
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
@ -254,38 +227,6 @@ class MatcherBase {
 | 
			
		||||
  ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// The default implementation of ExplainMatchResultTo() for
 | 
			
		||||
// polymorphic matchers.
 | 
			
		||||
template <typename PolymorphicMatcherImpl, typename T>
 | 
			
		||||
inline void ExplainMatchResultTo(const PolymorphicMatcherImpl& /* impl */,
 | 
			
		||||
                                 const T& /* x */,
 | 
			
		||||
                                 ::std::ostream* /* os */) {
 | 
			
		||||
  // By default, nothing more needs to be said, as Google Mock already
 | 
			
		||||
  // prints the value of x elsewhere.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The default implementation of MatchAndExplain() for polymorphic
 | 
			
		||||
// matchers.  The type of argument x cannot be const T&, in case
 | 
			
		||||
// impl.Matches() takes a non-const reference.
 | 
			
		||||
template <typename PolymorphicMatcherImpl, typename T>
 | 
			
		||||
inline bool MatchAndExplain(const PolymorphicMatcherImpl& impl,
 | 
			
		||||
                            T& x,
 | 
			
		||||
                            MatchResultListener* listener) {
 | 
			
		||||
  const bool match = impl.Matches(x);
 | 
			
		||||
 | 
			
		||||
  ::std::ostream* const os = listener->stream();
 | 
			
		||||
  if (os != NULL) {
 | 
			
		||||
    using ::testing::internal::ExplainMatchResultTo;
 | 
			
		||||
    // When resolving the following call, both
 | 
			
		||||
    // ::testing::internal::ExplainMatchResultTo() and
 | 
			
		||||
    // foo::ExplainMatchResultTo() are considered, where foo is the
 | 
			
		||||
    // namespace where class PolymorphicMatcherImpl is defined.
 | 
			
		||||
    ExplainMatchResultTo(impl, x, os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return match;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
 | 
			
		||||
@ -350,29 +291,12 @@ class Matcher<internal::string>
 | 
			
		||||
// polymorphic matcher (i.e. a matcher that can match values of more
 | 
			
		||||
// than one type, e.g. Eq(n) and NotNull()).
 | 
			
		||||
//
 | 
			
		||||
// To define a polymorphic matcher in the old, deprecated way, a user
 | 
			
		||||
// first provides an Impl class that has a Matches() method, a
 | 
			
		||||
// DescribeTo() method, and a DescribeNegationTo() method.  The
 | 
			
		||||
// Matches() method is usually a method template (such that it works
 | 
			
		||||
// with multiple types).  Then the user creates the polymorphic
 | 
			
		||||
// matcher using MakePolymorphicMatcher().  To provide additional
 | 
			
		||||
// explanation to the match result, define a FREE function (or
 | 
			
		||||
// function template)
 | 
			
		||||
// To define a polymorphic matcher, a user should provide an Impl
 | 
			
		||||
// class that has a DescribeTo() method and a DescribeNegationTo()
 | 
			
		||||
// method, and define a member function (or member function template)
 | 
			
		||||
//
 | 
			
		||||
//   void ExplainMatchResultTo(const Impl& matcher, const Value& value,
 | 
			
		||||
//                             ::std::ostream* os);
 | 
			
		||||
//
 | 
			
		||||
// in the SAME NAME SPACE where Impl is defined.
 | 
			
		||||
//
 | 
			
		||||
// The new, recommended way to define a polymorphic matcher is to
 | 
			
		||||
// provide an Impl class that has a DescribeTo() method and a
 | 
			
		||||
// DescribeNegationTo() method, and define a FREE function (or
 | 
			
		||||
// function template)
 | 
			
		||||
//
 | 
			
		||||
//   bool MatchAndExplain(const Impl& matcher, const Value& value,
 | 
			
		||||
//                        MatchResultListener* listener);
 | 
			
		||||
//
 | 
			
		||||
// in the SAME NAME SPACE where Impl is defined.
 | 
			
		||||
//   bool MatchAndExplain(const Value& value,
 | 
			
		||||
//                        MatchResultListener* listener) const;
 | 
			
		||||
//
 | 
			
		||||
// See the definition of NotNull() for a complete example.
 | 
			
		||||
template <class Impl>
 | 
			
		||||
@ -408,14 +332,7 @@ class PolymorphicMatcher {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
 | 
			
		||||
      // C++ uses Argument-Dependent Look-up (aka Koenig Look-up) to
 | 
			
		||||
      // resolve the call to MatchAndExplain() here.  This means that
 | 
			
		||||
      // if there's a MatchAndExplain() function defined in the name
 | 
			
		||||
      // space where class Impl is defined, it will be picked by the
 | 
			
		||||
      // compiler as the better match.  Otherwise the default
 | 
			
		||||
      // implementation of it in ::testing::internal will be picked.
 | 
			
		||||
      using ::testing::internal::MatchAndExplain;
 | 
			
		||||
      return MatchAndExplain(impl_, x, listener);
 | 
			
		||||
      return impl_.MatchAndExplain(x, listener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
@ -578,7 +495,7 @@ class TuplePrefix {
 | 
			
		||||
      // We remove the reference in type Value to prevent the
 | 
			
		||||
      // universal printer from printing the address of value, which
 | 
			
		||||
      // isn't interesting to the user most of the time.  The
 | 
			
		||||
      // matcher's ExplainMatchResultTo() method handles the case when
 | 
			
		||||
      // matcher's MatchAndExplain() method handles the case when
 | 
			
		||||
      // the address is interesting.
 | 
			
		||||
      internal::UniversalPrinter<GMOCK_REMOVE_REFERENCE_(Value)>::
 | 
			
		||||
          Print(value, os);
 | 
			
		||||
@ -782,7 +699,10 @@ GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "not equal to");
 | 
			
		||||
class IsNullMatcher {
 | 
			
		||||
 public:
 | 
			
		||||
  template <typename Pointer>
 | 
			
		||||
  bool Matches(const Pointer& p) const { return GetRawPointer(p) == NULL; }
 | 
			
		||||
  bool MatchAndExplain(const Pointer& p,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return GetRawPointer(p) == NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
 | 
			
		||||
  void DescribeNegationTo(::std::ostream* os) const {
 | 
			
		||||
@ -790,18 +710,15 @@ class IsNullMatcher {
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Pointer>
 | 
			
		||||
bool MatchAndExplain(const IsNullMatcher& impl, Pointer& p,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the polymorphic NotNull() matcher, which matches any raw or smart
 | 
			
		||||
// pointer that is not NULL.
 | 
			
		||||
class NotNullMatcher {
 | 
			
		||||
 public:
 | 
			
		||||
  template <typename Pointer>
 | 
			
		||||
  bool Matches(const Pointer& p) const { return GetRawPointer(p) != NULL; }
 | 
			
		||||
  bool MatchAndExplain(const Pointer& p,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return GetRawPointer(p) != NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void DescribeTo(::std::ostream* os) const { *os << "is not NULL"; }
 | 
			
		||||
  void DescribeNegationTo(::std::ostream* os) const {
 | 
			
		||||
@ -809,12 +726,6 @@ class NotNullMatcher {
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Pointer>
 | 
			
		||||
bool MatchAndExplain(const NotNullMatcher& impl, Pointer& p,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Ref(variable) matches any argument that is a reference to
 | 
			
		||||
// 'variable'.  This matcher is polymorphic as it can match any
 | 
			
		||||
// super type of the type of 'variable'.
 | 
			
		||||
@ -860,8 +771,8 @@ class RefMatcher<T&> {
 | 
			
		||||
   public:
 | 
			
		||||
    explicit Impl(Super& x) : object_(x) {}  // NOLINT
 | 
			
		||||
 | 
			
		||||
    // Matches() takes a Super& (as opposed to const Super&) in
 | 
			
		||||
    // order to match the interface MatcherInterface<Super&>.
 | 
			
		||||
    // MatchAndExplain() takes a Super& (as opposed to const Super&)
 | 
			
		||||
    // in order to match the interface MatcherInterface<Super&>.
 | 
			
		||||
    virtual bool MatchAndExplain(
 | 
			
		||||
        Super& x, MatchResultListener* listener) const {
 | 
			
		||||
      *listener << "is located @" << static_cast<const void*>(&x);
 | 
			
		||||
@ -936,14 +847,16 @@ class StrEqualityMatcher {
 | 
			
		||||
 | 
			
		||||
  // When expect_eq_ is true, returns true iff s is equal to string_;
 | 
			
		||||
  // otherwise returns true iff s is not equal to string_.
 | 
			
		||||
  bool Matches(ConstCharPointer s) const {
 | 
			
		||||
  bool MatchAndExplain(ConstCharPointer s,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
    if (s == NULL) {
 | 
			
		||||
      return !expect_eq_;
 | 
			
		||||
    }
 | 
			
		||||
    return Matches(StringType(s));
 | 
			
		||||
    return MatchAndExplain(StringType(s), listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool Matches(const StringType& s) const {
 | 
			
		||||
  bool MatchAndExplain(const StringType& s,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    const bool eq = case_sensitive_ ? s == string_ :
 | 
			
		||||
        CaseInsensitiveStringEquals(s, string_);
 | 
			
		||||
    return expect_eq_ == eq;
 | 
			
		||||
@ -977,12 +890,6 @@ class StrEqualityMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename StringType, typename T>
 | 
			
		||||
bool MatchAndExplain(const StrEqualityMatcher<StringType>& impl, T& s,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the polymorphic HasSubstr(substring) matcher, which
 | 
			
		||||
// can be used as a Matcher<T> as long as T can be converted to a
 | 
			
		||||
// string.
 | 
			
		||||
@ -997,11 +904,13 @@ class HasSubstrMatcher {
 | 
			
		||||
  // These overloaded methods allow HasSubstr(substring) to be used as a
 | 
			
		||||
  // Matcher<T> as long as T can be converted to string.  Returns true
 | 
			
		||||
  // iff s contains substring_ as a substring.
 | 
			
		||||
  bool Matches(ConstCharPointer s) const {
 | 
			
		||||
    return s != NULL && Matches(StringType(s));
 | 
			
		||||
  bool MatchAndExplain(ConstCharPointer s,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
    return s != NULL && MatchAndExplain(StringType(s), listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool Matches(const StringType& s) const {
 | 
			
		||||
  bool MatchAndExplain(const StringType& s,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return s.find(substring_) != StringType::npos;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -1022,12 +931,6 @@ class HasSubstrMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename StringType, typename T>
 | 
			
		||||
bool MatchAndExplain(const HasSubstrMatcher<StringType>& impl, T& s,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the polymorphic StartsWith(substring) matcher, which
 | 
			
		||||
// can be used as a Matcher<T> as long as T can be converted to a
 | 
			
		||||
// string.
 | 
			
		||||
@ -1042,11 +945,13 @@ class StartsWithMatcher {
 | 
			
		||||
  // These overloaded methods allow StartsWith(prefix) to be used as a
 | 
			
		||||
  // Matcher<T> as long as T can be converted to string.  Returns true
 | 
			
		||||
  // iff s starts with prefix_.
 | 
			
		||||
  bool Matches(ConstCharPointer s) const {
 | 
			
		||||
    return s != NULL && Matches(StringType(s));
 | 
			
		||||
  bool MatchAndExplain(ConstCharPointer s,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
    return s != NULL && MatchAndExplain(StringType(s), listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool Matches(const StringType& s) const {
 | 
			
		||||
  bool MatchAndExplain(const StringType& s,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return s.length() >= prefix_.length() &&
 | 
			
		||||
        s.substr(0, prefix_.length()) == prefix_;
 | 
			
		||||
  }
 | 
			
		||||
@ -1067,12 +972,6 @@ class StartsWithMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename StringType, typename T>
 | 
			
		||||
bool MatchAndExplain(const StartsWithMatcher<StringType>& impl, T& s,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the polymorphic EndsWith(substring) matcher, which
 | 
			
		||||
// can be used as a Matcher<T> as long as T can be converted to a
 | 
			
		||||
// string.
 | 
			
		||||
@ -1086,11 +985,13 @@ class EndsWithMatcher {
 | 
			
		||||
  // These overloaded methods allow EndsWith(suffix) to be used as a
 | 
			
		||||
  // Matcher<T> as long as T can be converted to string.  Returns true
 | 
			
		||||
  // iff s ends with suffix_.
 | 
			
		||||
  bool Matches(ConstCharPointer s) const {
 | 
			
		||||
    return s != NULL && Matches(StringType(s));
 | 
			
		||||
  bool MatchAndExplain(ConstCharPointer s,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
    return s != NULL && MatchAndExplain(StringType(s), listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool Matches(const StringType& s) const {
 | 
			
		||||
  bool MatchAndExplain(const StringType& s,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return s.length() >= suffix_.length() &&
 | 
			
		||||
        s.substr(s.length() - suffix_.length()) == suffix_;
 | 
			
		||||
  }
 | 
			
		||||
@ -1111,12 +1012,6 @@ class EndsWithMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename StringType, typename T>
 | 
			
		||||
bool MatchAndExplain(const EndsWithMatcher<StringType>& impl, T& s,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements polymorphic matchers MatchesRegex(regex) and
 | 
			
		||||
// ContainsRegex(regex), which can be used as a Matcher<T> as long as
 | 
			
		||||
// T can be converted to a string.
 | 
			
		||||
@ -1129,11 +1024,13 @@ class MatchesRegexMatcher {
 | 
			
		||||
  // a Matcher<T> as long as T can be converted to string.  Returns
 | 
			
		||||
  // true iff s matches regular expression regex.  When full_match_ is
 | 
			
		||||
  // true, a full match is done; otherwise a partial match is done.
 | 
			
		||||
  bool Matches(const char* s) const {
 | 
			
		||||
    return s != NULL && Matches(internal::string(s));
 | 
			
		||||
  bool MatchAndExplain(const char* s,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
    return s != NULL && MatchAndExplain(internal::string(s), listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool Matches(const internal::string& s) const {
 | 
			
		||||
  bool MatchAndExplain(const internal::string& s,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    return full_match_ ? RE::FullMatch(s, *regex_) :
 | 
			
		||||
        RE::PartialMatch(s, *regex_);
 | 
			
		||||
  }
 | 
			
		||||
@ -1157,12 +1054,6 @@ class MatchesRegexMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
bool MatchAndExplain(const MatchesRegexMatcher& impl, T& s,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements a matcher that compares the two fields of a 2-tuple
 | 
			
		||||
// using one of the ==, <=, <, etc, operators.  The two fields being
 | 
			
		||||
// compared don't have to have the same type.
 | 
			
		||||
@ -1438,7 +1329,8 @@ class TrulyMatcher {
 | 
			
		||||
  // argument is passed by reference as the predicate may be
 | 
			
		||||
  // interested in the address of the argument.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool Matches(T& x) const {  // NOLINT
 | 
			
		||||
  bool MatchAndExplain(T& x,  // NOLINT
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
#if GTEST_OS_WINDOWS
 | 
			
		||||
    // MSVC warns about converting a value into bool (warning 4800).
 | 
			
		||||
#pragma warning(push)          // Saves the current warning state.
 | 
			
		||||
@ -1464,12 +1356,6 @@ class TrulyMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(TrulyMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Predicate, typename T>
 | 
			
		||||
bool MatchAndExplain(const TrulyMatcher<Predicate>& impl, T& x,
 | 
			
		||||
                     MatchResultListener* /* listener */) {
 | 
			
		||||
  return impl.Matches(x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Used for implementing Matches(matcher), which turns a matcher into
 | 
			
		||||
// a predicate.
 | 
			
		||||
template <typename M>
 | 
			
		||||
@ -1744,11 +1630,20 @@ class FieldMatcher {
 | 
			
		||||
    matcher_.DescribeNegationTo(os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // The first argument of MatchAndExplain() is needed to help
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
 | 
			
		||||
    return MatchAndExplainImpl(
 | 
			
		||||
        typename ::testing::internal::
 | 
			
		||||
            is_pointer<GMOCK_REMOVE_CONST_(T)>::type(),
 | 
			
		||||
        value, listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // The first argument of MatchAndExplainImpl() is needed to help
 | 
			
		||||
  // Symbian's C++ compiler choose which overload to use.  Its type is
 | 
			
		||||
  // true_type iff the Field() matcher is used to match a pointer.
 | 
			
		||||
  bool MatchAndExplain(false_type /* is_not_pointer */, const Class& obj,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
 | 
			
		||||
                           MatchResultListener* listener) const {
 | 
			
		||||
    StringMatchResultListener inner_listener;
 | 
			
		||||
    const bool match = matcher_.MatchAndExplain(obj.*field_, &inner_listener);
 | 
			
		||||
    const internal::string s = inner_listener.str();
 | 
			
		||||
@ -1758,32 +1653,23 @@ class FieldMatcher {
 | 
			
		||||
    return match;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool MatchAndExplain(true_type /* is_pointer */, const Class* p,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
 | 
			
		||||
                           MatchResultListener* listener) const {
 | 
			
		||||
    if (p == NULL)
 | 
			
		||||
      return false;
 | 
			
		||||
 | 
			
		||||
    // Since *p has a field, it must be a class/struct/union type and
 | 
			
		||||
    // thus cannot be a pointer.  Therefore we pass false_type() as
 | 
			
		||||
    // the first argument.
 | 
			
		||||
    return MatchAndExplain(false_type(), *p, listener);
 | 
			
		||||
    return MatchAndExplainImpl(false_type(), *p, listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  const FieldType Class::*field_;
 | 
			
		||||
  const Matcher<const FieldType&> matcher_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(FieldMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Class, typename FieldType, typename T>
 | 
			
		||||
bool MatchAndExplain(const FieldMatcher<Class, FieldType>& matcher,
 | 
			
		||||
                     T& value, MatchResultListener* listener) {
 | 
			
		||||
  return matcher.MatchAndExplain(
 | 
			
		||||
      typename ::testing::internal::is_pointer<GMOCK_REMOVE_CONST_(T)>::type(),
 | 
			
		||||
      value, listener);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements the Property() matcher for matching a property
 | 
			
		||||
// (i.e. return value of a getter method) of an object.
 | 
			
		||||
template <typename Class, typename PropertyType>
 | 
			
		||||
@ -1809,11 +1695,20 @@ class PropertyMatcher {
 | 
			
		||||
    matcher_.DescribeNegationTo(os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // The first argument of MatchAndExplain() is needed to help
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool MatchAndExplain(const T&value, MatchResultListener* listener) const {
 | 
			
		||||
    return MatchAndExplainImpl(
 | 
			
		||||
        typename ::testing::internal::
 | 
			
		||||
            is_pointer<GMOCK_REMOVE_CONST_(T)>::type(),
 | 
			
		||||
        value, listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // The first argument of MatchAndExplainImpl() is needed to help
 | 
			
		||||
  // Symbian's C++ compiler choose which overload to use.  Its type is
 | 
			
		||||
  // true_type iff the Property() matcher is used to match a pointer.
 | 
			
		||||
  bool MatchAndExplain(false_type /* is_not_pointer */, const Class& obj,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
 | 
			
		||||
                           MatchResultListener* listener) const {
 | 
			
		||||
    StringMatchResultListener inner_listener;
 | 
			
		||||
    const bool match = matcher_.MatchAndExplain((obj.*property_)(),
 | 
			
		||||
                                                &inner_listener);
 | 
			
		||||
@ -1824,32 +1719,23 @@ class PropertyMatcher {
 | 
			
		||||
    return match;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool MatchAndExplain(true_type /* is_pointer */, const Class* p,
 | 
			
		||||
                       MatchResultListener* listener) const {
 | 
			
		||||
  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
 | 
			
		||||
                           MatchResultListener* listener) const {
 | 
			
		||||
    if (p == NULL)
 | 
			
		||||
      return false;
 | 
			
		||||
 | 
			
		||||
    // Since *p has a property method, it must be a class/struct/union
 | 
			
		||||
    // type and thus cannot be a pointer.  Therefore we pass
 | 
			
		||||
    // false_type() as the first argument.
 | 
			
		||||
    return MatchAndExplain(false_type(), *p, listener);
 | 
			
		||||
    return MatchAndExplainImpl(false_type(), *p, listener);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  PropertyType (Class::*property_)() const;
 | 
			
		||||
  const Matcher<RefToConstProperty> matcher_;
 | 
			
		||||
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(PropertyMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename Class,  typename PropertyType, typename T>
 | 
			
		||||
bool MatchAndExplain(const PropertyMatcher<Class, PropertyType>& matcher,
 | 
			
		||||
                     T& value, MatchResultListener* listener) {
 | 
			
		||||
  return matcher.MatchAndExplain(
 | 
			
		||||
      typename ::testing::internal::is_pointer<GMOCK_REMOVE_CONST_(T)>::type(),
 | 
			
		||||
      value, listener);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type traits specifying various features of different functors for ResultOf.
 | 
			
		||||
// The default template specifies features for functor objects.
 | 
			
		||||
// Functor classes have to typedef argument_type and result_type
 | 
			
		||||
@ -1947,13 +1833,6 @@ class ResultOfMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Explains the result of matching a value against a functor matcher.
 | 
			
		||||
template <typename T, typename Callable>
 | 
			
		||||
void ExplainMatchResultTo(const ResultOfMatcher<Callable>& matcher,
 | 
			
		||||
                          T obj, ::std::ostream* os) {
 | 
			
		||||
  matcher.ExplainMatchResultTo(obj, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements an equality matcher for any STL-style container whose elements
 | 
			
		||||
// support ==. This matcher is like Eq(), but its failure explanations provide
 | 
			
		||||
// more detailed information that is useful when the container is used as a set.
 | 
			
		||||
@ -2048,13 +1927,6 @@ class ContainerEqMatcher {
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename LhsContainer, typename Container>
 | 
			
		||||
bool MatchAndExplain(const ContainerEqMatcher<Container>& matcher,
 | 
			
		||||
                     LhsContainer& lhs,
 | 
			
		||||
                     MatchResultListener* listener) {
 | 
			
		||||
  return matcher.MatchAndExplain(lhs, listener);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implements Contains(element_matcher) for the given argument type Container.
 | 
			
		||||
template <typename Container>
 | 
			
		||||
class ContainsMatcherImpl : public MatcherInterface<Container> {
 | 
			
		||||
 | 
			
		||||
@ -68,6 +68,7 @@ using testing::Lt;
 | 
			
		||||
using testing::MakeMatcher;
 | 
			
		||||
using testing::Matcher;
 | 
			
		||||
using testing::MatcherInterface;
 | 
			
		||||
using testing::MatchResultListener;
 | 
			
		||||
using testing::Ne;
 | 
			
		||||
using testing::Not;
 | 
			
		||||
using testing::Pointee;
 | 
			
		||||
@ -217,21 +218,22 @@ class GreaterThanMatcher : public MatcherInterface<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
 | 
			
		||||
 | 
			
		||||
  virtual bool Matches(int lhs) const { return lhs > rhs_; }
 | 
			
		||||
 | 
			
		||||
  virtual void DescribeTo(::std::ostream* os) const {
 | 
			
		||||
    *os << "is greater than " << rhs_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void ExplainMatchResultTo(int lhs, ::std::ostream* os) const {
 | 
			
		||||
  virtual bool MatchAndExplain(int lhs,
 | 
			
		||||
                               MatchResultListener* listener) const {
 | 
			
		||||
    const int diff = lhs - rhs_;
 | 
			
		||||
    if (diff > 0) {
 | 
			
		||||
      *os << "is " << diff << " more than " << rhs_;
 | 
			
		||||
      *listener << "is " << diff << " more than " << rhs_;
 | 
			
		||||
    } else if (diff == 0) {
 | 
			
		||||
      *os << "is the same as " << rhs_;
 | 
			
		||||
      *listener << "is the same as " << rhs_;
 | 
			
		||||
    } else {
 | 
			
		||||
      *os << "is " << -diff << " less than " << rhs_;
 | 
			
		||||
      *listener << "is " << -diff << " less than " << rhs_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return lhs > rhs_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
 | 
			
		||||
@ -135,21 +135,22 @@ class GreaterThanMatcher : public MatcherInterface<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
 | 
			
		||||
 | 
			
		||||
  virtual bool Matches(int lhs) const { return lhs > rhs_; }
 | 
			
		||||
 | 
			
		||||
  virtual void DescribeTo(::std::ostream* os) const {
 | 
			
		||||
    *os << "is greater than " << rhs_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void ExplainMatchResultTo(int lhs, ::std::ostream* os) const {
 | 
			
		||||
  virtual bool MatchAndExplain(int lhs,
 | 
			
		||||
                               MatchResultListener* listener) const {
 | 
			
		||||
    const int diff = lhs - rhs_;
 | 
			
		||||
    if (diff > 0) {
 | 
			
		||||
      *os << "is " << diff << " more than " << rhs_;
 | 
			
		||||
      *listener << "is " << diff << " more than " << rhs_;
 | 
			
		||||
    } else if (diff == 0) {
 | 
			
		||||
      *os << "is the same as " << rhs_;
 | 
			
		||||
      *listener << "is the same as " << rhs_;
 | 
			
		||||
    } else {
 | 
			
		||||
      *os << "is " << -diff << " less than " << rhs_;
 | 
			
		||||
      *listener << "is " << -diff << " less than " << rhs_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return lhs > rhs_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
@ -188,7 +189,10 @@ string Explain(const MatcherType& m, const Value& x) {
 | 
			
		||||
// change.
 | 
			
		||||
class EvenMatcherImpl : public MatcherInterface<int> {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual bool Matches(int x) const { return x % 2 == 0; }
 | 
			
		||||
  virtual bool MatchAndExplain(int x,
 | 
			
		||||
                               MatchResultListener* /* listener */) const {
 | 
			
		||||
    return x % 2 == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void DescribeTo(::std::ostream* os) const {
 | 
			
		||||
    *os << "is an even number";
 | 
			
		||||
@ -330,7 +334,8 @@ const int bar = 1;
 | 
			
		||||
class ReferencesBarOrIsZeroImpl {
 | 
			
		||||
 public:
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool Matches(const T& x) const {
 | 
			
		||||
  bool MatchAndExplain(const T& x,
 | 
			
		||||
                       MatchResultListener* /* listener */) const {
 | 
			
		||||
    const void* p = &x;
 | 
			
		||||
    return p == &bar || x == 0;
 | 
			
		||||
  }
 | 
			
		||||
@ -373,20 +378,19 @@ class PolymorphicIsEvenImpl {
 | 
			
		||||
  void DescribeNegationTo(::std::ostream* os) const {
 | 
			
		||||
    *os << "is odd";
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
bool MatchAndExplain(const PolymorphicIsEvenImpl& /* impl */,
 | 
			
		||||
                     T x, MatchResultListener* listener) {
 | 
			
		||||
  // Verifies that we can stream to the listener directly.
 | 
			
		||||
  *listener << "% " << 2;
 | 
			
		||||
  if (listener->stream() != NULL) {
 | 
			
		||||
    // Verifies that we can stream to the listener's underlying stream
 | 
			
		||||
    // too.
 | 
			
		||||
    *listener->stream() << " == " << (x % 2);
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
 | 
			
		||||
    // Verifies that we can stream to the listener directly.
 | 
			
		||||
    *listener << "% " << 2;
 | 
			
		||||
    if (listener->stream() != NULL) {
 | 
			
		||||
      // Verifies that we can stream to the listener's underlying stream
 | 
			
		||||
      // too.
 | 
			
		||||
      *listener->stream() << " == " << (x % 2);
 | 
			
		||||
    }
 | 
			
		||||
    return (x % 2) == 0;
 | 
			
		||||
  }
 | 
			
		||||
  return (x % 2) == 0;
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
PolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {
 | 
			
		||||
  return MakePolymorphicMatcher(PolymorphicIsEvenImpl());
 | 
			
		||||
@ -2135,8 +2139,8 @@ TEST(MatcherAssertionTest, WorksForByRefArguments) {
 | 
			
		||||
// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
 | 
			
		||||
// Symbian compiler: it tries to compile
 | 
			
		||||
// template<T, U> class MatcherCastImpl { ...
 | 
			
		||||
//   virtual bool Matches(T x) const {
 | 
			
		||||
//     return source_matcher_.Matches(static_cast<U>(x));
 | 
			
		||||
//   virtual bool MatchAndExplain(T x, ...) const {
 | 
			
		||||
//     return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
 | 
			
		||||
// with U == string and T == const char*
 | 
			
		||||
// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
 | 
			
		||||
// the compiler silently crashes with no output.
 | 
			
		||||
@ -3075,8 +3079,11 @@ class DivisibleByImpl {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
 | 
			
		||||
 | 
			
		||||
  // For testing using ExplainMatchResultTo() with polymorphic matchers.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  bool Matches(const T& n) const {
 | 
			
		||||
  bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
 | 
			
		||||
    *listener << "is " << (n % divider_) << " modulo "
 | 
			
		||||
              << divider_;
 | 
			
		||||
    return (n % divider_) == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -3095,14 +3102,6 @@ class DivisibleByImpl {
 | 
			
		||||
  int divider_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// For testing using ExplainMatchResultTo() with polymorphic matchers.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void ExplainMatchResultTo(const DivisibleByImpl& impl, const T& n,
 | 
			
		||||
                          ::std::ostream* os) {
 | 
			
		||||
  *os << "is " << (n % impl.divider()) << " modulo "
 | 
			
		||||
      << impl.divider();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
 | 
			
		||||
  return MakePolymorphicMatcher(DivisibleByImpl(n));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user