Converts more matchers to the new API; fixes MatchAndExplain() for polymorphic matchers to allow non-const reference arguments.
This commit is contained in:
		
							parent
							
								
									821133180c
								
							
						
					
					
						commit
						e122e457a6
					
				| @ -265,10 +265,11 @@ inline void ExplainMatchResultTo(const PolymorphicMatcherImpl& /* impl */, | ||||
| } | ||||
| 
 | ||||
| // The default implementation of MatchAndExplain() for polymorphic
 | ||||
| // matchers.
 | ||||
| // 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, | ||||
|                             const T& x, | ||||
|                             T& x, | ||||
|                             MatchResultListener* listener) { | ||||
|   const bool match = impl.Matches(x); | ||||
| 
 | ||||
| @ -789,6 +790,12 @@ 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 { | ||||
| @ -802,6 +809,12 @@ 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'.
 | ||||
| @ -964,6 +977,12 @@ 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.
 | ||||
| @ -1003,6 +1022,12 @@ 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,6 +1067,12 @@ 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.
 | ||||
| @ -1080,6 +1111,12 @@ 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); | ||||
| } | ||||
| 
 | ||||
| #if GMOCK_HAS_REGEX | ||||
| 
 | ||||
| // Implements polymorphic matchers MatchesRegex(regex) and
 | ||||
| @ -1122,6 +1159,12 @@ class MatchesRegexMatcher { | ||||
|   GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); | ||||
| }; | ||||
| 
 | ||||
| template <typename T> | ||||
| bool MatchAndExplain(const MatchesRegexMatcher& impl, T& s, | ||||
|                      MatchResultListener* /* listener */) { | ||||
|   return impl.Matches(s); | ||||
| } | ||||
| 
 | ||||
| #endif  // GMOCK_HAS_REGEX
 | ||||
| 
 | ||||
| // Implements a matcher that compares the two fields of a 2-tuple
 | ||||
