Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
googletest
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
googletest
Commits
b907c267
Commit
b907c267
authored
Mar 23, 2018
by
Gennadiy Civil
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merging gmock-matchers.h -2
parent
466a49ae
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
208 additions
and
29 deletions
+208
-29
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> > {
...
@@ -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,
...
@@ -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<
...
@@ -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 &,
...
@@ -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(
...
@@ -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(); }
...
@@ -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(
...
@@ -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) {
...
@@ -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(
...
@@ -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_
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