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
b1c7f93c
Commit
b1c7f93c
authored
Mar 24, 2010
by
zhanyong.wan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improves matcher messages across the board.
parent
676e8cc6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
504 additions
and
245 deletions
+504
-245
gmock-generated-matchers.h
include/gmock/gmock-generated-matchers.h
+18
-3
gmock-generated-matchers.h.pump
include/gmock/gmock-generated-matchers.h.pump
+15
-2
gmock-matchers.h
include/gmock/gmock-matchers.h
+84
-87
gmock-spec-builders.h
include/gmock/gmock-spec-builders.h
+6
-6
gmock-generated-matchers_test.cc
test/gmock-generated-matchers_test.cc
+65
-20
gmock-matchers_test.cc
test/gmock-matchers_test.cc
+313
-124
gmock_output_test_golden.txt
test/gmock_output_test_golden.txt
+3
-3
No files found.
include/gmock/gmock-generated-matchers.h
View file @
b1c7f93c
// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
// This file was GENERATED by command:
// pump.py gmock-generated-matchers.h.pump
// DO NOT EDIT BY HAND!!!
// Copyright 2008, Google Inc.
// All rights reserved.
...
...
@@ -231,15 +233,28 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
virtual
bool
MatchAndExplain
(
ArgsTuple
args
,
MatchResultListener
*
listener
)
const
{
return
inner_matcher_
.
MatchAndExplain
(
GetSelectedArgs
(
args
),
listener
);
const
SelectedArgs
&
selected_args
=
GetSelectedArgs
(
args
);
if
(
!
listener
->
IsInterested
())
return
inner_matcher_
.
Matches
(
selected_args
);
PrintIndices
(
listener
->
stream
());
*
listener
<<
"are "
<<
PrintToString
(
selected_args
);
StringMatchResultListener
inner_listener
;
const
bool
match
=
inner_matcher_
.
MatchAndExplain
(
selected_args
,
&
inner_listener
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
match
;
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeNegationTo
(
os
);
}
...
...
@@ -252,7 +267,7 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
// Prints the indices of the selected fields.
static
void
PrintIndices
(
::
std
::
ostream
*
os
)
{
*
os
<<
"
are a tuple
whose fields ("
;
*
os
<<
"whose fields ("
;
const
int
indices
[
10
]
=
{
k0
,
k1
,
k2
,
k3
,
k4
,
k5
,
k6
,
k7
,
k8
,
k9
};
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
if
(
indices
[
i
]
<
0
)
...
...
include/gmock/gmock-generated-matchers.h.pump
View file @
b1c7f93c
...
...
@@ -118,15 +118,28 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
virtual
bool
MatchAndExplain
(
ArgsTuple
args
,
MatchResultListener
*
listener
)
const
{
return
inner_matcher_
.
MatchAndExplain
(
GetSelectedArgs
(
args
),
listener
);
const
SelectedArgs
&
selected_args
=
GetSelectedArgs
(
args
);
if
(
!
listener
->
IsInterested
())
return
inner_matcher_
.
Matches
(
selected_args
);
PrintIndices
(
listener
->
stream
());
*
listener
<<
"are "
<<
PrintToString
(
selected_args
);
StringMatchResultListener
inner_listener
;
const
bool
match
=
inner_matcher_
.
MatchAndExplain
(
selected_args
,
&
inner_listener
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
match
;
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeNegationTo
(
os
);
}
...
...
@@ -138,7 +151,7 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
// Prints the indices of the selected fields.
static
void
PrintIndices
(
::
std
::
ostream
*
os
)
{
*
os
<<
"
are a tuple
whose fields ("
;
*
os
<<
"whose fields ("
;
const
int
indices
[
$
n
]
=
{
$
ks
};
for
(
int
i
=
0
;
i
<
$
n
;
i
++
)
{
if
(
indices
[
i
]
<
0
)
...
...
include/gmock/gmock-matchers.h
View file @
b1c7f93c
...
...
@@ -453,12 +453,11 @@ Matcher<T> A();
// and MUST NOT BE USED IN USER CODE!!!
namespace
internal
{
// If the explanation is not empty, prints it to the listener.
// 'listener' must not be NULL.
inline
void
PrintIfNotEmpty
(
const
internal
::
string
&
explanation
,
MatchResultListener
*
listener
)
{
if
(
explanation
!=
""
)
{
*
listener
<<
", "
<<
explanation
;
// If the explanation is not empty, prints it to the ostream.
inline
void
PrintIfNotEmpty
(
const
internal
::
string
&
explanation
,
std
::
ostream
*
os
)
{
if
(
explanation
!=
""
&&
os
!=
NULL
)
{
*
os
<<
", "
<<
explanation
;
}
}
...
...
@@ -480,20 +479,11 @@ bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
const
bool
match
=
matcher
.
MatchAndExplain
(
value
,
&
inner_listener
);
UniversalPrint
(
value
,
listener
->
stream
());
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
()
);
return
match
;
}
// If the given string is not empty and os is not NULL, wraps the
// string inside a pair of parentheses and streams the result to os.
inline
void
StreamInParensAsNeeded
(
const
internal
::
string
&
str
,
::
std
::
ostream
*
os
)
{
if
(
!
str
.
empty
()
&&
os
!=
NULL
)
{
*
os
<<
" ("
<<
str
<<
")"
;
}
}
// An internal helper class for doing compile-time loop on a tuple's
// fields.
template
<
size_t
N
>
...
...
@@ -510,19 +500,19 @@ class TuplePrefix {
&&
get
<
N
-
1
>
(
matcher_tuple
).
Matches
(
get
<
N
-
1
>
(
value_tuple
));
}
// TuplePrefix<N>::
Describe
MatchFailuresTo(matchers, values, os)
// TuplePrefix<N>::
Explain
MatchFailuresTo(matchers, values, os)
// describes failures in matching the first N fields of matchers
// against the first N fields of values. If there is no failure,
// nothing will be streamed to os.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
void
Describe
MatchFailuresTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
static
void
Explain
MatchFailuresTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
using
::
std
::
tr1
::
tuple_element
;
using
::
std
::
tr1
::
get
;
// First, describes failures in the first N - 1 fields.
TuplePrefix
<
N
-
1
>::
Describe
MatchFailuresTo
(
matchers
,
values
,
os
);
TuplePrefix
<
N
-
1
>::
Explain
MatchFailuresTo
(
matchers
,
values
,
os
);
// Then describes the failure (if any) in the (N - 1)-th (0-based)
// field.
...
...
@@ -542,10 +532,8 @@ class TuplePrefix {
// isn't interesting to the user most of the time. The
// matcher's MatchAndExplain() method handles the case when
// the address is interesting.
internal
::
UniversalPrinter
<
GMOCK_REMOVE_REFERENCE_
(
Value
)
>::
Print
(
value
,
os
);
StreamInParensAsNeeded
(
listener
.
str
(),
os
);
internal
::
UniversalPrint
(
value
,
os
);
PrintIfNotEmpty
(
listener
.
str
(),
os
);
*
os
<<
"
\n
"
;
}
}
...
...
@@ -562,9 +550,9 @@ class TuplePrefix<0> {
}
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
void
Describe
MatchFailuresTo
(
const
MatcherTuple
&
/* matchers */
,
const
ValueTuple
&
/* values */
,
::
std
::
ostream
*
/* os */
)
{}
static
void
Explain
MatchFailuresTo
(
const
MatcherTuple
&
/* matchers */
,
const
ValueTuple
&
/* values */
,
::
std
::
ostream
*
/* os */
)
{}
};
// TupleMatches(matcher_tuple, value_tuple) returns true iff all
...
...
@@ -588,11 +576,11 @@ bool TupleMatches(const MatcherTuple& matcher_tuple,
// Describes failures in matching matchers against values. If there
// is no failure, nothing will be streamed to os.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
void
Describe
MatchFailureTupleTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
void
Explain
MatchFailureTupleTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
using
::
std
::
tr1
::
tuple_size
;
TuplePrefix
<
tuple_size
<
MatcherTuple
>::
value
>::
Describe
MatchFailuresTo
(
TuplePrefix
<
tuple_size
<
MatcherTuple
>::
value
>::
Explain
MatchFailuresTo
(
matchers
,
values
,
os
);
}
...
...
@@ -695,7 +683,8 @@ class AnythingMatcher {
//
// The following template definition assumes that the Rhs parameter is
// a "bare" type (i.e. neither 'const T' nor 'T&').
#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_(name, op, relation) \
#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \
name, op, relation, negated_relation) \
template <typename Rhs> class name##Matcher { \
public: \
explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \
...
...
@@ -713,11 +702,11 @@ class AnythingMatcher {
return lhs op rhs_; \
} \
virtual void DescribeTo(::std::ostream* os) const { \
*os <<
"is "
relation " "; \
*os << relation " "; \
UniversalPrinter<Rhs>::Print(rhs_, os); \
} \
virtual void DescribeNegationTo(::std::ostream* os) const { \
*os <<
"is not "
relation " "; \
*os <<
negated_
relation " "; \
UniversalPrinter<Rhs>::Print(rhs_, os); \
} \
private: \
...
...
@@ -730,12 +719,12 @@ class AnythingMatcher {
// Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v)
// respectively.
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Eq
,
==
,
"equal to"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Ge
,
>=
,
"
greater than or equal to
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Gt
,
>
,
"
greater than
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Le
,
<=
,
"
less than or equal to
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Lt
,
<
,
"
less than
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Ne
,
!=
,
"
not
equal to"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Eq
,
==
,
"
is equal to"
,
"isn't
equal to"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Ge
,
>=
,
"
is >="
,
"isn't >=
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Gt
,
>
,
"
is >"
,
"isn't >
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Le
,
<=
,
"
is <="
,
"isn't <=
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Lt
,
<
,
"
is <"
,
"isn't <
"
);
GMOCK_IMPLEMENT_COMPARISON_MATCHER_
(
Ne
,
!=
,
"
isn't equal to"
,
"is
equal to"
);
#undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_
...
...
@@ -751,7 +740,7 @@ class IsNullMatcher {
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is NULL"
;
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is
no
t NULL"
;
*
os
<<
"is
n'
t NULL"
;
}
};
...
...
@@ -765,7 +754,7 @@ class NotNullMatcher {
return
GetRawPointer
(
p
)
!=
NULL
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is
no
t NULL"
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is
n'
t NULL"
;
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is NULL"
;
}
...
...
@@ -820,7 +809,7 @@ class RefMatcher<T&> {
// in order to match the interface MatcherInterface<Super&>.
virtual
bool
MatchAndExplain
(
Super
&
x
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"is located @"
<<
static_cast
<
const
void
*>
(
&
x
);
*
listener
<<
"
which
is located @"
<<
static_cast
<
const
void
*>
(
&
x
);
return
&
x
==
&
object_
;
}
...
...
@@ -917,10 +906,7 @@ class StrEqualityMatcher {
private
:
void
DescribeToHelper
(
bool
expect_eq
,
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is "
;
if
(
!
expect_eq
)
{
*
os
<<
"not "
;
}
*
os
<<
(
expect_eq
?
"is "
:
"isn't "
);
*
os
<<
"equal to "
;
if
(
!
case_sensitive_
)
{
*
os
<<
"(ignoring case) "
;
...
...
@@ -1212,8 +1198,11 @@ class BothOfMatcherImpl : public MatcherInterface<T> {
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"not "
;
DescribeTo
(
os
);
*
os
<<
"("
;
matcher1_
.
DescribeNegationTo
(
os
);
*
os
<<
") or ("
;
matcher2_
.
DescribeNegationTo
(
os
);
*
os
<<
")"
;
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
...
...
@@ -1240,7 +1229,7 @@ class BothOfMatcherImpl : public MatcherInterface<T> {
}
else
{
*
listener
<<
s1
;
if
(
s2
!=
""
)
{
*
listener
<<
"
;
"
<<
s2
;
*
listener
<<
"
, and
"
<<
s2
;
}
}
return
true
;
...
...
@@ -1296,8 +1285,11 @@ class EitherOfMatcherImpl : public MatcherInterface<T> {
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"not "
;
DescribeTo
(
os
);
*
os
<<
"("
;
matcher1_
.
DescribeNegationTo
(
os
);
*
os
<<
") and ("
;
matcher2_
.
DescribeNegationTo
(
os
);
*
os
<<
")"
;
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
...
...
@@ -1324,7 +1316,7 @@ class EitherOfMatcherImpl : public MatcherInterface<T> {
}
else
{
*
listener
<<
s1
;
if
(
s2
!=
""
)
{
*
listener
<<
"
;
"
<<
s2
;
*
listener
<<
"
, and
"
<<
s2
;
}
}
return
false
;
...
...
@@ -1462,18 +1454,15 @@ class PredicateFormatterFromMatcher {
// matcher_ has type Matcher<T> (e.g. An<int>()).
const
Matcher
<
const
T
&>
matcher
=
MatcherCast
<
const
T
&>
(
matcher_
);
StringMatchResultListener
listener
;
if
(
matcher
.
MatchAndExplain
(
x
,
&
listener
))
{
if
(
MatchPrintAndExplain
(
x
,
matcher
,
&
listener
))
return
AssertionSuccess
();
}
else
{
::
std
::
stringstream
ss
;
ss
<<
"Value of: "
<<
value_text
<<
"
\n
"
<<
"Expected: "
;
matcher
.
DescribeTo
(
&
ss
);
ss
<<
"
\n
Actual: "
;
UniversalPrinter
<
T
>::
Print
(
x
,
&
ss
);
StreamInParensAsNeeded
(
listener
.
str
(),
&
ss
);
return
AssertionFailure
(
Message
()
<<
ss
.
str
());
}
::
std
::
stringstream
ss
;
ss
<<
"Value of: "
<<
value_text
<<
"
\n
"
<<
"Expected: "
;
matcher
.
DescribeTo
(
&
ss
);
ss
<<
"
\n
Actual: "
<<
listener
.
str
();
return
AssertionFailure
()
<<
ss
.
str
();
}
private
:
...
...
@@ -1548,12 +1537,12 @@ class FloatingEqMatcher {
::
std
::
numeric_limits
<
FloatType
>::
digits10
+
2
);
if
(
FloatingPoint
<
FloatType
>
(
rhs_
).
is_nan
())
{
if
(
nan_eq_nan_
)
{
*
os
<<
"is
no
t NaN"
;
*
os
<<
"is
n'
t NaN"
;
}
else
{
*
os
<<
"is anything"
;
}
}
else
{
*
os
<<
"is
no
t approximately "
<<
rhs_
;
*
os
<<
"is
n'
t approximately "
<<
rhs_
;
}
// Restore original precision.
os
->
precision
(
old_precision
);
...
...
@@ -1912,7 +1901,7 @@ class ContainerEqMatcher {
::
std
::
ostream
*
const
os
=
listener
->
stream
();
if
(
os
!=
NULL
)
{
// Something is different. Check for
missing
values first.
// Something is different. Check for
extra
values first.
bool
printed_header
=
false
;
for
(
typename
LhsStlContainer
::
const_iterator
it
=
lhs_stl_container
.
begin
();
...
...
@@ -1922,7 +1911,7 @@ class ContainerEqMatcher {
if
(
printed_header
)
{
*
os
<<
", "
;
}
else
{
*
os
<<
"
Only in actual
: "
;
*
os
<<
"
which has these unexpected elements
: "
;
printed_header
=
true
;
}
UniversalPrinter
<
typename
LhsStlContainer
::
value_type
>::
...
...
@@ -1930,7 +1919,7 @@ class ContainerEqMatcher {
}
}
// Now check for
extra
values.
// Now check for
missing
values.
bool
printed_header2
=
false
;
for
(
typename
StlContainer
::
const_iterator
it
=
rhs_
.
begin
();
it
!=
rhs_
.
end
();
++
it
)
{
...
...
@@ -1940,7 +1929,8 @@ class ContainerEqMatcher {
if
(
printed_header2
)
{
*
os
<<
", "
;
}
else
{
*
os
<<
(
printed_header
?
"; not"
:
"Not"
)
<<
" in actual: "
;
*
os
<<
(
printed_header
?
",
\n
and"
:
"which"
)
<<
" doesn't have these expected elements: "
;
printed_header2
=
true
;
}
UniversalPrinter
<
typename
StlContainer
::
value_type
>::
Print
(
*
it
,
os
);
...
...
@@ -1990,8 +1980,10 @@ class ContainsMatcherImpl : public MatcherInterface<Container> {
size_t
i
=
0
;
for
(
typename
StlContainer
::
const_iterator
it
=
stl_container
.
begin
();
it
!=
stl_container
.
end
();
++
it
,
++
i
)
{
if
(
inner_matcher_
.
Matches
(
*
it
))
{
*
listener
<<
"element "
<<
i
<<
" matches"
;
StringMatchResultListener
inner_listener
;
if
(
inner_matcher_
.
MatchAndExplain
(
*
it
,
&
inner_listener
))
{
*
listener
<<
"whose element #"
<<
i
<<
" matches"
;
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
true
;
}
}
...
...
@@ -2040,7 +2032,14 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {
// Returns true iff 'key_value.first' (the key) matches the inner matcher.
virtual
bool
MatchAndExplain
(
PairType
key_value
,
MatchResultListener
*
listener
)
const
{
return
inner_matcher_
.
MatchAndExplain
(
key_value
.
first
,
listener
);
StringMatchResultListener
inner_listener
;
const
bool
match
=
inner_matcher_
.
MatchAndExplain
(
key_value
.
first
,
&
inner_listener
);
const
internal
::
string
explanation
=
inner_listener
.
str
();
if
(
explanation
!=
""
)
{
*
listener
<<
"whose first field is a value "
<<
explanation
;
}
return
match
;
}
// Describes what this matcher does.
...
...
@@ -2125,14 +2124,14 @@ class PairMatcherImpl : public MatcherInterface<PairType> {
if
(
!
first_matcher_
.
MatchAndExplain
(
a_pair
.
first
,
&
first_inner_listener
))
{
*
listener
<<
"whose first field does not match"
;
PrintIfNotEmpty
(
first_inner_listener
.
str
(),
listener
);
PrintIfNotEmpty
(
first_inner_listener
.
str
(),
listener
->
stream
()
);
return
false
;
}
StringMatchResultListener
second_inner_listener
;
if
(
!
second_matcher_
.
MatchAndExplain
(
a_pair
.
second
,
&
second_inner_listener
))
{
*
listener
<<
"whose second field does not match"
;
PrintIfNotEmpty
(
second_inner_listener
.
str
(),
listener
);
PrintIfNotEmpty
(
second_inner_listener
.
str
(),
listener
->
stream
()
);
return
false
;
}
ExplainSuccess
(
first_inner_listener
.
str
(),
second_inner_listener
.
str
(),
...
...
@@ -2217,7 +2216,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {
}
else
{
*
os
<<
"has "
<<
Elements
(
count
())
<<
" where
\n
"
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
*
os
<<
"element "
<<
i
<<
" "
;
*
os
<<
"element
#
"
<<
i
<<
" "
;
matchers_
[
i
].
DescribeTo
(
os
);
if
(
i
+
1
<
count
())
{
*
os
<<
",
\n
"
;
...
...
@@ -2229,13 +2228,13 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {
// Describes what the negation of this matcher does.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
if
(
count
()
==
0
)
{
*
os
<<
"is
no
t empty"
;
*
os
<<
"is
n'
t empty"
;
return
;
}
*
os
<<
"does
no
t have "
<<
Elements
(
count
())
<<
", or
\n
"
;
*
os
<<
"does
n'
t have "
<<
Elements
(
count
())
<<
", or
\n
"
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
*
os
<<
"element "
<<
i
<<
" "
;
*
os
<<
"element
#
"
<<
i
<<
" "
;
matchers_
[
i
].
DescribeNegationTo
(
os
);
if
(
i
+
1
<
count
())
{
*
os
<<
", or
\n
"
;
...
...
@@ -2253,7 +2252,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {
// prints the empty container. Otherwise we just need to show
// how many elements there actually are.
if
(
actual_count
!=
0
)
{
*
listener
<<
"has "
<<
Elements
(
actual_count
);
*
listener
<<
"
which
has "
<<
Elements
(
actual_count
);
}
return
false
;
}
...
...
@@ -2268,24 +2267,22 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {
}
else
{
// The container has the right size but the i-th element
// doesn't match its expectation.
*
listener
<<
"element "
<<
i
<<
" doesn't match"
;
StreamInParensAsNeeded
(
s
.
str
(),
listener
->
stream
());
*
listener
<<
"whose element #"
<<
i
<<
" doesn't match"
;
PrintIfNotEmpty
(
s
.
str
(),
listener
->
stream
());
return
false
;
}
}
// Every element matches its expectation. We need to explain why
// (the obvious ones can be skipped).
bool
reason_printed
=
false
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
const
internal
::
string
&
s
=
explanations
[
i
];
if
(
!
s
.
empty
())
{
if
(
reason_printed
)
{
*
listener
<<
",
\n
"
;
*
listener
<<
",
\n
and
"
;
}
*
listener
<<
"
element "
<<
i
<<
"
"
<<
s
;
*
listener
<<
"
whose element #"
<<
i
<<
" matches,
"
<<
s
;
reason_printed
=
true
;
}
}
...
...
include/gmock/gmock-spec-builders.h
View file @
b1c7f93c
...
...
@@ -993,8 +993,8 @@ class TypedExpectation : public ExpectationBase {
// Describes the result of matching the arguments against this
// expectation to the given ostream.
// L >= g_gmock_mutex
void
Describe
MatchResultTo
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
os
)
const
{
void
Explain
MatchResultTo
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
os
)
const
{
g_gmock_mutex
.
AssertHeld
();
if
(
is_retired
())
{
...
...
@@ -1002,7 +1002,7 @@ class TypedExpectation : public ExpectationBase {
<<
" Actual: it is retired
\n
"
;
}
else
if
(
!
Matches
(
args
))
{
if
(
!
TupleMatches
(
matchers_
,
args
))
{
Describe
MatchFailureTupleTo
(
matchers_
,
args
,
os
);
Explain
MatchFailureTupleTo
(
matchers_
,
args
,
os
);
}
StringMatchResultListener
listener
;
if
(
!
extra_matcher_
.
MatchAndExplain
(
args
,
&
listener
))
{
...
...
@@ -1010,7 +1010,7 @@ class TypedExpectation : public ExpectationBase {
extra_matcher_
.
DescribeTo
(
os
);
*
os
<<
"
\n
Actual: don't match"
;
internal
::
StreamInParensAsNeeded
(
listener
.
str
(),
os
);
internal
::
PrintIfNotEmpty
(
listener
.
str
(),
os
);
*
os
<<
"
\n
"
;
}
}
else
if
(
!
AllPrerequisitesAreSatisfied
())
{
...
...
@@ -1028,7 +1028,7 @@ class TypedExpectation : public ExpectationBase {
*
os
<<
" (end of pre-requisites)
\n
"
;
}
else
{
// This line is here just for completeness' sake. It will never
// be executed as currently the
Describe
MatchResultTo() function
// be executed as currently the
Explain
MatchResultTo() function
// is called only when the mock function call does NOT match the
// expectation.
*
os
<<
"The call matches the expectation.
\n
"
;
...
...
@@ -1618,7 +1618,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {
*
why
<<
"tried expectation #"
<<
i
<<
": "
;
}
*
why
<<
expectations_
[
i
]
->
source_text
()
<<
"...
\n
"
;
expectations_
[
i
]
->
Describe
MatchResultTo
(
args
,
why
);
expectations_
[
i
]
->
Explain
MatchResultTo
(
args
,
why
);
expectations_
[
i
]
->
DescribeCallCountTo
(
why
);
}
}
...
...
test/gmock-generated-matchers_test.cc
View file @
b1c7f93c
...
...
@@ -211,6 +211,43 @@ TEST(ArgsTest, DescribesNegationCorrectly) {
DescribeNegation
(
m
));
}
TEST
(
ArgsTest
,
ExplainsMatchResultWithoutInnerExplanation
)
{
const
Matcher
<
tuple
<
bool
,
int
,
int
>
>
m
=
Args
<
1
,
2
>
(
Eq
());
EXPECT_EQ
(
"whose fields (#1, #2) are (42, 42)"
,
Explain
(
m
,
make_tuple
(
false
,
42
,
42
)));
EXPECT_EQ
(
"whose fields (#1, #2) are (42, 43)"
,
Explain
(
m
,
make_tuple
(
false
,
42
,
43
)));
}
// For testing Args<>'s explanation.
class
LessThanMatcher
:
public
MatcherInterface
<
tuple
<
char
,
int
>
>
{
public
:
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{}
virtual
bool
MatchAndExplain
(
tuple
<
char
,
int
>
value
,
MatchResultListener
*
listener
)
const
{
const
int
diff
=
get
<
0
>
(
value
)
-
get
<
1
>
(
value
);
if
(
diff
>
0
)
{
*
listener
<<
"where the first value is "
<<
diff
<<
" more than the second"
;
}
return
diff
<
0
;
}
};
Matcher
<
tuple
<
char
,
int
>
>
LessThan
()
{
return
MakeMatcher
(
new
LessThanMatcher
);
}
TEST
(
ArgsTest
,
ExplainsMatchResultWithInnerExplanation
)
{
const
Matcher
<
tuple
<
char
,
int
,
int
>
>
m
=
Args
<
0
,
2
>
(
LessThan
());
EXPECT_EQ
(
"whose fields (#0, #2) are ('a' (97), 42), "
"where the first value is 55 more than the second"
,
Explain
(
m
,
make_tuple
(
'a'
,
42
,
42
)));
EXPECT_EQ
(
"whose fields (#0, #2) are ('
\\
0', 43)"
,
Explain
(
m
,
make_tuple
(
'\0'
,
42
,
43
)));
}
// For testing ExplainMatchResultTo().
class
GreaterThanMatcher
:
public
MatcherInterface
<
int
>
{
public
:
...
...
@@ -224,11 +261,11 @@ class GreaterThanMatcher : public MatcherInterface<int> {
MatchResultListener
*
listener
)
const
{
const
int
diff
=
lhs
-
rhs_
;
if
(
diff
>
0
)
{
*
listener
<<
"is "
<<
diff
<<
" more than "
<<
rhs_
;
*
listener
<<
"
which
is "
<<
diff
<<
" more than "
<<
rhs_
;
}
else
if
(
diff
==
0
)
{
*
listener
<<
"is the same as "
<<
rhs_
;
*
listener
<<
"
which
is the same as "
<<
rhs_
;
}
else
{
*
listener
<<
"is "
<<
-
diff
<<
" less than "
<<
rhs_
;
*
listener
<<
"
which
is "
<<
-
diff
<<
" less than "
<<
rhs_
;
}
return
lhs
>
rhs_
;
...
...
@@ -254,32 +291,32 @@ TEST(ElementsAreTest, CanDescribeExpectingNoElement) {
TEST
(
ElementsAreTest
,
CanDescribeExpectingOneElement
)
{
Matcher
<
vector
<
int
>
>
m
=
ElementsAre
(
Gt
(
5
));
EXPECT_EQ
(
"has 1 element that is
greater than
5"
,
Describe
(
m
));
EXPECT_EQ
(
"has 1 element that is
>
5"
,
Describe
(
m
));
}
TEST
(
ElementsAreTest
,
CanDescribeExpectingManyElements
)
{
Matcher
<
list
<
string
>
>
m
=
ElementsAre
(
StrEq
(
"one"
),
"two"
);
EXPECT_EQ
(
"has 2 elements where
\n
"
"element 0 is equal to
\"
one
\"
,
\n
"
"element 1 is equal to
\"
two
\"
"
,
Describe
(
m
));
"element
#
0 is equal to
\"
one
\"
,
\n
"
"element
#
1 is equal to
\"
two
\"
"
,
Describe
(
m
));
}
TEST
(
ElementsAreTest
,
CanDescribeNegationOfExpectingNoElement
)
{
Matcher
<
vector
<
int
>
>
m
=
ElementsAre
();
EXPECT_EQ
(
"is
no
t empty"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is
n'
t empty"
,
DescribeNegation
(
m
));
}
TEST
(
ElementsAreTest
,
CanDescribeNegationOfExpectingOneElment
)
{
Matcher
<
const
list
<
int
>&
>
m
=
ElementsAre
(
Gt
(
5
));
EXPECT_EQ
(
"does
no
t have 1 element, or
\n
"
"element
0 is not greater than
5"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"does
n'
t have 1 element, or
\n
"
"element
#0 isn't >
5"
,
DescribeNegation
(
m
));
}
TEST
(
ElementsAreTest
,
CanDescribeNegationOfExpectingManyElements
)
{
Matcher
<
const
list
<
string
>&
>
m
=
ElementsAre
(
"one"
,
"two"
);
EXPECT_EQ
(
"does
no
t have 2 elements, or
\n
"
"element
0 is no
t equal to
\"
one
\"
, or
\n
"
"element
1 is no
t equal to
\"
two
\"
"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"does
n'
t have 2 elements, or
\n
"
"element
#0 isn'
t equal to
\"
one
\"
, or
\n
"
"element
#1 isn'
t equal to
\"
two
\"
"
,
DescribeNegation
(
m
));
}
TEST
(
ElementsAreTest
,
DoesNotExplainTrivialMatch
)
{
...
...
@@ -297,8 +334,9 @@ TEST(ElementsAreTest, ExplainsNonTrivialMatch) {
const
int
a
[]
=
{
10
,
0
,
100
};
vector
<
int
>
test_vector
(
a
,
a
+
GMOCK_ARRAY_SIZE_
(
a
));
EXPECT_EQ
(
"element 0 is 9 more than 1,
\n
"
"element 2 is 98 more than 2"
,
Explain
(
m
,
test_vector
));
EXPECT_EQ
(
"whose element #0 matches, which is 9 more than 1,
\n
"
"and whose element #2 matches, which is 98 more than 2"
,
Explain
(
m
,
test_vector
));
}
TEST
(
ElementsAreTest
,
CanExplainMismatchWrongSize
)
{
...
...
@@ -309,7 +347,7 @@ TEST(ElementsAreTest, CanExplainMismatchWrongSize) {
EXPECT_EQ
(
""
,
Explain
(
m
,
test_list
));
test_list
.
push_back
(
1
);
EXPECT_EQ
(
"has 1 element"
,
Explain
(
m
,
test_list
));
EXPECT_EQ
(
"
which
has 1 element"
,
Explain
(
m
,
test_list
));
}
TEST
(
ElementsAreTest
,
CanExplainMismatchRightSize
)
{
...
...
@@ -318,10 +356,11 @@ TEST(ElementsAreTest, CanExplainMismatchRightSize) {
vector
<
int
>
v
;
v
.
push_back
(
2
);
v
.
push_back
(
1
);
EXPECT_EQ
(
"
element
0 doesn't match"
,
Explain
(
m
,
v
));
EXPECT_EQ
(
"
whose element #
0 doesn't match"
,
Explain
(
m
,
v
));
v
[
0
]
=
1
;
EXPECT_EQ
(
"element 1 doesn't match (is 4 less than 5)"
,
Explain
(
m
,
v
));
EXPECT_EQ
(
"whose element #1 doesn't match, which is 4 less than 5"
,
Explain
(
m
,
v
));
}
TEST
(
ElementsAreTest
,
MatchesOneElementVector
)
{
...
...
@@ -1030,16 +1069,22 @@ TEST(ContainsTest, SetDoesNotMatchWhenElementIsNotInContainer) {
EXPECT_THAT
(
c_string_set
,
Not
(
Contains
(
string
(
"hello"
).
c_str
())));
}
TEST
(
ContainsTest
,
DescribesItself
Correctly
)
{
TEST
(
ContainsTest
,
ExplainsMatchResult
Correctly
)
{
const
int
a
[
2
]
=
{
1
,
2
};
Matcher
<
const
int
(
&
)[
2
]
>
m
=
Contains
(
2
);
EXPECT_EQ
(
"
element
1 matches"
,
Explain
(
m
,
a
));
EXPECT_EQ
(
"
whose element #
1 matches"
,
Explain
(
m
,
a
));
m
=
Contains
(
3
);
EXPECT_EQ
(
""
,
Explain
(
m
,
a
));
m
=
Contains
(
GreaterThan
(
0
));
EXPECT_EQ
(
"whose element #0 matches, which is 1 more than 0"
,
Explain
(
m
,
a
));
m
=
Contains
(
GreaterThan
(
10
));
EXPECT_EQ
(
""
,
Explain
(
m
,
a
));
}
TEST
(
ContainsTest
,
ExplainsMatchResult
Correctly
)
{
TEST
(
ContainsTest
,
DescribesItself
Correctly
)
{
Matcher
<
vector
<
int
>
>
m
=
Contains
(
1
);
EXPECT_EQ
(
"contains at least one element that is equal to 1"
,
Describe
(
m
));
...
...
test/gmock-matchers_test.cc
View file @
b1c7f93c
...
...
@@ -61,8 +61,10 @@ bool SkipPrefix(const char* prefix, const char** pstr);
namespace
gmock_matchers_test
{
using
std
::
make_pair
;
using
std
::
map
;
using
std
::
multimap
;
using
std
::
pair
;
using
std
::
stringstream
;
using
std
::
tr1
::
make_tuple
;
using
testing
::
A
;
...
...
@@ -71,9 +73,11 @@ using testing::AllOf;
using
testing
::
An
;
using
testing
::
AnyOf
;
using
testing
::
ByRef
;
using
testing
::
ContainsRegex
;
using
testing
::
DoubleEq
;
using
testing
::
EndsWith
;
using
testing
::
Eq
;
using
testing
::
ExplainMatchResult
;
using
testing
::
Field
;
using
testing
::
FloatEq
;
using
testing
::
Ge
;
...
...
@@ -85,12 +89,12 @@ using testing::Le;
using
testing
::
Lt
;
using
testing
::
MakeMatcher
;
using
testing
::
MakePolymorphicMatcher
;
using
testing
::
MatchResultListener
;
using
testing
::
Matcher
;
using
testing
::
MatcherCast
;
using
testing
::
MatcherInterface
;
using
testing
::
Matches
;
using
testing
::
ExplainMatchResult
;
using
testing
::
MatchResultListener
;
using
testing
::
MatchesRegex
;
using
testing
::
NanSensitiveDoubleEq
;
using
testing
::
NanSensitiveFloatEq
;
using
testing
::
Ne
;
...
...
@@ -112,17 +116,19 @@ using testing::TypedEq;
using
testing
::
Value
;
using
testing
::
_
;
using
testing
::
internal
::
DummyMatchResultListener
;
using
testing
::
internal
::
ExplainMatchFailureTupleTo
;
using
testing
::
internal
::
FloatingEqMatcher
;
using
testing
::
internal
::
FormatMatcherDescriptionSyntaxError
;
using
testing
::
internal
::
GetParamIndex
;
using
testing
::
internal
::
Interpolation
;
using
testing
::
internal
::
Interpolations
;
using
testing
::
internal
::
JoinAsTuple
;
using
testing
::
internal
::
RE
;
using
testing
::
internal
::
SkipPrefix
;
using
testing
::
internal
::
StreamMatchResultListener
;
using
testing
::
internal
::
String
;
using
testing
::
internal
::
Strings
;
using
testing
::
internal
::
StringMatchResultListener
;
using
testing
::
internal
::
Strings
;
using
testing
::
internal
::
ValidateMatcherDescription
;
using
testing
::
internal
::
kInvalidInterpolation
;
using
testing
::
internal
::
kPercentInterpolation
;
...
...
@@ -131,17 +137,13 @@ using testing::internal::linked_ptr;
using
testing
::
internal
::
scoped_ptr
;
using
testing
::
internal
::
string
;
using
testing
::
ContainsRegex
;
using
testing
::
MatchesRegex
;
using
testing
::
internal
::
RE
;
// For testing ExplainMatchResultTo().
class
GreaterThanMatcher
:
public
MatcherInterface
<
int
>
{
public
:
explicit
GreaterThanMatcher
(
int
rhs
)
:
rhs_
(
rhs
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is
greater than
"
<<
rhs_
;
*
os
<<
"is
>
"
<<
rhs_
;
}
virtual
bool
MatchAndExplain
(
int
lhs
,
...
...
@@ -757,7 +759,7 @@ TEST(GeTest, ImplementsGreaterThanOrEqual) {
// Tests that Ge(v) describes itself properly.
TEST
(
GeTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Ge
(
5
);
EXPECT_EQ
(
"is
greater than or equal to
5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
>=
5"
,
Describe
(
m
));
}
// Tests that Gt(v) matches anything > v.
...
...
@@ -771,7 +773,7 @@ TEST(GtTest, ImplementsGreaterThan) {
// Tests that Gt(v) describes itself properly.
TEST
(
GtTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Gt
(
5
);
EXPECT_EQ
(
"is
greater than
5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
>
5"
,
Describe
(
m
));
}
// Tests that Le(v) matches anything <= v.
...
...
@@ -785,7 +787,7 @@ TEST(LeTest, ImplementsLessThanOrEqual) {
// Tests that Le(v) describes itself properly.
TEST
(
LeTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Le
(
5
);
EXPECT_EQ
(
"is
less than or equal to
5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
<=
5"
,
Describe
(
m
));
}
// Tests that Lt(v) matches anything < v.
...
...
@@ -799,7 +801,7 @@ TEST(LtTest, ImplementsLessThan) {
// Tests that Lt(v) describes itself properly.
TEST
(
LtTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Lt
(
5
);
EXPECT_EQ
(
"is
less than
5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
<
5"
,
Describe
(
m
));
}
// Tests that Ne(v) matches anything != v.
...
...
@@ -813,7 +815,7 @@ TEST(NeTest, ImplementsNotEqual) {
// Tests that Ne(v) describes itself properly.
TEST
(
NeTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Ne
(
5
);
EXPECT_EQ
(
"is
no
t equal to 5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to 5"
,
Describe
(
m
));
}
// Tests that IsNull() matches any NULL pointer of any type.
...
...
@@ -876,7 +878,7 @@ TEST(IsNullTest, ReferenceToConstScopedPtr) {
TEST
(
IsNullTest
,
CanDescribeSelf
)
{
Matcher
<
int
*>
m
=
IsNull
();
EXPECT_EQ
(
"is NULL"
,
Describe
(
m
));
EXPECT_EQ
(
"is
no
t NULL"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is
n'
t NULL"
,
DescribeNegation
(
m
));
}
// Tests that NotNull() matches any non-NULL pointer of any type.
...
...
@@ -923,7 +925,7 @@ TEST(NotNullTest, ReferenceToConstScopedPtr) {
// Tests that NotNull() describes itself properly.
TEST
(
NotNullTest
,
CanDescribeSelf
)
{
Matcher
<
int
*>
m
=
NotNull
();
EXPECT_EQ
(
"is
no
t NULL"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t NULL"
,
Describe
(
m
));
}
// Tests that Ref(variable) matches an argument that references
...
...
@@ -973,6 +975,16 @@ TEST(RefTest, IsCovariant) {
EXPECT_FALSE
(
m1
.
Matches
(
base2
));
}
TEST
(
RefTest
,
ExplainsResult
)
{
int
n
=
0
;
EXPECT_THAT
(
Explain
(
Matcher
<
const
int
&>
(
Ref
(
n
)),
n
),
StartsWith
(
"which is located @"
));
int
m
=
0
;
EXPECT_THAT
(
Explain
(
Matcher
<
const
int
&>
(
Ref
(
n
)),
m
),
StartsWith
(
"which is located @"
));
}
// Tests string comparison matchers.
TEST
(
StrEqTest
,
MatchesEqualString
)
{
...
...
@@ -1013,7 +1025,7 @@ TEST(StrNeTest, MatchesUnequalString) {
TEST
(
StrNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
char
*>
m
=
StrNe
(
"Hi"
);
EXPECT_EQ
(
"is
no
t equal to
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to
\"
Hi
\"
"
,
Describe
(
m
));
}
TEST
(
StrCaseEqTest
,
MatchesEqualStringIgnoringCase
)
{
...
...
@@ -1072,7 +1084,7 @@ TEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
TEST
(
StrCaseNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
char
*>
m
=
StrCaseNe
(
"Hi"
);
EXPECT_EQ
(
"is
no
t equal to (ignoring case)
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to (ignoring case)
\"
Hi
\"
"
,
Describe
(
m
));
}
// Tests that HasSubstr() works for matching string-typed values.
...
...
@@ -1106,12 +1118,21 @@ TEST(HasSubstrTest, CanDescribeSelf) {
}
TEST
(
KeyTest
,
CanDescribeSelf
)
{
Matcher
<
const
std
::
pair
<
std
::
string
,
int
>&>
m
=
Key
(
"foo"
);
Matcher
<
const
pair
<
std
::
string
,
int
>&>
m
=
Key
(
"foo"
);
EXPECT_EQ
(
"has a key that is equal to
\"
foo
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"doesn't have a key that is equal to
\"
foo
\"
"
,
DescribeNegation
(
m
));
}
TEST
(
KeyTest
,
ExplainsResult
)
{
Matcher
<
pair
<
int
,
bool
>
>
m
=
Key
(
GreaterThan
(
10
));
EXPECT_EQ
(
"whose first field is a value which is 5 less than 10"
,
Explain
(
m
,
make_pair
(
5
,
true
)));
EXPECT_EQ
(
"whose first field is a value which is 5 more than 10"
,
Explain
(
m
,
make_pair
(
15
,
true
)));
}
TEST
(
KeyTest
,
MatchesCorrectly
)
{
std
::
pair
<
int
,
std
::
string
>
p
(
25
,
"foo"
);
pair
<
int
,
std
::
string
>
p
(
25
,
"foo"
);
EXPECT_THAT
(
p
,
Key
(
25
));
EXPECT_THAT
(
p
,
Not
(
Key
(
42
)));
EXPECT_THAT
(
p
,
Key
(
Ge
(
20
)));
...
...
@@ -1121,30 +1142,30 @@ TEST(KeyTest, MatchesCorrectly) {
TEST
(
KeyTest
,
SafelyCastsInnerMatcher
)
{
Matcher
<
int
>
is_positive
=
Gt
(
0
);
Matcher
<
int
>
is_negative
=
Lt
(
0
);
std
::
pair
<
char
,
bool
>
p
(
'a'
,
true
);
pair
<
char
,
bool
>
p
(
'a'
,
true
);
EXPECT_THAT
(
p
,
Key
(
is_positive
));
EXPECT_THAT
(
p
,
Not
(
Key
(
is_negative
)));
}
TEST
(
KeyTest
,
InsideContainsUsingMap
)
{
std
::
map
<
int
,
char
>
container
;
container
.
insert
(
std
::
make_pair
(
1
,
'a'
));
container
.
insert
(
std
::
make_pair
(
2
,
'b'
));
container
.
insert
(
std
::
make_pair
(
4
,
'c'
));
container
.
insert
(
make_pair
(
1
,
'a'
));
container
.
insert
(
make_pair
(
2
,
'b'
));
container
.
insert
(
make_pair
(
4
,
'c'
));
EXPECT_THAT
(
container
,
Contains
(
Key
(
1
)));
EXPECT_THAT
(
container
,
Not
(
Contains
(
Key
(
3
))));
}
TEST
(
KeyTest
,
InsideContainsUsingMultimap
)
{
std
::
multimap
<
int
,
char
>
container
;
container
.
insert
(
std
::
make_pair
(
1
,
'a'
));
container
.
insert
(
std
::
make_pair
(
2
,
'b'
));
container
.
insert
(
std
::
make_pair
(
4
,
'c'
));
container
.
insert
(
make_pair
(
1
,
'a'
));
container
.
insert
(
make_pair
(
2
,
'b'
));
container
.
insert
(
make_pair
(
4
,
'c'
));
EXPECT_THAT
(
container
,
Not
(
Contains
(
Key
(
25
))));
container
.
insert
(
std
::
make_pair
(
25
,
'd'
));
container
.
insert
(
make_pair
(
25
,
'd'
));
EXPECT_THAT
(
container
,
Contains
(
Key
(
25
)));
container
.
insert
(
std
::
make_pair
(
25
,
'e'
));
container
.
insert
(
make_pair
(
25
,
'e'
));
EXPECT_THAT
(
container
,
Contains
(
Key
(
25
)));
EXPECT_THAT
(
container
,
Contains
(
Key
(
1
)));
...
...
@@ -1153,25 +1174,25 @@ TEST(KeyTest, InsideContainsUsingMultimap) {
TEST
(
PairTest
,
Typing
)
{
// Test verifies the following type conversions can be compiled.
Matcher
<
const
std
::
pair
<
const
char
*
,
int
>&>
m1
=
Pair
(
"foo"
,
42
);
Matcher
<
const
std
::
pair
<
const
char
*
,
int
>
>
m2
=
Pair
(
"foo"
,
42
);
Matcher
<
std
::
pair
<
const
char
*
,
int
>
>
m3
=
Pair
(
"foo"
,
42
);
Matcher
<
const
pair
<
const
char
*
,
int
>&>
m1
=
Pair
(
"foo"
,
42
);
Matcher
<
const
pair
<
const
char
*
,
int
>
>
m2
=
Pair
(
"foo"
,
42
);
Matcher
<
pair
<
const
char
*
,
int
>
>
m3
=
Pair
(
"foo"
,
42
);
Matcher
<
std
::
pair
<
int
,
const
std
::
string
>
>
m4
=
Pair
(
25
,
"42"
);
Matcher
<
std
::
pair
<
const
std
::
string
,
int
>
>
m5
=
Pair
(
"25"
,
42
);
Matcher
<
pair
<
int
,
const
std
::
string
>
>
m4
=
Pair
(
25
,
"42"
);
Matcher
<
pair
<
const
std
::
string
,
int
>
>
m5
=
Pair
(
"25"
,
42
);
}
TEST
(
PairTest
,
CanDescribeSelf
)
{
Matcher
<
const
std
::
pair
<
std
::
string
,
int
>&>
m1
=
Pair
(
"foo"
,
42
);
Matcher
<
const
pair
<
std
::
string
,
int
>&>
m1
=
Pair
(
"foo"
,
42
);
EXPECT_EQ
(
"has a first field that is equal to
\"
foo
\"
"
", and has a second field that is equal to 42"
,
Describe
(
m1
));
EXPECT_EQ
(
"has a first field that is
no
t equal to
\"
foo
\"
"
", or has a second field that is
no
t equal to 42"
,
EXPECT_EQ
(
"has a first field that is
n'
t equal to
\"
foo
\"
"
", or has a second field that is
n'
t equal to 42"
,
DescribeNegation
(
m1
));
// Double and triple negation (1 or 2 times not and description of negation).
Matcher
<
const
std
::
pair
<
int
,
int
>&>
m2
=
Not
(
Pair
(
Not
(
13
),
42
));
EXPECT_EQ
(
"has a first field that is
no
t equal to 13"
Matcher
<
const
pair
<
int
,
int
>&>
m2
=
Not
(
Pair
(
Not
(
13
),
42
));
EXPECT_EQ
(
"has a first field that is
n'
t equal to 13"
", and has a second field that is equal to 42"
,
DescribeNegation
(
m2
));
}
...
...
@@ -1179,43 +1200,43 @@ TEST(PairTest, CanDescribeSelf) {
TEST
(
PairTest
,
CanExplainMatchResultTo
)
{
// If neither field matches, Pair() should explain about the first
// field.
const
Matcher
<
std
::
pair
<
int
,
int
>
>
m
=
Pair
(
GreaterThan
(
0
),
GreaterThan
(
0
));
const
Matcher
<
pair
<
int
,
int
>
>
m
=
Pair
(
GreaterThan
(
0
),
GreaterThan
(
0
));
EXPECT_EQ
(
"whose first field does not match, which is 1 less than 0"
,
Explain
(
m
,
std
::
make_pair
(
-
1
,
-
2
)));
Explain
(
m
,
make_pair
(
-
1
,
-
2
)));
// If the first field matches but the second doesn't, Pair() should
// explain about the second field.
EXPECT_EQ
(
"whose second field does not match, which is 2 less than 0"
,
Explain
(
m
,
std
::
make_pair
(
1
,
-
2
)));
Explain
(
m
,
make_pair
(
1
,
-
2
)));
// If the first field doesn't match but the second does, Pair()
// should explain about the first field.
EXPECT_EQ
(
"whose first field does not match, which is 1 less than 0"
,
Explain
(
m
,
std
::
make_pair
(
-
1
,
2
)));
Explain
(
m
,
make_pair
(
-
1
,
2
)));
// If both fields match, Pair() should explain about them both.
EXPECT_EQ
(
"whose both fields match, where the first field is a value "
"which is 1 more than 0, and the second field is a value "
"which is 2 more than 0"
,
Explain
(
m
,
std
::
make_pair
(
1
,
2
)));
Explain
(
m
,
make_pair
(
1
,
2
)));
// If only the first match has an explanation, only this explanation should
// be printed.
const
Matcher
<
std
::
pair
<
int
,
int
>
>
explain_first
=
Pair
(
GreaterThan
(
0
),
0
);
const
Matcher
<
pair
<
int
,
int
>
>
explain_first
=
Pair
(
GreaterThan
(
0
),
0
);
EXPECT_EQ
(
"whose both fields match, where the first field is a value "
"which is 1 more than 0"
,
Explain
(
explain_first
,
std
::
make_pair
(
1
,
0
)));
Explain
(
explain_first
,
make_pair
(
1
,
0
)));
// If only the second match has an explanation, only this explanation should
// be printed.
const
Matcher
<
std
::
pair
<
int
,
int
>
>
explain_second
=
Pair
(
0
,
GreaterThan
(
0
));
const
Matcher
<
pair
<
int
,
int
>
>
explain_second
=
Pair
(
0
,
GreaterThan
(
0
));
EXPECT_EQ
(
"whose both fields match, where the second field is a value "
"which is 1 more than 0"
,
Explain
(
explain_second
,
std
::
make_pair
(
0
,
1
)));
Explain
(
explain_second
,
make_pair
(
0
,
1
)));
}
TEST
(
PairTest
,
MatchesCorrectly
)
{
std
::
pair
<
int
,
std
::
string
>
p
(
25
,
"foo"
);
pair
<
int
,
std
::
string
>
p
(
25
,
"foo"
);
// Both fields match.
EXPECT_THAT
(
p
,
Pair
(
25
,
"foo"
));
...
...
@@ -1237,7 +1258,7 @@ TEST(PairTest, MatchesCorrectly) {
TEST
(
PairTest
,
SafelyCastsInnerMatchers
)
{
Matcher
<
int
>
is_positive
=
Gt
(
0
);
Matcher
<
int
>
is_negative
=
Lt
(
0
);
std
::
pair
<
char
,
bool
>
p
(
'a'
,
true
);
pair
<
char
,
bool
>
p
(
'a'
,
true
);
EXPECT_THAT
(
p
,
Pair
(
is_positive
,
_
));
EXPECT_THAT
(
p
,
Not
(
Pair
(
is_negative
,
_
)));
EXPECT_THAT
(
p
,
Pair
(
_
,
is_positive
));
...
...
@@ -1246,9 +1267,9 @@ TEST(PairTest, SafelyCastsInnerMatchers) {
TEST
(
PairTest
,
InsideContainsUsingMap
)
{
std
::
map
<
int
,
char
>
container
;
container
.
insert
(
std
::
make_pair
(
1
,
'a'
));
container
.
insert
(
std
::
make_pair
(
2
,
'b'
));
container
.
insert
(
std
::
make_pair
(
4
,
'c'
));
container
.
insert
(
make_pair
(
1
,
'a'
));
container
.
insert
(
make_pair
(
2
,
'b'
));
container
.
insert
(
make_pair
(
4
,
'c'
));
EXPECT_THAT
(
container
,
Contains
(
Pair
(
1
,
'a'
)));
EXPECT_THAT
(
container
,
Contains
(
Pair
(
1
,
_
)));
EXPECT_THAT
(
container
,
Contains
(
Pair
(
_
,
'a'
)));
...
...
@@ -1397,7 +1418,7 @@ TEST(StdWideStrNeTest, MatchesUnequalString) {
TEST
(
StdWideStrNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
wchar_t
*>
m
=
StrNe
(
L"Hi"
);
EXPECT_EQ
(
"is
no
t equal to L
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to L
\"
Hi
\"
"
,
Describe
(
m
));
}
TEST
(
StdWideStrCaseEqTest
,
MatchesEqualStringIgnoringCase
)
{
...
...
@@ -1456,7 +1477,7 @@ TEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
TEST
(
StdWideStrCaseNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
wchar_t
*>
m
=
StrCaseNe
(
L"Hi"
);
EXPECT_EQ
(
"is
no
t equal to (ignoring case) L
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to (ignoring case) L
\"
Hi
\"
"
,
Describe
(
m
));
}
// Tests that HasSubstr() works for matching wstring-typed values.
...
...
@@ -1588,7 +1609,7 @@ TEST(GlobalWideStrNeTest, MatchesUnequalString) {
TEST
(
GlobalWideStrNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
wchar_t
*>
m
=
StrNe
(
L"Hi"
);
EXPECT_EQ
(
"is
no
t equal to L
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to L
\"
Hi
\"
"
,
Describe
(
m
));
}
TEST
(
GlobalWideStrCaseEqTest
,
MatchesEqualStringIgnoringCase
)
{
...
...
@@ -1647,7 +1668,7 @@ TEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
TEST
(
GlobalWideStrCaseNeTest
,
CanDescribeSelf
)
{
Matcher
<
const
wchar_t
*>
m
=
StrCaseNe
(
L"Hi"
);
EXPECT_EQ
(
"is
no
t equal to (ignoring case) L
\"
Hi
\"
"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to (ignoring case) L
\"
Hi
\"
"
,
Describe
(
m
));
}
// Tests that HasSubstr() works for matching wstring-typed values.
...
...
@@ -1827,7 +1848,7 @@ TEST(NotTest, NegatesMatcher) {
// Tests that Not(m) describes itself properly.
TEST
(
NotTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
=
Not
(
Eq
(
5
));
EXPECT_EQ
(
"is
no
t equal to 5"
,
Describe
(
m
));
EXPECT_EQ
(
"is
n'
t equal to 5"
,
Describe
(
m
));
}
// Tests that monomorphic matchers are safely cast by the Not matcher.
...
...
@@ -1873,31 +1894,62 @@ TEST(AllOfTest, MatchesWhenAllMatch) {
TEST
(
AllOfTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
;
m
=
AllOf
(
Le
(
2
),
Ge
(
1
));
EXPECT_EQ
(
"(is less than or equal to 2) and "
"(is greater than or equal to 1)"
,
Describe
(
m
));
EXPECT_EQ
(
"(is <= 2) and (is >= 1)"
,
Describe
(
m
));
m
=
AllOf
(
Gt
(
0
),
Ne
(
1
),
Ne
(
2
));
EXPECT_EQ
(
"(is
greater than
0) and "
"((is
no
t equal to 1) and "
"(is
no
t equal to 2))"
,
EXPECT_EQ
(
"(is
>
0) and "
"((is
n'
t equal to 1) and "
"(is
n'
t equal to 2))"
,
Describe
(
m
));
m
=
AllOf
(
Gt
(
0
),
Ne
(
1
),
Ne
(
2
),
Ne
(
3
));
EXPECT_EQ
(
"(is
greater than
0) and "
"((is
no
t equal to 1) and "
"((is
no
t equal to 2) and "
"(is
no
t equal to 3)))"
,
EXPECT_EQ
(
"(is
>
0) and "
"((is
n'
t equal to 1) and "
"((is
n'
t equal to 2) and "
"(is
n'
t equal to 3)))"
,
Describe
(
m
));
m
=
AllOf
(
Ge
(
0
),
Lt
(
10
),
Ne
(
3
),
Ne
(
5
),
Ne
(
7
));
EXPECT_EQ
(
"(is greater than or equal to 0) and "
"((is less than 10) and "
"((is not equal to 3) and "
"((is not equal to 5) and "
"(is not equal to 7))))"
,
Describe
(
m
));
EXPECT_EQ
(
"(is >= 0) and "
"((is < 10) and "
"((isn't equal to 3) and "
"((isn't equal to 5) and "
"(isn't equal to 7))))"
,
Describe
(
m
));
}
// Tests that AllOf(m1, ..., mn) describes its negation properly.
TEST
(
AllOfTest
,
CanDescribeNegation
)
{
Matcher
<
int
>
m
;
m
=
AllOf
(
Le
(
2
),
Ge
(
1
));
EXPECT_EQ
(
"(isn't <= 2) or "
"(isn't >= 1)"
,
DescribeNegation
(
m
));
m
=
AllOf
(
Gt
(
0
),
Ne
(
1
),
Ne
(
2
));
EXPECT_EQ
(
"(isn't > 0) or "
"((is equal to 1) or "
"(is equal to 2))"
,
DescribeNegation
(
m
));
m
=
AllOf
(
Gt
(
0
),
Ne
(
1
),
Ne
(
2
),
Ne
(
3
));
EXPECT_EQ
(
"(isn't > 0) or "
"((is equal to 1) or "
"((is equal to 2) or "
"(is equal to 3)))"
,
DescribeNegation
(
m
));
m
=
AllOf
(
Ge
(
0
),
Lt
(
10
),
Ne
(
3
),
Ne
(
5
),
Ne
(
7
));
EXPECT_EQ
(
"(isn't >= 0) or "
"((isn't < 10) or "
"((is equal to 3) or "
"((is equal to 5) or "
"(is equal to 7))))"
,
DescribeNegation
(
m
));
}
// Tests that monomorphic matchers are safely cast by the AllOf matcher.
...
...
@@ -1915,6 +1967,49 @@ TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
Matcher
<
int
&>
m5
=
AllOf
(
greater_than_5
,
less_than_10
,
less_than_10
);
}
TEST
(
AllOfTest
,
ExplainsResult
)
{
Matcher
<
int
>
m
;
// Successful match. Both matchers need to explain. The second
// matcher doesn't give an explanation, so only the first matcher's
// explanation is printed.
m
=
AllOf
(
GreaterThan
(
10
),
Lt
(
30
));
EXPECT_EQ
(
"which is 15 more than 10"
,
Explain
(
m
,
25
));
// Successful match. Both matchers need to explain.
m
=
AllOf
(
GreaterThan
(
10
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 20 more than 10, and which is 10 more than 20"
,
Explain
(
m
,
30
));
// Successful match. All matchers need to explain. The second
// matcher doesn't given an explanation.
m
=
AllOf
(
GreaterThan
(
10
),
Lt
(
30
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 15 more than 10, and which is 5 more than 20"
,
Explain
(
m
,
25
));
// Successful match. All matchers need to explain.
m
=
AllOf
(
GreaterThan
(
10
),
GreaterThan
(
20
),
GreaterThan
(
30
));
EXPECT_EQ
(
"which is 30 more than 10, and which is 20 more than 20, "
"and which is 10 more than 30"
,
Explain
(
m
,
40
));
// Failed match. The first matcher, which failed, needs to
// explain.
m
=
AllOf
(
GreaterThan
(
10
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 5 less than 10"
,
Explain
(
m
,
5
));
// Failed match. The second matcher, which failed, needs to
// explain. Since it doesn't given an explanation, nothing is
// printed.
m
=
AllOf
(
GreaterThan
(
10
),
Lt
(
30
));
EXPECT_EQ
(
""
,
Explain
(
m
,
40
));
// Failed match. The second matcher, which failed, needs to
// explain.
m
=
AllOf
(
GreaterThan
(
10
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 5 less than 20"
,
Explain
(
m
,
15
));
}
// Tests that AnyOf(m1, ..., mn) matches any value that matches at
// least one of the given matchers.
TEST
(
AnyOfTest
,
MatchesWhenAnyMatches
)
{
...
...
@@ -1948,31 +2043,58 @@ TEST(AnyOfTest, MatchesWhenAnyMatches) {
TEST
(
AnyOfTest
,
CanDescribeSelf
)
{
Matcher
<
int
>
m
;
m
=
AnyOf
(
Le
(
1
),
Ge
(
3
));
EXPECT_EQ
(
"(is less than or equal to 1) or "
"(is greater than or equal to 3)"
,
EXPECT_EQ
(
"(is <= 1) or (is >= 3)"
,
Describe
(
m
));
m
=
AnyOf
(
Lt
(
0
),
Eq
(
1
),
Eq
(
2
));
EXPECT_EQ
(
"(is
less than
0) or "
EXPECT_EQ
(
"(is
<
0) or "
"((is equal to 1) or (is equal to 2))"
,
Describe
(
m
));
m
=
AnyOf
(
Lt
(
0
),
Eq
(
1
),
Eq
(
2
),
Eq
(
3
));
EXPECT_EQ
(
"(is
less than
0) or "
EXPECT_EQ
(
"(is
<
0) or "
"((is equal to 1) or "
"((is equal to 2) or "
"(is equal to 3)))"
,
Describe
(
m
));
m
=
AnyOf
(
Le
(
0
),
Gt
(
10
),
3
,
5
,
7
);
EXPECT_EQ
(
"(is
less than or equal to
0) or "
"((is
greater than
10) or "
EXPECT_EQ
(
"(is
<=
0) or "
"((is
>
10) or "
"((is equal to 3) or "
"((is equal to 5) or "
"(is equal to 7))))"
,
Describe
(
m
));
}
// Tests that AnyOf(m1, ..., mn) describes its negation properly.
TEST
(
AnyOfTest
,
CanDescribeNegation
)
{
Matcher
<
int
>
m
;
m
=
AnyOf
(
Le
(
1
),
Ge
(
3
));
EXPECT_EQ
(
"(isn't <= 1) and (isn't >= 3)"
,
DescribeNegation
(
m
));
m
=
AnyOf
(
Lt
(
0
),
Eq
(
1
),
Eq
(
2
));
EXPECT_EQ
(
"(isn't < 0) and "
"((isn't equal to 1) and (isn't equal to 2))"
,
DescribeNegation
(
m
));
m
=
AnyOf
(
Lt
(
0
),
Eq
(
1
),
Eq
(
2
),
Eq
(
3
));
EXPECT_EQ
(
"(isn't < 0) and "
"((isn't equal to 1) and "
"((isn't equal to 2) and "
"(isn't equal to 3)))"
,
DescribeNegation
(
m
));
m
=
AnyOf
(
Le
(
0
),
Gt
(
10
),
3
,
5
,
7
);
EXPECT_EQ
(
"(isn't <= 0) and "
"((isn't > 10) and "
"((isn't equal to 3) and "
"((isn't equal to 5) and "
"(isn't equal to 7))))"
,
DescribeNegation
(
m
));
}
// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
TEST
(
AnyOfTest
,
AnyOfMatcherSafelyCastsMonomorphicMatchers
)
{
// greater_than_5 and less_than_10 are monomorphic matchers.
...
...
@@ -1988,6 +2110,49 @@ TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
Matcher
<
int
&>
m5
=
AnyOf
(
greater_than_5
,
less_than_10
,
less_than_10
);
}
TEST
(
AnyOfTest
,
ExplainsResult
)
{
Matcher
<
int
>
m
;
// Failed match. Both matchers need to explain. The second
// matcher doesn't give an explanation, so only the first matcher's
// explanation is printed.
m
=
AnyOf
(
GreaterThan
(
10
),
Lt
(
0
));
EXPECT_EQ
(
"which is 5 less than 10"
,
Explain
(
m
,
5
));
// Failed match. Both matchers need to explain.
m
=
AnyOf
(
GreaterThan
(
10
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 5 less than 10, and which is 15 less than 20"
,
Explain
(
m
,
5
));
// Failed match. All matchers need to explain. The second
// matcher doesn't given an explanation.
m
=
AnyOf
(
GreaterThan
(
10
),
Gt
(
20
),
GreaterThan
(
30
));
EXPECT_EQ
(
"which is 5 less than 10, and which is 25 less than 30"
,
Explain
(
m
,
5
));
// Failed match. All matchers need to explain.
m
=
AnyOf
(
GreaterThan
(
10
),
GreaterThan
(
20
),
GreaterThan
(
30
));
EXPECT_EQ
(
"which is 5 less than 10, and which is 15 less than 20, "
"and which is 25 less than 30"
,
Explain
(
m
,
5
));
// Successful match. The first matcher, which succeeded, needs to
// explain.
m
=
AnyOf
(
GreaterThan
(
10
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 5 more than 10"
,
Explain
(
m
,
15
));
// Successful match. The second matcher, which succeeded, needs to
// explain. Since it doesn't given an explanation, nothing is
// printed.
m
=
AnyOf
(
GreaterThan
(
10
),
Lt
(
30
));
EXPECT_EQ
(
""
,
Explain
(
m
,
0
));
// Successful match. The second matcher, which succeeded, needs to
// explain.
m
=
AnyOf
(
GreaterThan
(
30
),
GreaterThan
(
20
));
EXPECT_EQ
(
"which is 5 more than 20"
,
Explain
(
m
,
25
));
}
// The following predicate function and predicate functor are for
// testing the Truly(predicate) matcher.
...
...
@@ -2181,14 +2346,13 @@ TEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
// resolved.
EXPECT_FATAL_FAILURE
(
ASSERT_THAT
(
n
,
::
testing
::
Gt
(
10
)),
"Value of: n
\n
"
"Expected: is
greater than
10
\n
"
"Expected: is
>
10
\n
"
" Actual: 5"
);
n
=
0
;
EXPECT_NONFATAL_FAILURE
(
EXPECT_THAT
(
n
,
::
testing
::
AllOf
(
::
testing
::
Le
(
7
),
::
testing
::
Ge
(
5
))),
"Value of: n
\n
"
"Expected: (is less than or equal to 7) and "
"(is greater than or equal to 5)
\n
"
"Expected: (is <= 7) and (is >= 5)
\n
"
" Actual: 0"
);
}
...
...
@@ -2205,7 +2369,7 @@ TEST(MatcherAssertionTest, WorksForByRefArguments) {
"Expected: does not reference the variable @"
);
// Tests the "Actual" part.
EXPECT_FATAL_FAILURE
(
ASSERT_THAT
(
n
,
::
testing
::
Not
(
::
testing
::
Ref
(
n
))),
"Actual: 0
(
is located @"
);
"Actual: 0
, which
is located @"
);
}
#if !GTEST_OS_SYMBIAN
...
...
@@ -2232,7 +2396,7 @@ TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
Matcher
<
int
>
is_greater_than_5
=
Gt
(
5
);
EXPECT_NONFATAL_FAILURE
(
EXPECT_THAT
(
5
,
is_greater_than_5
),
"Value of: 5
\n
"
"Expected: is
greater than
5
\n
"
"Expected: is
>
5
\n
"
" Actual: 5"
);
}
#endif // !GTEST_OS_SYMBIAN
...
...
@@ -2407,11 +2571,11 @@ TEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
TEST_F
(
FloatTest
,
FloatEqCanDescribeSelf
)
{
Matcher
<
float
>
m1
=
FloatEq
(
2.0
f
);
EXPECT_EQ
(
"is approximately 2"
,
Describe
(
m1
));
EXPECT_EQ
(
"is
no
t approximately 2"
,
DescribeNegation
(
m1
));
EXPECT_EQ
(
"is
n'
t approximately 2"
,
DescribeNegation
(
m1
));
Matcher
<
float
>
m2
=
FloatEq
(
0.5
f
);
EXPECT_EQ
(
"is approximately 0.5"
,
Describe
(
m2
));
EXPECT_EQ
(
"is
no
t approximately 0.5"
,
DescribeNegation
(
m2
));
EXPECT_EQ
(
"is
n'
t approximately 0.5"
,
DescribeNegation
(
m2
));
Matcher
<
float
>
m3
=
FloatEq
(
nan1_
);
EXPECT_EQ
(
"never matches"
,
Describe
(
m3
));
...
...
@@ -2421,15 +2585,15 @@ TEST_F(FloatTest, FloatEqCanDescribeSelf) {
TEST_F
(
FloatTest
,
NanSensitiveFloatEqCanDescribeSelf
)
{
Matcher
<
float
>
m1
=
NanSensitiveFloatEq
(
2.0
f
);
EXPECT_EQ
(
"is approximately 2"
,
Describe
(
m1
));
EXPECT_EQ
(
"is
no
t approximately 2"
,
DescribeNegation
(
m1
));
EXPECT_EQ
(
"is
n'
t approximately 2"
,
DescribeNegation
(
m1
));
Matcher
<
float
>
m2
=
NanSensitiveFloatEq
(
0.5
f
);
EXPECT_EQ
(
"is approximately 0.5"
,
Describe
(
m2
));
EXPECT_EQ
(
"is
no
t approximately 0.5"
,
DescribeNegation
(
m2
));
EXPECT_EQ
(
"is
n'
t approximately 0.5"
,
DescribeNegation
(
m2
));
Matcher
<
float
>
m3
=
NanSensitiveFloatEq
(
nan1_
);
EXPECT_EQ
(
"is NaN"
,
Describe
(
m3
));
EXPECT_EQ
(
"is
no
t NaN"
,
DescribeNegation
(
m3
));
EXPECT_EQ
(
"is
n'
t NaN"
,
DescribeNegation
(
m3
));
}
// Instantiate FloatingPointTest for testing doubles.
...
...
@@ -2462,11 +2626,11 @@ TEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
TEST_F
(
DoubleTest
,
DoubleEqCanDescribeSelf
)
{
Matcher
<
double
>
m1
=
DoubleEq
(
2.0
);
EXPECT_EQ
(
"is approximately 2"
,
Describe
(
m1
));
EXPECT_EQ
(
"is
no
t approximately 2"
,
DescribeNegation
(
m1
));
EXPECT_EQ
(
"is
n'
t approximately 2"
,
DescribeNegation
(
m1
));
Matcher
<
double
>
m2
=
DoubleEq
(
0.5
);
EXPECT_EQ
(
"is approximately 0.5"
,
Describe
(
m2
));
EXPECT_EQ
(
"is
no
t approximately 0.5"
,
DescribeNegation
(
m2
));
EXPECT_EQ
(
"is
n'
t approximately 0.5"
,
DescribeNegation
(
m2
));
Matcher
<
double
>
m3
=
DoubleEq
(
nan1_
);
EXPECT_EQ
(
"never matches"
,
Describe
(
m3
));
...
...
@@ -2476,15 +2640,15 @@ TEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
TEST_F
(
DoubleTest
,
NanSensitiveDoubleEqCanDescribeSelf
)
{
Matcher
<
double
>
m1
=
NanSensitiveDoubleEq
(
2.0
);
EXPECT_EQ
(
"is approximately 2"
,
Describe
(
m1
));
EXPECT_EQ
(
"is
no
t approximately 2"
,
DescribeNegation
(
m1
));
EXPECT_EQ
(
"is
n'
t approximately 2"
,
DescribeNegation
(
m1
));
Matcher
<
double
>
m2
=
NanSensitiveDoubleEq
(
0.5
);
EXPECT_EQ
(
"is approximately 0.5"
,
Describe
(
m2
));
EXPECT_EQ
(
"is
no
t approximately 0.5"
,
DescribeNegation
(
m2
));
EXPECT_EQ
(
"is
n'
t approximately 0.5"
,
DescribeNegation
(
m2
));
Matcher
<
double
>
m3
=
NanSensitiveDoubleEq
(
nan1_
);
EXPECT_EQ
(
"is NaN"
,
Describe
(
m3
));
EXPECT_EQ
(
"is
no
t NaN"
,
DescribeNegation
(
m3
));
EXPECT_EQ
(
"is
n'
t NaN"
,
DescribeNegation
(
m3
));
}
TEST
(
PointeeTest
,
RawPointer
)
{
...
...
@@ -2547,8 +2711,8 @@ TEST(PointeeTest, MatchesAgainstAValue) {
TEST
(
PointeeTest
,
CanDescribeSelf
)
{
const
Matcher
<
int
*>
m
=
Pointee
(
Gt
(
3
));
EXPECT_EQ
(
"points to a value that is
greater than
3"
,
Describe
(
m
));
EXPECT_EQ
(
"does not point to a value that is
greater than
3"
,
EXPECT_EQ
(
"points to a value that is
>
3"
,
Describe
(
m
));
EXPECT_EQ
(
"does not point to a value that is
>
3"
,
DescribeNegation
(
m
));
}
...
...
@@ -2693,10 +2857,8 @@ TEST(FieldTest, WorksForCompatibleMatcherType) {
TEST
(
FieldTest
,
CanDescribeSelf
)
{
Matcher
<
const
AStruct
&>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose given field is greater than or equal to 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given field is not greater than or equal to 0"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is an object whose given field is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given field isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Field() can explain the match result.
...
...
@@ -2764,10 +2926,8 @@ TEST(FieldForPointerTest, WorksForArgumentOfSubType) {
TEST
(
FieldForPointerTest
,
CanDescribeSelf
)
{
Matcher
<
const
AStruct
*>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose given field is greater than or equal to 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given field is not greater than or equal to 0"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is an object whose given field is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given field isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Field() can explain the result of matching a pointer.
...
...
@@ -2900,10 +3060,9 @@ TEST(PropertyTest, WorksForCompatibleMatcherType) {
TEST
(
PropertyTest
,
CanDescribeSelf
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose given property is greater than or equal to 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given property "
"is not greater than or equal to 0"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is an object whose given property is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given property isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Property() can explain the match result.
...
...
@@ -2980,10 +3139,9 @@ TEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
TEST
(
PropertyForPointerTest
,
CanDescribeSelf
)
{
Matcher
<
const
AClass
*>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose given property is greater than or equal to 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given property "
"is not greater than or equal to 0"
,
DescribeNegation
(
m
));
EXPECT_EQ
(
"is an object whose given property is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose given property isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Property() can explain the result of matching a pointer.
...
...
@@ -3021,7 +3179,7 @@ TEST(ResultOfTest, CanDescribeItself) {
EXPECT_EQ
(
"is mapped by the given callable to a value that "
"is equal to
\"
foo
\"
"
,
Describe
(
matcher
));
EXPECT_EQ
(
"is mapped by the given callable to a value that "
"is
no
t equal to
\"
foo
\"
"
,
DescribeNegation
(
matcher
));
"is
n'
t equal to
\"
foo
\"
"
,
DescribeNegation
(
matcher
));
}
// Tests that ResultOf() can explain the match result.
...
...
@@ -3173,7 +3331,7 @@ class DivisibleByImpl {
// For testing using ExplainMatchResultTo() with polymorphic matchers.
template
<
typename
T
>
bool
MatchAndExplain
(
const
T
&
n
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"is "
<<
(
n
%
divider_
)
<<
" modulo "
*
listener
<<
"
which
is "
<<
(
n
%
divider_
)
<<
" modulo "
<<
divider_
;
return
(
n
%
divider_
)
==
0
;
}
...
...
@@ -3201,28 +3359,28 @@ PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
// asked to explain why.
TEST
(
ExplainMatchResultTest
,
AllOf_False_False
)
{
const
Matcher
<
int
>
m
=
AllOf
(
DivisibleBy
(
4
),
DivisibleBy
(
3
));
EXPECT_EQ
(
"is 1 modulo 4"
,
Explain
(
m
,
5
));
EXPECT_EQ
(
"
which
is 1 modulo 4"
,
Explain
(
m
,
5
));
}
// Tests that when AllOf() fails, only the first failing matcher is
// asked to explain why.
TEST
(
ExplainMatchResultTest
,
AllOf_False_True
)
{
const
Matcher
<
int
>
m
=
AllOf
(
DivisibleBy
(
4
),
DivisibleBy
(
3
));
EXPECT_EQ
(
"is 2 modulo 4"
,
Explain
(
m
,
6
));
EXPECT_EQ
(
"
which
is 2 modulo 4"
,
Explain
(
m
,
6
));
}
// Tests that when AllOf() fails, only the first failing matcher is
// asked to explain why.
TEST
(
ExplainMatchResultTest
,
AllOf_True_False
)
{
const
Matcher
<
int
>
m
=
AllOf
(
Ge
(
1
),
DivisibleBy
(
3
));
EXPECT_EQ
(
"is 2 modulo 3"
,
Explain
(
m
,
5
));
EXPECT_EQ
(
"
which
is 2 modulo 3"
,
Explain
(
m
,
5
));
}
// Tests that when AllOf() succeeds, all matchers are asked to explain
// why.
TEST
(
ExplainMatchResultTest
,
AllOf_True_True
)
{
const
Matcher
<
int
>
m
=
AllOf
(
DivisibleBy
(
2
),
DivisibleBy
(
3
));
EXPECT_EQ
(
"
is 0 modulo 2;
is 0 modulo 3"
,
Explain
(
m
,
6
));
EXPECT_EQ
(
"
which is 0 modulo 2, and which
is 0 modulo 3"
,
Explain
(
m
,
6
));
}
TEST
(
ExplainMatchResultTest
,
AllOf_True_True_2
)
{
...
...
@@ -3309,7 +3467,8 @@ TYPED_TEST(ContainerEqTest, ValueMissing) {
TypeParam
test_set
(
test_vals
,
test_vals
+
4
);
const
Matcher
<
TypeParam
>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"Not in actual: 3"
,
Explain
(
m
,
test_set
));
EXPECT_EQ
(
"which doesn't have these expected elements: 3"
,
Explain
(
m
,
test_set
));
}
// Tests that added values are reported.
...
...
@@ -3320,7 +3479,7 @@ TYPED_TEST(ContainerEqTest, ValueAdded) {
TypeParam
test_set
(
test_vals
,
test_vals
+
6
);
const
Matcher
<
const
TypeParam
&>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"
Only in actual
: 46"
,
Explain
(
m
,
test_set
));
EXPECT_EQ
(
"
which has these unexpected elements
: 46"
,
Explain
(
m
,
test_set
));
}
// Tests that added and missing values are reported together.
...
...
@@ -3331,7 +3490,9 @@ TYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
TypeParam
test_set
(
test_vals
,
test_vals
+
5
);
const
Matcher
<
TypeParam
>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"Only in actual: 46; not in actual: 5"
,
Explain
(
m
,
test_set
));
EXPECT_EQ
(
"which has these unexpected elements: 46,
\n
"
"and doesn't have these expected elements: 5"
,
Explain
(
m
,
test_set
));
}
// Tests duplicated value -- expect no explanation.
...
...
@@ -3356,7 +3517,8 @@ TEST(ContainerEqExtraTest, MultipleValuesMissing) {
std
::
vector
<
int
>
test_set
(
test_vals
,
test_vals
+
3
);
const
Matcher
<
std
::
vector
<
int
>
>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"Not in actual: 3, 8"
,
Explain
(
m
,
test_set
));
EXPECT_EQ
(
"which doesn't have these expected elements: 3, 8"
,
Explain
(
m
,
test_set
));
}
// Tests that added values are reported.
...
...
@@ -3368,7 +3530,8 @@ TEST(ContainerEqExtraTest, MultipleValuesAdded) {
std
::
list
<
size_t
>
test_set
(
test_vals
,
test_vals
+
7
);
const
Matcher
<
const
std
::
list
<
size_t
>&>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"Only in actual: 92, 46"
,
Explain
(
m
,
test_set
));
EXPECT_EQ
(
"which has these unexpected elements: 92, 46"
,
Explain
(
m
,
test_set
));
}
// Tests that added and missing values are reported together.
...
...
@@ -3379,7 +3542,8 @@ TEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
std
::
list
<
size_t
>
test_set
(
test_vals
,
test_vals
+
5
);
const
Matcher
<
const
std
::
list
<
size_t
>
>
m
=
ContainerEq
(
my_set
);
EXPECT_FALSE
(
m
.
Matches
(
test_set
));
EXPECT_EQ
(
"Only in actual: 92, 46; not in actual: 5, 8"
,
EXPECT_EQ
(
"which has these unexpected elements: 92, 46,
\n
"
"and doesn't have these expected elements: 5, 8"
,
Explain
(
m
,
test_set
));
}
...
...
@@ -3412,7 +3576,8 @@ TEST(ContainerEqExtraTest, WorksForMaps) {
EXPECT_TRUE
(
m
.
Matches
(
my_map
));
EXPECT_FALSE
(
m
.
Matches
(
test_map
));
EXPECT_EQ
(
"Only in actual: (0,
\"
aa
\"
); not in actual: (0,
\"
a
\"
)"
,
EXPECT_EQ
(
"which has these unexpected elements: (0,
\"
aa
\"
),
\n
"
"and doesn't have these expected elements: (0,
\"
a
\"
)"
,
Explain
(
m
,
test_map
));
}
...
...
@@ -3795,5 +3960,29 @@ TEST(PolymorphicMatcherTest, CanAccessImpl) {
EXPECT_EQ
(
42
,
impl
.
divider
());
}
TEST
(
MatcherTupleTest
,
ExplainsMatchFailure
)
{
stringstream
ss1
;
ExplainMatchFailureTupleTo
(
make_tuple
(
Matcher
<
char
>
(
Eq
(
'a'
)),
GreaterThan
(
5
)),
make_tuple
(
'a'
,
10
),
&
ss1
);
EXPECT_EQ
(
""
,
ss1
.
str
());
// Successful match.
stringstream
ss2
;
ExplainMatchFailureTupleTo
(
make_tuple
(
GreaterThan
(
5
),
Matcher
<
char
>
(
Eq
(
'a'
))),
make_tuple
(
2
,
'b'
),
&
ss2
);
EXPECT_EQ
(
" Expected arg #0: is > 5
\n
"
" Actual: 2, which is 3 less than 5
\n
"
" Expected arg #1: is equal to 'a' (97)
\n
"
" Actual: 'b' (98)
\n
"
,
ss2
.
str
());
// Failed match where both arguments need explanation.
stringstream
ss3
;
ExplainMatchFailureTupleTo
(
make_tuple
(
GreaterThan
(
5
),
Matcher
<
char
>
(
Eq
(
'a'
))),
make_tuple
(
2
,
'a'
),
&
ss3
);
EXPECT_EQ
(
" Expected arg #0: is > 5
\n
"
" Actual: 2, which is 3 less than 5
\n
"
,
ss3
.
str
());
// Failed match where only one argument needs
// explanation.
}
}
// namespace gmock_matchers_test
}
// namespace testing
test/gmock_output_test_golden.txt
View file @
b1c7f93c
...
...
@@ -175,8 +175,8 @@ Google Mock tried the following 1 expectation, but it didn't match:
FILE:#: EXPECT_CALL(foo_, Bar(Ref(s), _, Ge(0)))...
Expected arg #0: references the variable @0x# "Hi"
Actual: "Ho"
(is located @0x#)
Expected arg #2: is
greater than or equal to
0
Actual: "Ho"
, which is located @0x#
Expected arg #2: is
>=
0
Actual: -0.1
Expected: to be called once
Actual: never called - unsatisfied and active
...
...
@@ -204,7 +204,7 @@ Unexpected mock function call - returning default value.
Google Mock tried the following 1 expectation, but it didn't match:
FILE:#: EXPECT_CALL(foo_, Bar2(Ge(2), Ge(1)))...
Expected arg #0: is
greater than or equal to
2
Expected arg #0: is
>=
2
Actual: 1
Expected args: are a pair (x, y) where x >= y
Actual: don't match
...
...
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