| @ -1425,6 +1468,12 @@ 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> | ||||
| @ -1733,7 +1782,7 @@ class FieldMatcher { | ||||
| 
 | ||||
| template <typename Class, typename FieldType, typename T> | ||||
| bool MatchAndExplain(const FieldMatcher<Class, FieldType>& matcher, | ||||
|                      const T& value, MatchResultListener* listener) { | ||||
|                      T& value, MatchResultListener* listener) { | ||||
|   return matcher.MatchAndExplain( | ||||
|       typename ::testing::internal::is_pointer<T>::type(), value, listener); | ||||
| } | ||||
| @ -1798,7 +1847,7 @@ class PropertyMatcher { | ||||
| 
 | ||||
| template <typename Class,  typename PropertyType, typename T> | ||||
| bool MatchAndExplain(const PropertyMatcher<Class, PropertyType>& matcher, | ||||
|                      const T& value, MatchResultListener* listener) { | ||||
|                      T& value, MatchResultListener* listener) { | ||||
|   return matcher.MatchAndExplain( | ||||
|       typename ::testing::internal::is_pointer<T>::type(), value, listener); | ||||
| } | ||||
| @ -1933,15 +1982,6 @@ class ContainerEqMatcher { | ||||
|         GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(Container))>(); | ||||
|   } | ||||
| 
 | ||||
|   template <typename LhsContainer> | ||||
|   bool Matches(const LhsContainer& lhs) const { | ||||
|     // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
 | ||||
|     // that causes LhsContainer to be a const type sometimes.
 | ||||
|     typedef internal::StlContainerView<GMOCK_REMOVE_CONST_(LhsContainer)> | ||||
|         LhsView; | ||||
|     StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); | ||||
|     return lhs_stl_container == rhs_; | ||||
|   } | ||||
|   void DescribeTo(::std::ostream* os) const { | ||||
|     *os << "equals "; | ||||
|     UniversalPrinter<StlContainer>::Print(rhs_, os); | ||||
| @ -1952,48 +1992,55 @@ class ContainerEqMatcher { | ||||
|   } | ||||
| 
 | ||||
|   template <typename LhsContainer> | ||||
|   void ExplainMatchResultTo(const LhsContainer& lhs, | ||||
|                             ::std::ostream* os) const { | ||||
|   bool MatchAndExplain(const LhsContainer& lhs, | ||||
|                        MatchResultListener* listener) const { | ||||
|     // GMOCK_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
 | ||||
|     // that causes LhsContainer to be a const type sometimes.
 | ||||
|     typedef internal::StlContainerView<GMOCK_REMOVE_CONST_(LhsContainer)> | ||||
|         LhsView; | ||||
|     typedef typename LhsView::type LhsStlContainer; | ||||
|     StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); | ||||
|     if (lhs_stl_container == rhs_) | ||||
|       return true; | ||||
| 
 | ||||
|     // Something is different. Check for missing values first.
 | ||||
|     bool printed_header = false; | ||||
|     for (typename LhsStlContainer::const_iterator it = | ||||
|              lhs_stl_container.begin(); | ||||
|          it != lhs_stl_container.end(); ++it) { | ||||
|       if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == | ||||
|           rhs_.end()) { | ||||
|         if (printed_header) { | ||||
|           *os << ", "; | ||||
|         } else { | ||||
|           *os << "Only in actual: "; | ||||
|           printed_header = true; | ||||
|     ::std::ostream* const os = listener->stream(); | ||||
|     if (os != NULL) { | ||||
|       // Something is different. Check for missing values first.
 | ||||
|       bool printed_header = false; | ||||
|       for (typename LhsStlContainer::const_iterator it = | ||||
|                lhs_stl_container.begin(); | ||||
|            it != lhs_stl_container.end(); ++it) { | ||||
|         if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == | ||||
|             rhs_.end()) { | ||||
|           if (printed_header) { | ||||
|             *os << ", "; | ||||
|           } else { | ||||
|             *os << "Only in actual: "; | ||||
|             printed_header = true; | ||||
|           } | ||||
|           UniversalPrinter<typename LhsStlContainer::value_type>::Print(*it, os); | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       // Now check for extra values.
 | ||||
|       bool printed_header2 = false; | ||||
|       for (typename StlContainer::const_iterator it = rhs_.begin(); | ||||
|            it != rhs_.end(); ++it) { | ||||
|         if (internal::ArrayAwareFind( | ||||
|                 lhs_stl_container.begin(), lhs_stl_container.end(), *it) == | ||||
|             lhs_stl_container.end()) { | ||||
|           if (printed_header2) { | ||||
|             *os << ", "; | ||||
|           } else { | ||||
|             *os << (printed_header ? "; not" : "Not") << " in actual: "; | ||||
|             printed_header2 = true; | ||||
|           } | ||||
|           UniversalPrinter<typename StlContainer::value_type>::Print(*it, os); | ||||
|         } | ||||
|         UniversalPrinter<typename LhsStlContainer::value_type>::Print(*it, os); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     // Now check for extra values.
 | ||||
|     bool printed_header2 = false; | ||||
|     for (typename StlContainer::const_iterator it = rhs_.begin(); | ||||
|          it != rhs_.end(); ++it) { | ||||
|       if (internal::ArrayAwareFind( | ||||
|               lhs_stl_container.begin(), lhs_stl_container.end(), *it) == | ||||
|           lhs_stl_container.end()) { | ||||
|         if (printed_header2) { | ||||
|           *os << ", "; | ||||
|         } else { | ||||
|           *os << (printed_header ? "; not" : "Not") << " in actual: "; | ||||
|           printed_header2 = true; | ||||
|         } | ||||
|         UniversalPrinter<typename StlContainer::value_type>::Print(*it, os); | ||||
|       } | ||||
|     } | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
| @ -2003,10 +2050,10 @@ class ContainerEqMatcher { | ||||
| }; | ||||
| 
 | ||||
| template <typename LhsContainer, typename Container> | ||||
| void ExplainMatchResultTo(const ContainerEqMatcher<Container>& matcher, | ||||
|                           const LhsContainer& lhs, | ||||
|                           ::std::ostream* os) { | ||||
|   matcher.ExplainMatchResultTo(lhs, os); | ||||
| 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.
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user