mirror of
https://github.com/google/googletest.git
synced 2025-03-20 10:53:47 +00:00
Merging gmock-matchers.h -2
This commit is contained in:
parent
466a49ae30
commit
b907c26740
@ -651,6 +651,22 @@ class MatcherCastImpl<T, Matcher<U> > {
|
|||||||
|
|
||||||
// We delegate the matching logic to the source matcher.
|
// We delegate the matching logic to the source matcher.
|
||||||
virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
|
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);
|
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 char* matcher_name,
|
||||||
const Strings& param_values);
|
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 {
|
namespace variant_matcher {
|
||||||
// Overloads to allow VariantMatcher to do proper ADL lookup.
|
// Overloads to allow VariantMatcher to do proper ADL lookup.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -4246,6 +4317,16 @@ inline PolymorphicMatcher<
|
|||||||
// to compile where bar is an int32 and m is a matcher for int64.
|
// 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
|
// Creates a matcher that matches an object whose given property
|
||||||
// matches 'matcher'. For example,
|
// matches 'matcher'. For example,
|
||||||
// Property(&Foo::str, StartsWith("hi"))
|
// Property(&Foo::str, StartsWith("hi"))
|
||||||
@ -4294,6 +4375,7 @@ Property(PropertyType (Class::*property)() const &,
|
|||||||
// concurrent access.
|
// concurrent access.
|
||||||
// * If it is a function object, it has to define type result_type.
|
// * If it is a function object, it has to define type result_type.
|
||||||
// We recommend deriving your functor classes from std::unary_function.
|
// We recommend deriving your functor classes from std::unary_function.
|
||||||
|
//
|
||||||
template <typename Callable, typename ResultOfMatcher>
|
template <typename Callable, typename ResultOfMatcher>
|
||||||
internal::ResultOfMatcher<Callable> ResultOf(
|
internal::ResultOfMatcher<Callable> ResultOf(
|
||||||
Callable callable, const ResultOfMatcher& matcher) {
|
Callable callable, const ResultOfMatcher& matcher) {
|
||||||
@ -4384,53 +4466,53 @@ inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
|
|||||||
// Wide string matchers.
|
// Wide string matchers.
|
||||||
|
|
||||||
// Matches a string equal to str.
|
// Matches a string equal to str.
|
||||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrEq(
|
||||||
StrEq(const internal::wstring& str) {
|
const std::wstring& str) {
|
||||||
return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
str, true, true));
|
internal::StrEqualityMatcher<std::wstring>(str, true, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches a string not equal to str.
|
// Matches a string not equal to str.
|
||||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> > StrNe(
|
||||||
StrNe(const internal::wstring& str) {
|
const std::wstring& str) {
|
||||||
return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
str, false, true));
|
internal::StrEqualityMatcher<std::wstring>(str, false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches a string equal to str, ignoring case.
|
// Matches a string equal to str, ignoring case.
|
||||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
|
||||||
StrCaseEq(const internal::wstring& str) {
|
StrCaseEq(const std::wstring& str) {
|
||||||
return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
str, true, false));
|
internal::StrEqualityMatcher<std::wstring>(str, true, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches a string not equal to str, ignoring case.
|
// Matches a string not equal to str, ignoring case.
|
||||||
inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring> >
|
||||||
StrCaseNe(const internal::wstring& str) {
|
StrCaseNe(const std::wstring& str) {
|
||||||
return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
str, false, false));
|
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.
|
// that contains the given substring.
|
||||||
inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::HasSubstrMatcher<std::wstring> > HasSubstr(
|
||||||
HasSubstr(const internal::wstring& substring) {
|
const std::wstring& substring) {
|
||||||
return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
substring));
|
internal::HasSubstrMatcher<std::wstring>(substring));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches a string that starts with 'prefix' (case-sensitive).
|
// Matches a string that starts with 'prefix' (case-sensitive).
|
||||||
inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::StartsWithMatcher<std::wstring> >
|
||||||
StartsWith(const internal::wstring& prefix) {
|
StartsWith(const std::wstring& prefix) {
|
||||||
return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
prefix));
|
internal::StartsWithMatcher<std::wstring>(prefix));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches a string that ends with 'suffix' (case-sensitive).
|
// Matches a string that ends with 'suffix' (case-sensitive).
|
||||||
inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> >
|
inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(
|
||||||
EndsWith(const internal::wstring& suffix) {
|
const std::wstring& suffix) {
|
||||||
return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>(
|
return MakePolymorphicMatcher(
|
||||||
suffix));
|
internal::EndsWithMatcher<std::wstring>(suffix));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
|
#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.
|
// first field != the second field.
|
||||||
inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
|
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
|
// Creates a matcher that matches any value of type T that m doesn't
|
||||||
// match.
|
// match.
|
||||||
template <typename InnerMatcher>
|
template <typename InnerMatcher>
|
||||||
@ -4836,6 +4970,28 @@ inline bool ExplainMatchResult(
|
|||||||
return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
|
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
|
#if GTEST_LANG_CXX11
|
||||||
// Define variadic matcher versions. They are overloaded in
|
// Define variadic matcher versions. They are overloaded in
|
||||||
// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.
|
// 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>
|
template <typename InnerMatcher>
|
||||||
inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
|
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.
|
// Returns a matcher that matches the value of a variant<> type variable.
|
||||||
// The matcher implementation uses ADL to find the holds_alternative and get
|
// The matcher implementation uses ADL to find the holds_alternative and get
|
||||||
// functions.
|
// 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
|
// We must include this header at the end to make sure it can use the
|
||||||
// declarations from this file.
|
// declarations from this file.
|
||||||
#include "gmock/internal/custom/gmock-matchers.h"
|
#include "gmock/internal/custom/gmock-matchers.h"
|
||||||
|
|
||||||
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
|
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user