Merging gmock-matchers.h -2
This commit is contained in:
		@@ -651,6 +651,22 @@ class MatcherCastImpl<T, Matcher<U> > {
 | 
			
		||||
 | 
			
		||||
    // We delegate the matching logic to the source matcher.
 | 
			
		||||
    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
 | 
			
		||||
#if GTEST_LANG_CXX11
 | 
			
		||||
      using FromType = typename std::remove_cv<typename std::remove_pointer<
 | 
			
		||||
          typename std::remove_reference<T>::type>::type>::type;
 | 
			
		||||
      using ToType = typename std::remove_cv<typename std::remove_pointer<
 | 
			
		||||
          typename std::remove_reference<U>::type>::type>::type;
 | 
			
		||||
      // Do not allow implicitly converting base*/& to derived*/&.
 | 
			
		||||
      static_assert(
 | 
			
		||||
          // Do not trigger if only one of them is a pointer. That implies a
 | 
			
		||||
          // regular conversion and not a down_cast.
 | 
			
		||||
          (std::is_pointer<typename std::remove_reference<T>::type>::value !=
 | 
			
		||||
           std::is_pointer<typename std::remove_reference<U>::type>::value) ||
 | 
			
		||||
              std::is_same<FromType, ToType>::value ||
 | 
			
		||||
              !std::is_base_of<FromType, ToType>::value,
 | 
			
		||||
          "Can't implicitly convert from <base> to <derived>");
 | 
			
		||||
#endif  // GTEST_LANG_CXX11
 | 
			
		||||
 | 
			
		||||
      return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -3830,6 +3846,61 @@ GTEST_API_ std::string FormatMatcherDescription(bool negation,
 | 
			
		||||
                                                const char* matcher_name,
 | 
			
		||||
                                                const Strings& param_values);
 | 
			
		||||
 | 
			
		||||
// Implements a matcher that checks the value of a optional<> type variable.
 | 
			
		||||
template <typename ValueMatcher>
 | 
			
		||||
class OptionalMatcher {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit OptionalMatcher(const ValueMatcher& value_matcher)
 | 
			
		||||
      : value_matcher_(value_matcher) {}
 | 
			
		||||
 | 
			
		||||
  template <typename Optional>
 | 
			
		||||
  operator Matcher<Optional>() const {
 | 
			
		||||
    return MakeMatcher(new Impl<Optional>(value_matcher_));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename Optional>
 | 
			
		||||
  class Impl : public MatcherInterface<Optional> {
 | 
			
		||||
   public:
 | 
			
		||||
    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Optional) OptionalView;
 | 
			
		||||
    typedef typename OptionalView::value_type ValueType;
 | 
			
		||||
    explicit Impl(const ValueMatcher& value_matcher)
 | 
			
		||||
        : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}
 | 
			
		||||
 | 
			
		||||
    virtual void DescribeTo(::std::ostream* os) const {
 | 
			
		||||
      *os << "value ";
 | 
			
		||||
      value_matcher_.DescribeTo(os);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void DescribeNegationTo(::std::ostream* os) const {
 | 
			
		||||
      *os << "value ";
 | 
			
		||||
      value_matcher_.DescribeNegationTo(os);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual bool MatchAndExplain(Optional optional,
 | 
			
		||||
                                 MatchResultListener* listener) const {
 | 
			
		||||
      if (!optional) {
 | 
			
		||||
        *listener << "which is not engaged";
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
      const ValueType& value = *optional;
 | 
			
		||||
      StringMatchResultListener value_listener;
 | 
			
		||||
      const bool match = value_matcher_.MatchAndExplain(value, &value_listener);
 | 
			
		||||
      *listener << "whose value " << PrintToString(value)
 | 
			
		||||
                << (match ? " matches" : " doesn't match");
 | 
			
		||||
      PrintIfNotEmpty(value_listener.str(), listener->stream());
 | 
			
		||||
      return match;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    const Matcher<ValueType> value_matcher_;
 | 
			
		||||
    GTEST_DISALLOW_ASSIGN_(Impl);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  const ValueMatcher value_matcher_;
 | 
			
		||||
  GTEST_DISALLOW_ASSIGN_(OptionalMatcher);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace variant_matcher {
 | 
			
		||||
// Overloads to allow VariantMatcher to do proper ADL lookup.
 | 
			
		||||
template <typename T>
 | 
			
		||||
@@ -4246,6 +4317,16 @@ inline PolymorphicMatcher<
 | 
			
		||||
  // to compile where bar is an int32 and m is a matcher for int64.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Same as Field() but also takes the name of the field to provide better error
 | 
			
		||||
// messages.
 | 
			
		||||
template <typename Class, typename FieldType, typename FieldMatcher>
 | 
			
		||||
inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(
 | 
			
		||||
    const std::string& field_name, FieldType Class::*field,
 | 
			
		||||
    const FieldMatcher& matcher) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::FieldMatcher<Class, FieldType>(
 | 
			
		||||
      field_name, field, MatcherCast<const FieldType&>(matcher)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a matcher that matches an object whose given property
 | 
			
		||||
// matches 'matcher'.  For example,
 | 
			
		||||
//   Property(&Foo::str, StartsWith("hi"))
 | 
			
		||||
@@ -4294,6 +4375,7 @@ Property(PropertyType (Class::*property)() const &,
 | 
			
		||||
//     concurrent access.
 | 
			
		||||
//   * If it is a function object, it has to define type result_type.
 | 
			
		||||
//     We recommend deriving your functor classes from std::unary_function.
 | 
			
		||||
//
 | 
			
		||||
template <typename Callable, typename ResultOfMatcher>
 | 
			
		||||
internal::ResultOfMatcher<Callable> ResultOf(
 | 
			
		||||
    Callable callable, const ResultOfMatcher& matcher) {
 | 
			
		||||
@@ -4384,53 +4466,53 @@ inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
 | 
			
		||||
// Wide string matchers.
 | 
			
		||||
 | 
			
		||||
// Matches a string equal to str.
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
 | 
			
		||||
    StrEq(const internal::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
 | 
			
		||||
      str, true, true));
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrEq(
 | 
			
		||||
    const std::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::StrEqualityMatcher<std::wstring>(str, true, true));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Matches a string not equal to str.
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
 | 
			
		||||
    StrNe(const internal::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
 | 
			
		||||
      str, false, true));
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrNe(
 | 
			
		||||
    const std::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::StrEqualityMatcher<std::wstring>(str, false, true));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Matches a string equal to str, ignoring case.
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
 | 
			
		||||
    StrCaseEq(const internal::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
 | 
			
		||||
      str, true, false));
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
 | 
			
		||||
StrCaseEq(const std::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::StrEqualityMatcher<std::wstring>(str, true, false));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Matches a string not equal to str, ignoring case.
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
 | 
			
		||||
    StrCaseNe(const internal::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
 | 
			
		||||
      str, false, false));
 | 
			
		||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
 | 
			
		||||
StrCaseNe(const std::wstring& str) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::StrEqualityMatcher<std::wstring>(str, false, false));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a matcher that matches any wstring, std::wstring, or C wide string
 | 
			
		||||
// Creates a matcher that matches any ::wstring, std::wstring, or C wide string
 | 
			
		||||
// that contains the given substring.
 | 
			
		||||
inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> >
 | 
			
		||||
    HasSubstr(const internal::wstring& substring) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>(
 | 
			
		||||
      substring));
 | 
			
		||||
inline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring> > HasSubstr(
 | 
			
		||||
    const std::wstring& substring) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::HasSubstrMatcher<std::wstring>(substring));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Matches a string that starts with 'prefix' (case-sensitive).
 | 
			
		||||
inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> >
 | 
			
		||||
    StartsWith(const internal::wstring& prefix) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>(
 | 
			
		||||
      prefix));
 | 
			
		||||
inline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring> >
 | 
			
		||||
StartsWith(const std::wstring& prefix) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::StartsWithMatcher<std::wstring>(prefix));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Matches a string that ends with 'suffix' (case-sensitive).
 | 
			
		||||
inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> >
 | 
			
		||||
    EndsWith(const internal::wstring& suffix) {
 | 
			
		||||
  return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>(
 | 
			
		||||
      suffix));
 | 
			
		||||
inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(
 | 
			
		||||
    const std::wstring& suffix) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::EndsWithMatcher<std::wstring>(suffix));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
 | 
			
		||||
