Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
b907c267
Commit
b907c267
authored
Mar 23, 2018
by
Gennadiy Civil
Browse files
Merging gmock-matchers.h -2
parent
466a49ae
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
208 additions
and
29 deletions
+208
-29
googlemock/include/gmock/gmock-matchers.h
googlemock/include/gmock/gmock-matchers.h
+208
-29
No files found.
googlemock/include/gmock/gmock-matchers.h
View file @
b907c267
...
...
@@ -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_
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment