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
a31d9ce2
Commit
a31d9ce2
authored
Mar 01, 2013
by
zhanyong.wan
Browse files
Implements matcher SizeIs().
parent
83f6b08b
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
123 additions
and
0 deletions
+123
-0
include/gmock/gmock-matchers.h
include/gmock/gmock-matchers.h
+64
-0
test/gmock-matchers_test.cc
test/gmock-matchers_test.cc
+59
-0
No files found.
include/gmock/gmock-matchers.h
View file @
a31d9ce2
...
...
@@ -1972,6 +1972,58 @@ class ResultOfMatcher {
GTEST_DISALLOW_ASSIGN_
(
ResultOfMatcher
);
};
// Implements a matcher that checks the size of an STL-style container.
template
<
typename
SizeMatcher
>
class
SizeIsMatcher
{
public:
explicit
SizeIsMatcher
(
const
SizeMatcher
&
size_matcher
)
:
size_matcher_
(
size_matcher
)
{
}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
Impl
<
Container
>
(
size_matcher_
));
}
template
<
typename
Container
>
class
Impl
:
public
MatcherInterface
<
Container
>
{
public:
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
>
ContainerView
;
typedef
typename
ContainerView
::
type
::
size_type
SizeType
;
explicit
Impl
(
const
SizeMatcher
&
size_matcher
)
:
size_matcher_
(
MatcherCast
<
SizeType
>
(
size_matcher
))
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"size "
;
size_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"size "
;
size_matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
SizeType
size
=
container
.
size
();
StringMatchResultListener
size_listener
;
const
bool
result
=
size_matcher_
.
MatchAndExplain
(
size
,
&
size_listener
);
*
listener
<<
"whose size "
<<
size
<<
(
result
?
" matches"
:
" doesn't match"
);
PrintIfNotEmpty
(
size_listener
.
str
(),
listener
->
stream
());
return
result
;
}
private:
const
Matcher
<
SizeType
>
size_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
private:
const
SizeMatcher
size_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
SizeIsMatcher
);
};
// Implements an equality matcher for any STL-style container whose elements
// support ==. This matcher is like Eq(), but its failure explanations provide
// more detailed information that is useful when the container is used as a set.
...
...
@@ -3079,6 +3131,18 @@ Truly(Predicate pred) {
return
MakePolymorphicMatcher
(
internal
::
TrulyMatcher
<
Predicate
>
(
pred
));
}
// Returns a matcher that matches the container size. The container must
// support both size() and size_type which all STL-like containers provide.
// Note that the parameter 'size' can be a value of type size_type as well as
// matcher. For instance:
// EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
// EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
template
<
typename
SizeMatcher
>
inline
internal
::
SizeIsMatcher
<
SizeMatcher
>
SizeIs
(
const
SizeMatcher
&
size_matcher
)
{
return
internal
::
SizeIsMatcher
<
SizeMatcher
>
(
size_matcher
);
}
// Returns a matcher that matches an equal container.
// This matcher behaves like Eq(), but in the event of mismatch lists the
// values that are included in one container but not the other. (Duplicate
...
...
test/gmock-matchers_test.cc
View file @
a31d9ce2
...
...
@@ -114,6 +114,7 @@ using testing::PolymorphicMatcher;
using
testing
::
Property
;
using
testing
::
Ref
;
using
testing
::
ResultOf
;
using
testing
::
SizeIs
;
using
testing
::
StartsWith
;
using
testing
::
StrCaseEq
;
using
testing
::
StrCaseNe
;
...
...
@@ -3637,6 +3638,64 @@ TEST(IsEmptyTest, ExplainsResult) {
EXPECT_EQ
(
"whose size is 1"
,
Explain
(
m
,
container
));
}
TEST
(
SizeIsTest
,
ImplementsSizeIs
)
{
vector
<
int
>
container
;
EXPECT_THAT
(
container
,
SizeIs
(
0
));
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
1
)));
container
.
push_back
(
0
);
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
0
)));
EXPECT_THAT
(
container
,
SizeIs
(
1
));
container
.
push_back
(
0
);
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
0
)));
EXPECT_THAT
(
container
,
SizeIs
(
2
));
}
TEST
(
SizeIsTest
,
WorksWithMap
)
{
map
<
string
,
int
>
container
;
EXPECT_THAT
(
container
,
SizeIs
(
0
));
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
1
)));
container
.
insert
(
make_pair
(
"foo"
,
1
));
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
0
)));
EXPECT_THAT
(
container
,
SizeIs
(
1
));
container
.
insert
(
make_pair
(
"bar"
,
2
));
EXPECT_THAT
(
container
,
Not
(
SizeIs
(
0
)));
EXPECT_THAT
(
container
,
SizeIs
(
2
));
}
TEST
(
SizeIsTest
,
WorksWithReferences
)
{
vector
<
int
>
container
;
Matcher
<
const
vector
<
int
>&>
m
=
SizeIs
(
1
);
EXPECT_THAT
(
container
,
Not
(
m
));
container
.
push_back
(
0
);
EXPECT_THAT
(
container
,
m
);
}
TEST
(
SizeIsTest
,
CanDescribeSelf
)
{
Matcher
<
vector
<
int
>
>
m
=
SizeIs
(
2
);
EXPECT_EQ
(
"size is equal to 2"
,
Describe
(
m
));
EXPECT_EQ
(
"size isn't equal to 2"
,
DescribeNegation
(
m
));
}
TEST
(
SizeIsTest
,
ExplainsResult
)
{
Matcher
<
vector
<
int
>
>
m1
=
SizeIs
(
2
);
Matcher
<
vector
<
int
>
>
m2
=
SizeIs
(
Lt
(
2u
));
Matcher
<
vector
<
int
>
>
m3
=
SizeIs
(
AnyOf
(
0
,
3
));
Matcher
<
vector
<
int
>
>
m4
=
SizeIs
(
GreaterThan
(
1
));
vector
<
int
>
container
;
EXPECT_EQ
(
"whose size 0 doesn't match"
,
Explain
(
m1
,
container
));
EXPECT_EQ
(
"whose size 0 matches"
,
Explain
(
m2
,
container
));
EXPECT_EQ
(
"whose size 0 matches"
,
Explain
(
m3
,
container
));
EXPECT_EQ
(
"whose size 0 doesn't match, which is 1 less than 1"
,
Explain
(
m4
,
container
));
container
.
push_back
(
0
);
container
.
push_back
(
0
);
EXPECT_EQ
(
"whose size 2 matches"
,
Explain
(
m1
,
container
));
EXPECT_EQ
(
"whose size 2 doesn't match"
,
Explain
(
m2
,
container
));
EXPECT_EQ
(
"whose size 2 doesn't match"
,
Explain
(
m3
,
container
));
EXPECT_EQ
(
"whose size 2 matches, which is 1 more than 1"
,
Explain
(
m4
,
container
));
}
#if GTEST_HAS_TYPED_TEST
// Tests ContainerEq with different container types, and
// different element types.
...
...
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