@@ -4459,6 +4541,58 @@ inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
 | 
			
		||||
// first field != the second field.
 | 
			
		||||
inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// FloatEq(first field) matches the second field.
 | 
			
		||||
inline internal::FloatingEq2Matcher<float> FloatEq() {
 | 
			
		||||
  return internal::FloatingEq2Matcher<float>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// DoubleEq(first field) matches the second field.
 | 
			
		||||
inline internal::FloatingEq2Matcher<double> DoubleEq() {
 | 
			
		||||
  return internal::FloatingEq2Matcher<double>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// FloatEq(first field) matches the second field with NaN equality.
 | 
			
		||||
inline internal::FloatingEq2Matcher<float> NanSensitiveFloatEq() {
 | 
			
		||||
  return internal::FloatingEq2Matcher<float>(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// DoubleEq(first field) matches the second field with NaN equality.
 | 
			
		||||
inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleEq() {
 | 
			
		||||
  return internal::FloatingEq2Matcher<double>(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// FloatNear(first field, max_abs_error) matches the second field.
 | 
			
		||||
inline internal::FloatingEq2Matcher<float> FloatNear(float max_abs_error) {
 | 
			
		||||
  return internal::FloatingEq2Matcher<float>(max_abs_error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// DoubleNear(first field, max_abs_error) matches the second field.
 | 
			
		||||
inline internal::FloatingEq2Matcher<double> DoubleNear(double max_abs_error) {
 | 
			
		||||
  return internal::FloatingEq2Matcher<double>(max_abs_error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// FloatNear(first field, max_abs_error) matches the second field with NaN
 | 
			
		||||
// equality.
 | 
			
		||||
inline internal::FloatingEq2Matcher<float> NanSensitiveFloatNear(
 | 
			
		||||
    float max_abs_error) {
 | 
			
		||||
  return internal::FloatingEq2Matcher<float>(max_abs_error, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a polymorphic matcher that matches a 2-tuple where
 | 
			
		||||
// DoubleNear(first field, max_abs_error) matches the second field with NaN
 | 
			
		||||
// equality.
 | 
			
		||||
inline internal::FloatingEq2Matcher<double> NanSensitiveDoubleNear(
 | 
			
		||||
    double max_abs_error) {
 | 
			
		||||
  return internal::FloatingEq2Matcher<double>(max_abs_error, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a matcher that matches any value of type T that m doesn't
 | 
			
		||||
// match.
 | 
			
		||||
template <typename InnerMatcher>
 | 
			
		||||
@@ -4836,6 +4970,28 @@ inline bool ExplainMatchResult(
 | 
			
		||||
  return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a string representation of the given matcher.  Useful for description
 | 
			
		||||
// strings of matchers defined using MATCHER_P* macros that accept matchers as
 | 
			
		||||
// their arguments.  For example:
 | 
			
		||||
//
 | 
			
		||||
// MATCHER_P(XAndYThat, matcher,
 | 
			
		||||
//           "X that " + DescribeMatcher<int>(matcher, negation) +
 | 
			
		||||
//               " and Y that " + DescribeMatcher<double>(matcher, negation)) {
 | 
			
		||||
//   return ExplainMatchResult(matcher, arg.x(), result_listener) &&
 | 
			
		||||
//          ExplainMatchResult(matcher, arg.y(), result_listener);
 | 
			
		||||
// }
 | 
			
		||||
template <typename T, typename M>
 | 
			
		||||
std::string DescribeMatcher(const M& matcher, bool negation = false) {
 | 
			
		||||
  ::std::stringstream ss;
 | 
			
		||||
  Matcher<T> monomorphic_matcher = SafeMatcherCast<T>(matcher);
 | 
			
		||||
  if (negation) {
 | 
			
		||||
    monomorphic_matcher.DescribeNegationTo(&ss);
 | 
			
		||||
  } else {
 | 
			
		||||
    monomorphic_matcher.DescribeTo(&ss);
 | 
			
		||||
  }
 | 
			
		||||
  return ss.str();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if GTEST_LANG_CXX11
 | 
			
		||||
// Define variadic matcher versions. They are overloaded in
 | 
			
		||||
// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.
 | 
			
		||||
@@ -4861,6 +5017,28 @@ inline internal::AnyOfMatcher<Args...> AnyOf(const Args&... matchers) {
 | 
			
		||||
template <typename InnerMatcher>
 | 
			
		||||
inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
 | 
			
		||||
 | 
			
		||||
// Returns a matcher that matches the value of an optional<> type variable.
 | 
			
		||||
// The matcher implementation only uses '!arg' and requires that the optional<>
 | 
			
		||||
// type has a 'value_type' member type and that '*arg' is of type 'value_type'
 | 
			
		||||
// and is printable using 'PrintToString'. It is compatible with
 | 
			
		||||
// std::optional/std::experimental::optional.
 | 
			
		||||
// Note that to compare an optional type variable against nullopt you should
 | 
			
		||||
// use Eq(nullopt) and not Optional(Eq(nullopt)). The latter implies that the
 | 
			
		||||
// optional value contains an optional itself.
 | 
			
		||||
template <typename ValueMatcher>
 | 
			
		||||
inline internal::OptionalMatcher<ValueMatcher> Optional(
 | 
			
		||||
    const ValueMatcher& value_matcher) {
 | 
			
		||||
  return internal::OptionalMatcher<ValueMatcher>(value_matcher);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a matcher that matches the value of a absl::any type variable.
 | 
			
		||||
template <typename T>
 | 
			
		||||
PolymorphicMatcher<internal::any_cast_matcher::AnyCastMatcher<T> > AnyWith(
 | 
			
		||||
    const Matcher<const T&>& matcher) {
 | 
			
		||||
  return MakePolymorphicMatcher(
 | 
			
		||||
      internal::any_cast_matcher::AnyCastMatcher<T>(matcher));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a matcher that matches the value of a variant<> type variable.
 | 
			
		||||
// The matcher implementation uses ADL to find the holds_alternative and get
 | 
			
		||||
// functions.
 | 
			
		||||
@@ -4887,4 +5065,5 @@ PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(
 | 
			
		||||
// We must include this header at the end to make sure it can use the
 | 
			
		||||
// declarations from this file.
 | 
			
		||||
#include "gmock/internal/custom/gmock-matchers.h"
 | 
			
		||||
 | 
			
		||||
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user