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
0cd6a4f5
Commit
0cd6a4f5
authored
Apr 05, 2018
by
Gennadiy Civil
Browse files
Merging matchers test
parent
d81b6a0c
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
779 additions
and
40 deletions
+779
-40
googlemock/test/gmock-matchers_test.cc
googlemock/test/gmock-matchers_test.cc
+779
-40
No files found.
googlemock/test/gmock-matchers_test.cc
View file @
0cd6a4f5
...
...
@@ -157,9 +157,6 @@ using testing::internal::RE;
using
testing
::
internal
::
scoped_ptr
;
using
testing
::
internal
::
StreamMatchResultListener
;
using
testing
::
internal
::
Strings
;
using
testing
::
internal
::
linked_ptr
;
using
testing
::
internal
::
scoped_ptr
;
using
testing
::
internal
::
string
;
using
testing
::
make_tuple
;
using
testing
::
tuple
;
...
...
@@ -698,11 +695,69 @@ TEST(MatcherCastTest, FromSameType) {
EXPECT_FALSE
(
m2
.
Matches
(
1
));
}
// Tests that MatcherCast<T>(m) works when m is a value of the same type as the
// value type of the Matcher.
TEST
(
MatcherCastTest
,
FromAValue
)
{
Matcher
<
int
>
m
=
MatcherCast
<
int
>
(
42
);
EXPECT_TRUE
(
m
.
Matches
(
42
));
EXPECT_FALSE
(
m
.
Matches
(
239
));
}
// Tests that MatcherCast<T>(m) works when m is a value of the type implicitly
// convertible to the value type of the Matcher.
TEST
(
MatcherCastTest
,
FromAnImplicitlyConvertibleValue
)
{
const
int
kExpected
=
'c'
;
Matcher
<
int
>
m
=
MatcherCast
<
int
>
(
'c'
);
EXPECT_TRUE
(
m
.
Matches
(
kExpected
));
EXPECT_FALSE
(
m
.
Matches
(
kExpected
+
1
));
}
struct
NonImplicitlyConstructibleTypeWithOperatorEq
{
friend
bool
operator
==
(
const
NonImplicitlyConstructibleTypeWithOperatorEq
&
/* ignored */
,
int
rhs
)
{
return
42
==
rhs
;
}
friend
bool
operator
==
(
int
lhs
,
const
NonImplicitlyConstructibleTypeWithOperatorEq
&
/* ignored */
)
{
return
lhs
==
42
;
}
};
// Tests that MatcherCast<T>(m) works when m is a neither a matcher nor
// implicitly convertible to the value type of the Matcher, but the value type
// of the matcher has operator==() overload accepting m.
TEST
(
MatcherCastTest
,
NonImplicitlyConstructibleTypeWithOperatorEq
)
{
Matcher
<
NonImplicitlyConstructibleTypeWithOperatorEq
>
m1
=
MatcherCast
<
NonImplicitlyConstructibleTypeWithOperatorEq
>
(
42
);
EXPECT_TRUE
(
m1
.
Matches
(
NonImplicitlyConstructibleTypeWithOperatorEq
()));
Matcher
<
NonImplicitlyConstructibleTypeWithOperatorEq
>
m2
=
MatcherCast
<
NonImplicitlyConstructibleTypeWithOperatorEq
>
(
239
);
EXPECT_FALSE
(
m2
.
Matches
(
NonImplicitlyConstructibleTypeWithOperatorEq
()));
// When updating the following lines please also change the comment to
// namespace convertible_from_any.
Matcher
<
int
>
m3
=
MatcherCast
<
int
>
(
NonImplicitlyConstructibleTypeWithOperatorEq
());
EXPECT_TRUE
(
m3
.
Matches
(
42
));
EXPECT_FALSE
(
m3
.
Matches
(
239
));
}
// The below ConvertibleFromAny struct is implicitly constructible from anything
// and when in the same namespace can interact with other tests. In particular,
// if it is in the same namespace as other tests and one removes
// NonImplicitlyConstructibleTypeWithOperatorEq::operator==(int lhs, ...);
// then the corresponding test still compiles (and it should not!) by implicitly
// converting NonImplicitlyConstructibleTypeWithOperatorEq to ConvertibleFromAny
// in m3.Matcher().
namespace
convertible_from_any
{
// Implicitly convertible from any type.
struct
ConvertibleFromAny
{
ConvertibleFromAny
(
int
a_value
)
:
value
(
a_value
)
{}
template
<
typename
T
>
explicit
ConvertibleFromAny
(
const
T
&
/*a_value*/
)
:
value
(
-
1
)
{
ConvertibleFromAny
(
const
T
&
/*a_value*/
)
:
value
(
-
1
)
{
ADD_FAILURE
()
<<
"Conversion constructor called"
;
}
int
value
;
...
...
@@ -728,6 +783,7 @@ TEST(MatcherCastTest, FromConvertibleFromAny) {
EXPECT_TRUE
(
m
.
Matches
(
ConvertibleFromAny
(
1
)));
EXPECT_FALSE
(
m
.
Matches
(
ConvertibleFromAny
(
2
)));
}
}
// namespace convertible_from_any
struct
IntReferenceWrapper
{
IntReferenceWrapper
(
const
int
&
a_value
)
:
value
(
&
a_value
)
{}
...
...
@@ -833,6 +889,7 @@ TEST(SafeMatcherCastTest, FromSameType) {
EXPECT_FALSE
(
m2
.
Matches
(
1
));
}
namespace
convertible_from_any
{
TEST
(
SafeMatcherCastTest
,
ConversionConstructorIsUsed
)
{
Matcher
<
ConvertibleFromAny
>
m
=
SafeMatcherCast
<
ConvertibleFromAny
>
(
1
);
EXPECT_TRUE
(
m
.
Matches
(
ConvertibleFromAny
(
1
)));
...
...
@@ -845,6 +902,7 @@ TEST(SafeMatcherCastTest, FromConvertibleFromAny) {
EXPECT_TRUE
(
m
.
Matches
(
ConvertibleFromAny
(
1
)));
EXPECT_FALSE
(
m
.
Matches
(
ConvertibleFromAny
(
2
)));
}
}
// namespace convertible_from_any
TEST
(
SafeMatcherCastTest
,
ValueIsNotCopied
)
{
int
n
=
42
;
...
...
@@ -856,7 +914,7 @@ TEST(SafeMatcherCastTest, ValueIsNotCopied) {
TEST
(
ExpectThat
,
TakesLiterals
)
{
EXPECT_THAT
(
1
,
1
);
EXPECT_THAT
(
1.0
,
1.0
);
EXPECT_THAT
(
string
(),
""
);
EXPECT_THAT
(
std
::
string
(),
""
);
}
TEST
(
ExpectThat
,
TakesFunctions
)
{
...
...
@@ -956,15 +1014,11 @@ class Unprintable {
public:
Unprintable
()
:
c_
(
'a'
)
{}
bool
operator
==
(
const
Unprintable
&
/* rhs */
)
const
{
return
true
;
}
private:
char
c_
;
};
inline
bool
operator
==
(
const
Unprintable
&
/* lhs */
,
const
Unprintable
&
/* rhs */
)
{
return
true
;
}
TEST
(
EqTest
,
CanDescribeSelf
)
{
Matcher
<
Unprintable
>
m
=
Eq
(
Unprintable
());
EXPECT_EQ
(
"is equal to 1-byte object <61>"
,
Describe
(
m
));
...
...
@@ -1135,14 +1189,14 @@ TEST(IsNullTest, ReferenceToConstLinkedPtr) {
EXPECT_FALSE
(
m
.
Matches
(
non_null_p
));
}
#if GTEST_
HAS_STD_FUNCTION_
#if GTEST_
LANG_CXX11
TEST
(
IsNullTest
,
StdFunction
)
{
const
Matcher
<
std
::
function
<
void
()
>>
m
=
IsNull
();
EXPECT_TRUE
(
m
.
Matches
(
std
::
function
<
void
()
>
()));
EXPECT_FALSE
(
m
.
Matches
([]{}));
}
#endif // GTEST_
HAS_STD_FUNCTION_
#endif // GTEST_
LANG_CXX11
// Tests that IsNull() describes itself properly.
TEST
(
IsNullTest
,
CanDescribeSelf
)
{
...
...
@@ -1183,14 +1237,14 @@ TEST(NotNullTest, ReferenceToConstLinkedPtr) {
EXPECT_TRUE
(
m
.
Matches
(
non_null_p
));
}
#if GTEST_
HAS_STD_FUNCTION_
#if GTEST_
LANG_CXX11
TEST
(
NotNullTest
,
StdFunction
)
{
const
Matcher
<
std
::
function
<
void
()
>>
m
=
NotNull
();
EXPECT_TRUE
(
m
.
Matches
([]{}));
EXPECT_FALSE
(
m
.
Matches
(
std
::
function
<
void
()
>
()));
}
#endif // GTEST_
HAS_STD_FUNCTION_
#endif // GTEST_
LANG_CXX11
// Tests that NotNull() describes itself properly.
TEST
(
NotNullTest
,
CanDescribeSelf
)
{
...
...
@@ -2249,6 +2303,150 @@ TEST(Ne2Test, CanDescribeSelf) {
EXPECT_EQ
(
"are an unequal pair"
,
Describe
(
m
));
}
// Tests that FloatEq() matches a 2-tuple where
// FloatEq(first field) matches the second field.
TEST
(
FloatEq2Test
,
MatchesEqualArguments
)
{
typedef
::
testing
::
tuple
<
float
,
float
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
FloatEq
();
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
0.3
f
,
0.1
f
+
0.1
f
+
0.1
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.1
f
,
1.0
f
)));
}
// Tests that FloatEq() describes itself properly.
TEST
(
FloatEq2Test
,
CanDescribeSelf
)
{
Matcher
<
const
::
testing
::
tuple
<
float
,
float
>&>
m
=
FloatEq
();
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that NanSensitiveFloatEq() matches a 2-tuple where
// NanSensitiveFloatEq(first field) matches the second field.
TEST
(
NanSensitiveFloatEqTest
,
MatchesEqualArgumentsWithNaN
)
{
typedef
::
testing
::
tuple
<
float
,
float
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
NanSensitiveFloatEq
();
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
float
>::
quiet_NaN
(),
std
::
numeric_limits
<
float
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.1
f
,
1.0
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.0
f
,
std
::
numeric_limits
<
float
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
float
>::
quiet_NaN
(),
1.0
f
)));
}
// Tests that NanSensitiveFloatEq() describes itself properly.
TEST
(
NanSensitiveFloatEqTest
,
CanDescribeSelfWithNaNs
)
{
Matcher
<
const
::
testing
::
tuple
<
float
,
float
>&>
m
=
NanSensitiveFloatEq
();
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that DoubleEq() matches a 2-tuple where
// DoubleEq(first field) matches the second field.
TEST
(
DoubleEq2Test
,
MatchesEqualArguments
)
{
typedef
::
testing
::
tuple
<
double
,
double
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
DoubleEq
();
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
,
1.0
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
0.3
,
0.1
+
0.1
+
0.1
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.1
,
1.0
)));
}
// Tests that DoubleEq() describes itself properly.
TEST
(
DoubleEq2Test
,
CanDescribeSelf
)
{
Matcher
<
const
::
testing
::
tuple
<
double
,
double
>&>
m
=
DoubleEq
();
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that NanSensitiveDoubleEq() matches a 2-tuple where
// NanSensitiveDoubleEq(first field) matches the second field.
TEST
(
NanSensitiveDoubleEqTest
,
MatchesEqualArgumentsWithNaN
)
{
typedef
::
testing
::
tuple
<
double
,
double
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
NanSensitiveDoubleEq
();
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
double
>::
quiet_NaN
(),
std
::
numeric_limits
<
double
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.1
f
,
1.0
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.0
f
,
std
::
numeric_limits
<
double
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
double
>::
quiet_NaN
(),
1.0
f
)));
}
// Tests that DoubleEq() describes itself properly.
TEST
(
NanSensitiveDoubleEqTest
,
CanDescribeSelfWithNaNs
)
{
Matcher
<
const
::
testing
::
tuple
<
double
,
double
>&>
m
=
NanSensitiveDoubleEq
();
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that FloatEq() matches a 2-tuple where
// FloatNear(first field, max_abs_error) matches the second field.
TEST
(
FloatNear2Test
,
MatchesEqualArguments
)
{
typedef
::
testing
::
tuple
<
float
,
float
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
FloatNear
(
0.5
f
);
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.3
f
,
1.0
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.8
f
,
1.0
f
)));
}
// Tests that FloatNear() describes itself properly.
TEST
(
FloatNear2Test
,
CanDescribeSelf
)
{
Matcher
<
const
::
testing
::
tuple
<
float
,
float
>&>
m
=
FloatNear
(
0.5
f
);
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that NanSensitiveFloatNear() matches a 2-tuple where
// NanSensitiveFloatNear(first field) matches the second field.
TEST
(
NanSensitiveFloatNearTest
,
MatchesNearbyArgumentsWithNaN
)
{
typedef
::
testing
::
tuple
<
float
,
float
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
NanSensitiveFloatNear
(
0.5
f
);
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.1
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
float
>::
quiet_NaN
(),
std
::
numeric_limits
<
float
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.6
f
,
1.0
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.0
f
,
std
::
numeric_limits
<
float
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
float
>::
quiet_NaN
(),
1.0
f
)));
}
// Tests that NanSensitiveFloatNear() describes itself properly.
TEST
(
NanSensitiveFloatNearTest
,
CanDescribeSelfWithNaNs
)
{
Matcher
<
const
::
testing
::
tuple
<
float
,
float
>&>
m
=
NanSensitiveFloatNear
(
0.5
f
);
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that FloatEq() matches a 2-tuple where
// DoubleNear(first field, max_abs_error) matches the second field.
TEST
(
DoubleNear2Test
,
MatchesEqualArguments
)
{
typedef
::
testing
::
tuple
<
double
,
double
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
DoubleNear
(
0.5
);
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
,
1.0
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.3
,
1.0
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.8
,
1.0
)));
}
// Tests that DoubleNear() describes itself properly.
TEST
(
DoubleNear2Test
,
CanDescribeSelf
)
{
Matcher
<
const
::
testing
::
tuple
<
double
,
double
>&>
m
=
DoubleNear
(
0.5
);
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that NanSensitiveDoubleNear() matches a 2-tuple where
// NanSensitiveDoubleNear(first field) matches the second field.
TEST
(
NanSensitiveDoubleNearTest
,
MatchesNearbyArgumentsWithNaN
)
{
typedef
::
testing
::
tuple
<
double
,
double
>
Tpl
;
Matcher
<
const
Tpl
&>
m
=
NanSensitiveDoubleNear
(
0.5
f
);
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.0
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
1.1
f
,
1.0
f
)));
EXPECT_TRUE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
double
>::
quiet_NaN
(),
std
::
numeric_limits
<
double
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.6
f
,
1.0
f
)));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
1.0
f
,
std
::
numeric_limits
<
double
>::
quiet_NaN
())));
EXPECT_FALSE
(
m
.
Matches
(
Tpl
(
std
::
numeric_limits
<
double
>::
quiet_NaN
(),
1.0
f
)));
}
// Tests that NanSensitiveDoubleNear() describes itself properly.
TEST
(
NanSensitiveDoubleNearTest
,
CanDescribeSelfWithNaNs
)
{
Matcher
<
const
::
testing
::
tuple
<
double
,
double
>&>
m
=
NanSensitiveDoubleNear
(
0.5
f
);
EXPECT_EQ
(
"are an almost-equal pair"
,
Describe
(
m
));
}
// Tests that Not(m) matches any value that doesn't match m.
TEST
(
NotTest
,
NegatesMatcher
)
{
Matcher
<
int
>
m
;
...
...
@@ -2814,6 +3012,22 @@ TEST(ExplainMatchResultTest, WorksInsideMATCHER) {
EXPECT_THAT
(
0
,
Really
(
Eq
(
0
)));
}
TEST
(
DescribeMatcherTest
,
WorksWithValue
)
{
EXPECT_EQ
(
"is equal to 42"
,
DescribeMatcher
<
int
>
(
42
));
EXPECT_EQ
(
"isn't equal to 42"
,
DescribeMatcher
<
int
>
(
42
,
true
));
}
TEST
(
DescribeMatcherTest
,
WorksWithMonomorphicMatcher
)
{
const
Matcher
<
int
>
monomorphic
=
Le
(
0
);
EXPECT_EQ
(
"is <= 0"
,
DescribeMatcher
<
int
>
(
monomorphic
));
EXPECT_EQ
(
"isn't <= 0"
,
DescribeMatcher
<
int
>
(
monomorphic
,
true
));
}
TEST
(
DescribeMatcherTest
,
WorksWithPolymorphicMatcher
)
{
EXPECT_EQ
(
"is even"
,
DescribeMatcher
<
int
>
(
PolymorphicIsEven
()));
EXPECT_EQ
(
"is odd"
,
DescribeMatcher
<
int
>
(
PolymorphicIsEven
(),
true
));
}
TEST
(
AllArgsTest
,
WorksForTuple
)
{
EXPECT_THAT
(
make_tuple
(
1
,
2L
),
AllArgs
(
Lt
()));
EXPECT_THAT
(
make_tuple
(
2L
,
1
),
Not
(
AllArgs
(
Lt
())));
...
...
@@ -2943,18 +3157,22 @@ class FloatingPointTest : public testing::Test {
zero_bits_
(
Floating
(
0
).
bits
()),
one_bits_
(
Floating
(
1
).
bits
()),
infinity_bits_
(
Floating
(
Floating
::
Infinity
()).
bits
()),
close_to_positive_zero_
(
AsBits
(
zero_bits_
+
max_ulps_
/
2
)),
close_to_negative_zero_
(
AsBits
(
zero_bits_
+
max_ulps_
-
max_ulps_
/
2
)),
further_from_negative_zero_
(
-
AsBits
(
close_to_positive_zero_
(
Floating
::
ReinterpretBits
(
zero_bits_
+
max_ulps_
/
2
)),
close_to_negative_zero_
(
-
Floating
::
ReinterpretBits
(
zero_bits_
+
max_ulps_
-
max_ulps_
/
2
)),
further_from_negative_zero_
(
-
Floating
::
ReinterpretBits
(
zero_bits_
+
max_ulps_
+
1
-
max_ulps_
/
2
)),
close_to_one_
(
As
Bits
(
one_bits_
+
max_ulps_
)),
further_from_one_
(
As
Bits
(
one_bits_
+
max_ulps_
+
1
)),
close_to_one_
(
Floating
::
Reinterpret
Bits
(
one_bits_
+
max_ulps_
)),
further_from_one_
(
Floating
::
Reinterpret
Bits
(
one_bits_
+
max_ulps_
+
1
)),
infinity_
(
Floating
::
Infinity
()),
close_to_infinity_
(
AsBits
(
infinity_bits_
-
max_ulps_
)),
further_from_infinity_
(
AsBits
(
infinity_bits_
-
max_ulps_
-
1
)),
close_to_infinity_
(
Floating
::
ReinterpretBits
(
infinity_bits_
-
max_ulps_
)),
further_from_infinity_
(
Floating
::
ReinterpretBits
(
infinity_bits_
-
max_ulps_
-
1
)),
max_
(
Floating
::
Max
()),
nan1_
(
As
Bits
(
Floating
::
kExponentBitMask
|
1
)),
nan2_
(
As
Bits
(
Floating
::
kExponentBitMask
|
200
))
{
nan1_
(
Floating
::
Reinterpret
Bits
(
Floating
::
kExponentBitMask
|
1
)),
nan2_
(
Floating
::
Reinterpret
Bits
(
Floating
::
kExponentBitMask
|
200
))
{
}
void
TestSize
()
{
...
...
@@ -3009,7 +3227,7 @@ class FloatingPointTest : public testing::Test {
// Pre-calculated numbers to be used by the tests.
const
size_t
max_ulps_
;
const
Bits
max_ulps_
;
const
Bits
zero_bits_
;
// The bits that represent 0.0.
const
Bits
one_bits_
;
// The bits that represent 1.0.
...
...
@@ -3035,12 +3253,6 @@ class FloatingPointTest : public testing::Test {
// Some NaNs.
const
RawType
nan1_
;
const
RawType
nan2_
;
private:
template
<
typename
T
>
static
RawType
AsBits
(
T
value
)
{
return
Floating
::
ReinterpretBits
(
static_cast
<
Bits
>
(
value
));
}
};
// Tests floating-point matchers with fixed epsilons.
...
...
@@ -3417,8 +3629,6 @@ MATCHER_P(FieldIIs, inner_matcher, "") {
return
ExplainMatchResult
(
inner_matcher
,
arg
.
i
,
result_listener
);
}
#if GTEST_HAS_RTTI
TEST
(
WhenDynamicCastToTest
,
SameType
)
{
Derived
derived
;
derived
.
i
=
4
;
...
...
@@ -3476,8 +3686,12 @@ TEST(WhenDynamicCastToTest, AmbiguousCast) {
TEST
(
WhenDynamicCastToTest
,
Describe
)
{
Matcher
<
Base
*>
matcher
=
WhenDynamicCastTo
<
Derived
*>
(
Pointee
(
_
));
const
string
prefix
=
#if GTEST_HAS_RTTI
const
std
::
string
prefix
=
"when dynamic_cast to "
+
internal
::
GetTypeName
<
Derived
*>
()
+
", "
;
#else // GTEST_HAS_RTTI
const
std
::
string
prefix
=
"when dynamic_cast, "
;
#endif // GTEST_HAS_RTTI
EXPECT_EQ
(
prefix
+
"points to a value that is anything"
,
Describe
(
matcher
));
EXPECT_EQ
(
prefix
+
"does not point to a value that is anything"
,
DescribeNegation
(
matcher
));
...
...
@@ -3511,8 +3725,6 @@ TEST(WhenDynamicCastToTest, BadReference) {
EXPECT_THAT
(
as_base_ref
,
Not
(
WhenDynamicCastTo
<
const
OtherDerived
&>
(
_
)));
}
#endif // GTEST_HAS_RTTI
// Minimal const-propagating pointer.
template
<
typename
T
>
class
ConstPropagatingPtr
{
...
...
@@ -3632,11 +3844,14 @@ struct DerivedStruct : public AStruct {
// Tests that Field(&Foo::field, ...) works when field is non-const.
TEST
(
FieldTest
,
WorksForNonConstField
)
{
Matcher
<
AStruct
>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
Matcher
<
AStruct
>
m_with_name
=
Field
(
"x"
,
&
AStruct
::
x
,
Ge
(
0
));
AStruct
a
;
EXPECT_TRUE
(
m
.
Matches
(
a
));
EXPECT_TRUE
(
m_with_name
.
Matches
(
a
));
a
.
x
=
-
1
;
EXPECT_FALSE
(
m
.
Matches
(
a
));
EXPECT_FALSE
(
m_with_name
.
Matches
(
a
));
}
// Tests that Field(&Foo::field, ...) works when field is const.
...
...
@@ -3644,9 +3859,13 @@ TEST(FieldTest, WorksForConstField) {
AStruct
a
;
Matcher
<
AStruct
>
m
=
Field
(
&
AStruct
::
y
,
Ge
(
0.0
));
Matcher
<
AStruct
>
m_with_name
=
Field
(
"y"
,
&
AStruct
::
y
,
Ge
(
0.0
));
EXPECT_TRUE
(
m
.
Matches
(
a
));
EXPECT_TRUE
(
m_with_name
.
Matches
(
a
));
m
=
Field
(
&
AStruct
::
y
,
Le
(
0.0
));
m_with_name
=
Field
(
"y"
,
&
AStruct
::
y
,
Le
(
0.0
));
EXPECT_FALSE
(
m
.
Matches
(
a
));
EXPECT_FALSE
(
m_with_name
.
Matches
(
a
));
}
// Tests that Field(&Foo::field, ...) works when field is not copyable.
...
...
@@ -3720,6 +3939,14 @@ TEST(FieldTest, CanDescribeSelf) {
EXPECT_EQ
(
"is an object whose given field isn't >= 0"
,
DescribeNegation
(
m
));
}
TEST
(
FieldTest
,
CanDescribeSelfWithFieldName
)
{
Matcher
<
const
AStruct
&>
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose field `field_name` is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose field `field_name` isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Field() can explain the match result.
TEST
(
FieldTest
,
CanExplainMatchResult
)
{
Matcher
<
const
AStruct
&>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
...
...
@@ -3734,6 +3961,19 @@ TEST(FieldTest, CanExplainMatchResult) {
Explain
(
m
,
a
));
}
TEST
(
FieldTest
,
CanExplainMatchResultWithFieldName
)
{
Matcher
<
const
AStruct
&>
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
Ge
(
0
));
AStruct
a
;
a
.
x
=
1
;
EXPECT_EQ
(
"whose field `field_name` is 1"
+
OfType
(
"int"
),
Explain
(
m
,
a
));
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
GreaterThan
(
0
));
EXPECT_EQ
(
"whose field `field_name` is 1"
+
OfType
(
"int"
)
+
", which is 1 more than 0"
,
Explain
(
m
,
a
));
}
// Tests that Field() works when the argument is a pointer to const.
TEST
(
FieldForPointerTest
,
WorksForPointerToConst
)
{
Matcher
<
const
AStruct
*>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
...
...
@@ -3791,6 +4031,14 @@ TEST(FieldForPointerTest, CanDescribeSelf) {
EXPECT_EQ
(
"is an object whose given field isn't >= 0"
,
DescribeNegation
(
m
));
}
TEST
(
FieldForPointerTest
,
CanDescribeSelfWithFieldName
)
{
Matcher
<
const
AStruct
*>
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose field `field_name` is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose field `field_name` isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Field() can explain the result of matching a pointer.
TEST
(
FieldForPointerTest
,
CanExplainMatchResult
)
{
Matcher
<
const
AStruct
*>
m
=
Field
(
&
AStruct
::
x
,
Ge
(
0
));
...
...
@@ -3806,6 +4054,22 @@ TEST(FieldForPointerTest, CanExplainMatchResult) {
", which is 1 more than 0"
,
Explain
(
m
,
&
a
));
}
TEST
(
FieldForPointerTest
,
CanExplainMatchResultWithFieldName
)
{
Matcher
<
const
AStruct
*>
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
Ge
(
0
));
AStruct
a
;
a
.
x
=
1
;
EXPECT_EQ
(
""
,
Explain
(
m
,
static_cast
<
const
AStruct
*>
(
NULL
)));
EXPECT_EQ
(
"which points to an object whose field `field_name` is 1"
+
OfType
(
"int"
),
Explain
(
m
,
&
a
));
m
=
Field
(
"field_name"
,
&
AStruct
::
x
,
GreaterThan
(
0
));
EXPECT_EQ
(
"which points to an object whose field `field_name` is 1"
+
OfType
(
"int"
)
+
", which is 1 more than 0"
,
Explain
(
m
,
&
a
));
}
// A user-defined class for testing Property().
class
AClass
{
public:
...
...
@@ -3849,26 +4113,33 @@ class DerivedClass : public AClass {
// returns a non-reference.
TEST
(
PropertyTest
,
WorksForNonReferenceProperty
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
Matcher
<
const
AClass
&>
m_with_name
=
Property
(
"n"
,
&
AClass
::
n
,
Ge
(
0
));
AClass
a
;
a
.
set_n
(
1
);
EXPECT_TRUE
(
m
.
Matches
(
a
));
EXPECT_TRUE
(
m_with_name
.
Matches
(
a
));
a
.
set_n
(
-
1
);
EXPECT_FALSE
(
m
.
Matches
(
a
));
EXPECT_FALSE
(
m_with_name
.
Matches
(
a
));
}
// Tests that Property(&Foo::property, ...) works when property()
// returns a reference to const.
TEST
(
PropertyTest
,
WorksForReferenceToConstProperty
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
&
AClass
::
s
,
StartsWith
(
"hi"
));
Matcher
<
const
AClass
&>
m_with_name
=
Property
(
"s"
,
&
AClass
::
s
,
StartsWith
(
"hi"
));
AClass
a
;
a
.
set_s
(
"hill"
);
EXPECT_TRUE
(
m
.
Matches
(
a
));
EXPECT_TRUE
(
m_with_name
.
Matches
(
a
));
a
.
set_s
(
"hole"
);
EXPECT_FALSE
(
m
.
Matches
(
a
));
EXPECT_FALSE
(
m_with_name
.
Matches
(
a
));
}
#if GTEST_LANG_CXX11
...
...
@@ -3934,10 +4205,15 @@ TEST(PropertyTest, WorksForCompatibleMatcherType) {
Matcher
<
const
AClass
&>
m
=
Property
(
&
AClass
::
n
,
Matcher
<
signed
char
>
(
Ge
(
0
)));
Matcher
<
const
AClass
&>
m_with_name
=
Property
(
"n"
,
&
AClass
::
n
,
Matcher
<
signed
char
>
(
Ge
(
0
)));
AClass
a
;
EXPECT_TRUE
(
m
.
Matches
(
a
));
EXPECT_TRUE
(
m_with_name
.
Matches
(
a
));
a
.
set_n
(
-
1
);
EXPECT_FALSE
(
m
.
Matches
(
a
));
EXPECT_FALSE
(
m_with_name
.
Matches
(
a
));
}
// Tests that Property() can describe itself.
...
...
@@ -3949,6 +4225,14 @@ TEST(PropertyTest, CanDescribeSelf) {
DescribeNegation
(
m
));
}
TEST
(
PropertyTest
,
CanDescribeSelfWithPropertyName
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose property `fancy_name` is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose property `fancy_name` isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Property() can explain the match result.
TEST
(
PropertyTest
,
CanExplainMatchResult
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
...
...
@@ -3963,6 +4247,19 @@ TEST(PropertyTest, CanExplainMatchResult) {
Explain
(
m
,
a
));
}
TEST
(
PropertyTest
,
CanExplainMatchResultWithPropertyName
)
{
Matcher
<
const
AClass
&>
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
Ge
(
0
));
AClass
a
;
a
.
set_n
(
1
);
EXPECT_EQ
(
"whose property `fancy_name` is 1"
+
OfType
(
"int"
),
Explain
(
m
,
a
));
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
GreaterThan
(
0
));
EXPECT_EQ
(
"whose property `fancy_name` is 1"
+
OfType
(
"int"
)
+
", which is 1 more than 0"
,
Explain
(
m
,
a
));
}
// Tests that Property() works when the argument is a pointer to const.
TEST
(
PropertyForPointerTest
,
WorksForPointerToConst
)
{
Matcher
<
const
AClass
*>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
...
...
@@ -4030,6 +4327,14 @@ TEST(PropertyForPointerTest, CanDescribeSelf) {
DescribeNegation
(
m
));
}
TEST
(
PropertyForPointerTest
,
CanDescribeSelfWithPropertyDescription
)
{
Matcher
<
const
AClass
*>
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
Ge
(
0
));
EXPECT_EQ
(
"is an object whose property `fancy_name` is >= 0"
,
Describe
(
m
));
EXPECT_EQ
(
"is an object whose property `fancy_name` isn't >= 0"
,
DescribeNegation
(
m
));
}
// Tests that Property() can explain the result of matching a pointer.
TEST
(
PropertyForPointerTest
,
CanExplainMatchResult
)
{
Matcher
<
const
AClass
*>
m
=
Property
(
&
AClass
::
n
,
Ge
(
0
));
...
...
@@ -4047,6 +4352,22 @@ TEST(PropertyForPointerTest, CanExplainMatchResult) {
Explain
(
m
,
&
a
));
}
TEST
(
PropertyForPointerTest
,
CanExplainMatchResultWithPropertyName
)
{
Matcher
<
const
AClass
*>
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
Ge
(
0
));
AClass
a
;
a
.
set_n
(
1
);
EXPECT_EQ
(
""
,
Explain
(
m
,
static_cast
<
const
AClass
*>
(
NULL
)));
EXPECT_EQ
(
"which points to an object whose property `fancy_name` is 1"
+
OfType
(
"int"
),
Explain
(
m
,
&
a
));
m
=
Property
(
"fancy_name"
,
&
AClass
::
n
,
GreaterThan
(
0
));
EXPECT_EQ
(
"which points to an object whose property `fancy_name` is 1"
+
OfType
(
"int"
)
+
", which is 1 more than 0"
,
Explain
(
m
,
&
a
));
}
// Tests ResultOf.
// Tests that ResultOf(f, ...) compiles and works as expected when f is a
...
...
@@ -4162,11 +4483,8 @@ TEST(ResultOfTest, WorksForFunctionReferences) {
// Tests that ResultOf(f, ...) compiles and works as expected when f is a
// function object.
struct
Functor
{
typedef
std
::
string
result_type
;
typedef
int
argument_type
;
std
::
string
operator
()(
int
input
)
const
{
struct
Functor
:
public
::
std
::
unary_function
<
int
,
std
::
string
>
{
result_type
operator
()(
argument_type
input
)
const
{
return
IntToStringFunction
(
input
);
}
};
...
...
@@ -4360,6 +4678,44 @@ TEST(IsEmptyTest, ExplainsResult) {
EXPECT_EQ
(
"whose size is 1"
,
Explain
(
m
,
container
));
}
TEST
(
IsTrueTest
,
IsTrueIsFalse
)
{
EXPECT_THAT
(
true
,
IsTrue
());
EXPECT_THAT
(
false
,
IsFalse
());
EXPECT_THAT
(
true
,
Not
(
IsFalse
()));
EXPECT_THAT
(
false
,
Not
(
IsTrue
()));
EXPECT_THAT
(
0
,
Not
(
IsTrue
()));
EXPECT_THAT
(
0
,
IsFalse
());
EXPECT_THAT
(
NULL
,
Not
(
IsTrue
()));
EXPECT_THAT
(
NULL
,
IsFalse
());
EXPECT_THAT
(
-
1
,
IsTrue
());
EXPECT_THAT
(
-
1
,
Not
(
IsFalse
()));
EXPECT_THAT
(
1
,
IsTrue
());
EXPECT_THAT
(
1
,
Not
(
IsFalse
()));
EXPECT_THAT
(
2
,
IsTrue
());
EXPECT_THAT
(
2
,
Not
(
IsFalse
()));
int
a
=
42
;
EXPECT_THAT
(
a
,
IsTrue
());
EXPECT_THAT
(
a
,
Not
(
IsFalse
()));
EXPECT_THAT
(
&
a
,
IsTrue
());
EXPECT_THAT
(
&
a
,
Not
(
IsFalse
()));
EXPECT_THAT
(
false
,
Not
(
IsTrue
()));
EXPECT_THAT
(
true
,
Not
(
IsFalse
()));
#if GTEST_LANG_CXX11
EXPECT_THAT
(
std
::
true_type
(),
IsTrue
());
EXPECT_THAT
(
std
::
true_type
(),
Not
(
IsFalse
()));
EXPECT_THAT
(
std
::
false_type
(),
IsFalse
());
EXPECT_THAT
(
std
::
false_type
(),
Not
(
IsTrue
()));
EXPECT_THAT
(
nullptr
,
Not
(
IsTrue
()));
EXPECT_THAT
(
nullptr
,
IsFalse
());
std
::
unique_ptr
<
int
>
null_unique
;
std
::
unique_ptr
<
int
>
nonnull_unique
(
new
int
(
0
));
EXPECT_THAT
(
null_unique
,
Not
(
IsTrue
()));
EXPECT_THAT
(
null_unique
,
IsFalse
());
EXPECT_THAT
(
nonnull_unique
,
IsTrue
());
EXPECT_THAT
(
nonnull_unique
,
Not
(
IsFalse
()));
#endif // GTEST_LANG_CXX11
}
TEST
(
SizeIsTest
,
ImplementsSizeIs
)
{
vector
<
int
>
container
;
EXPECT_THAT
(
container
,
SizeIs
(
0
));
...
...
@@ -4914,6 +5270,250 @@ TEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {
EXPECT_THAT
(
s
,
Not
(
WhenSorted
(
ElementsAre
(
2
,
1
,
4
,
5
,
3
))));
}
TEST
(
IsSupersetOfTest
,
WorksForNativeArray
)
{
const
int
subset
[]
=
{
1
,
4
};
const
int
superset
[]
=
{
1
,
2
,
4
};
const
int
disjoint
[]
=
{
1
,
0
,
3
};
EXPECT_THAT
(
subset
,
IsSupersetOf
(
subset
));
EXPECT_THAT
(
subset
,
Not
(
IsSupersetOf
(
superset
)));
EXPECT_THAT
(
superset
,
IsSupersetOf
(
subset
));
EXPECT_THAT
(
subset
,
Not
(
IsSupersetOf
(
disjoint
)));
EXPECT_THAT
(
disjoint
,
Not
(
IsSupersetOf
(
subset
)));
}
TEST
(
IsSupersetOfTest
,
WorksWithDuplicates
)
{
const
int
not_enough
[]
=
{
1
,
2
};
const
int
enough
[]
=
{
1
,
1
,
2
};
const
int
expected
[]
=
{
1
,
1
};
EXPECT_THAT
(
not_enough
,
Not
(
IsSupersetOf
(
expected
)));
EXPECT_THAT
(
enough
,
IsSupersetOf
(
expected
));
}
TEST
(
IsSupersetOfTest
,
WorksForEmpty
)
{
vector
<
int
>
numbers
;
vector
<
int
>
expected
;
EXPECT_THAT
(
numbers
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
1
);
EXPECT_THAT
(
numbers
,
Not
(
IsSupersetOf
(
expected
)));
expected
.
clear
();
numbers
.
push_back
(
1
);
numbers
.
push_back
(
2
);
EXPECT_THAT
(
numbers
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
1
);
EXPECT_THAT
(
numbers
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
2
);
EXPECT_THAT
(
numbers
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
3
);
EXPECT_THAT
(
numbers
,
Not
(
IsSupersetOf
(
expected
)));
}
TEST
(
IsSupersetOfTest
,
WorksForStreamlike
)
{
const
int
a
[
5
]
=
{
1
,
2
,
3
,
4
,
5
};
Streamlike
<
int
>
s
(
a
,
a
+
GTEST_ARRAY_SIZE_
(
a
));
vector
<
int
>
expected
;
expected
.
push_back
(
1
);
expected
.
push_back
(
2
);
expected
.
push_back
(
5
);
EXPECT_THAT
(
s
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
0
);
EXPECT_THAT
(
s
,
Not
(
IsSupersetOf
(
expected
)));
}
TEST
(
IsSupersetOfTest
,
TakesStlContainer
)
{
const
int
actual
[]
=
{
3
,
1
,
2
};
::
std
::
list
<
int
>
expected
;
expected
.
push_back
(
1
);
expected
.
push_back
(
3
);
EXPECT_THAT
(
actual
,
IsSupersetOf
(
expected
));
expected
.
push_back
(
4
);
EXPECT_THAT
(
actual
,
Not
(
IsSupersetOf
(
expected
)));
}
TEST
(
IsSupersetOfTest
,
Describe
)
{
typedef
std
::
vector
<
int
>
IntVec
;
IntVec
expected
;
expected
.
push_back
(
111
);
expected
.
push_back
(
222
);
expected
.
push_back
(
333
);
EXPECT_THAT
(
Describe
<
IntVec
>
(
IsSupersetOf
(
expected
)),
Eq
(
"a surjection from elements to requirements exists such that:
\n
"
" - an element is equal to 111
\n
"
" - an element is equal to 222
\n
"
" - an element is equal to 333"
));
}
TEST
(
IsSupersetOfTest
,
DescribeNegation
)
{
typedef
std
::
vector
<
int
>
IntVec
;
IntVec
expected
;
expected
.
push_back
(
111
);
expected
.
push_back
(
222
);
expected
.
push_back
(
333
);
EXPECT_THAT
(
DescribeNegation
<
IntVec
>
(
IsSupersetOf
(
expected
)),
Eq
(
"no surjection from elements to requirements exists such that:
\n
"
" - an element is equal to 111
\n
"
" - an element is equal to 222
\n
"
" - an element is equal to 333"
));
}
TEST
(
IsSupersetOfTest
,
MatchAndExplain
)
{
std
::
vector
<
int
>
v
;
v
.
push_back
(
2
);
v
.
push_back
(
3
);
std
::
vector
<
int
>
expected
;
expected
.
push_back
(
1
);
expected
.
push_back
(
2
);
StringMatchResultListener
listener
;
ASSERT_FALSE
(
ExplainMatchResult
(
IsSupersetOf
(
expected
),
v
,
&
listener
))
<<
listener
.
str
();
EXPECT_THAT
(
listener
.
str
(),
Eq
(
"where the following matchers don't match any elements:
\n
"
"matcher #0: is equal to 1"
));
v
.
push_back
(
1
);
listener
.
Clear
();
ASSERT_TRUE
(
ExplainMatchResult
(
IsSupersetOf
(
expected
),
v
,
&
listener
))
<<
listener
.
str
();
EXPECT_THAT
(
listener
.
str
(),
Eq
(
"where:
\n
"
" - element #0 is matched by matcher #1,
\n
"
" - element #2 is matched by matcher #0"
));
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
TEST
(
IsSupersetOfTest
,
WorksForRhsInitializerList
)
{
const
int
numbers
[]
=
{
1
,
3
,
6
,
2
,
4
,
5
};
EXPECT_THAT
(
numbers
,
IsSupersetOf
({
1
,
2
}));
EXPECT_THAT
(
numbers
,
Not
(
IsSupersetOf
({
3
,
0
})));
}
#endif
TEST
(
IsSubsetOfTest
,
WorksForNativeArray
)
{
const
int
subset
[]
=
{
1
,
4
};
const
int
superset
[]
=
{
1
,
2
,
4
};
const
int
disjoint
[]
=
{
1
,
0
,
3
};
EXPECT_THAT
(
subset
,
IsSubsetOf
(
subset
));
EXPECT_THAT
(
subset
,
IsSubsetOf
(
superset
));
EXPECT_THAT
(
superset
,
Not
(
IsSubsetOf
(
subset
)));
EXPECT_THAT
(
subset
,
Not
(
IsSubsetOf
(
disjoint
)));
EXPECT_THAT
(
disjoint
,
Not
(
IsSubsetOf
(
subset
)));
}
TEST
(
IsSubsetOfTest
,
WorksWithDuplicates
)
{
const
int
not_enough
[]
=
{
1
,
2
};
const
int
enough
[]
=
{
1
,
1
,
2
};
const
int
actual
[]
=
{
1
,
1
};
EXPECT_THAT
(
actual
,
Not
(
IsSubsetOf
(
not_enough
)));
EXPECT_THAT
(
actual
,
IsSubsetOf
(
enough
));
}
TEST
(
IsSubsetOfTest
,
WorksForEmpty
)
{
vector
<
int
>
numbers
;
vector
<
int
>
expected
;
EXPECT_THAT
(
numbers
,
IsSubsetOf
(
expected
));
expected
.
push_back
(
1
);
EXPECT_THAT
(
numbers
,
IsSubsetOf
(
expected
));
expected
.
clear
();
numbers
.
push_back
(
1
);
numbers
.
push_back
(
2
);
EXPECT_THAT
(
numbers
,
Not
(
IsSubsetOf
(
expected
)));
expected
.
push_back
(
1
);
EXPECT_THAT
(
numbers
,
Not
(
IsSubsetOf
(
expected
)));
expected
.
push_back
(
2
);
EXPECT_THAT
(
numbers
,
IsSubsetOf
(
expected
));
expected
.
push_back
(
3
);
EXPECT_THAT
(
numbers
,
IsSubsetOf
(
expected
));
}
TEST
(
IsSubsetOfTest
,
WorksForStreamlike
)
{
const
int
a
[
5
]
=
{
1
,
2
};
Streamlike
<
int
>
s
(
a
,
a
+
GTEST_ARRAY_SIZE_
(
a
));
vector
<
int
>
expected
;
expected
.
push_back
(
1
);
EXPECT_THAT
(
s
,
Not
(
IsSubsetOf
(
expected
)));
expected
.
push_back
(
2
);
expected
.
push_back
(
5
);
EXPECT_THAT
(
s
,
IsSubsetOf
(
expected
));
}
TEST
(
IsSubsetOfTest
,
TakesStlContainer
)
{
const
int
actual
[]
=
{
3
,
1
,
2
};
::
std
::
list
<
int
>
expected
;
expected
.
push_back
(
1
);
expected
.
push_back
(
3
);
EXPECT_THAT
(
actual
,
Not
(
IsSubsetOf
(
expected
)));
expected
.
push_back
(
2
);
expected
.
push_back
(
4
);
EXPECT_THAT
(
actual
,
IsSubsetOf
(
expected
));
}
TEST
(
IsSubsetOfTest
,
Describe
)
{
typedef
std
::
vector
<
int
>
IntVec
;
IntVec
expected
;
expected
.
push_back
(
111
);
expected
.
push_back
(
222
);
expected
.
push_back
(
333
);
EXPECT_THAT
(
Describe
<
IntVec
>
(
IsSubsetOf
(
expected
)),
Eq
(
"an injection from elements to requirements exists such that:
\n
"
" - an element is equal to 111
\n
"
" - an element is equal to 222
\n
"
" - an element is equal to 333"
));
}
TEST
(
IsSubsetOfTest
,
DescribeNegation
)
{
typedef
std
::
vector
<
int
>
IntVec
;
IntVec
expected
;
expected
.
push_back
(
111
);
expected
.
push_back
(
222
);
expected
.
push_back
(
333
);
EXPECT_THAT
(
DescribeNegation
<
IntVec
>
(
IsSubsetOf
(
expected
)),
Eq
(
"no injection from elements to requirements exists such that:
\n
"
" - an element is equal to 111
\n
"
" - an element is equal to 222
\n
"
" - an element is equal to 333"
));
}
TEST
(
IsSubsetOfTest
,
MatchAndExplain
)
{
std
::
vector
<
int
>
v
;
v
.
push_back
(
2
);
v
.
push_back
(
3
);
std
::
vector
<
int
>
expected
;
expected
.
push_back
(
1
);
expected
.
push_back
(
2
);
StringMatchResultListener
listener
;
ASSERT_FALSE
(
ExplainMatchResult
(
IsSubsetOf
(
expected
),
v
,
&
listener
))
<<
listener
.
str
();
EXPECT_THAT
(
listener
.
str
(),
Eq
(
"where the following elements don't match any matchers:
\n
"
"element #1: 3"
));
expected
.
push_back
(
3
);
listener
.
Clear
();
ASSERT_TRUE
(
ExplainMatchResult
(
IsSubsetOf
(
expected
),
v
,
&
listener
))
<<
listener
.
str
();
EXPECT_THAT
(
listener
.
str
(),
Eq
(
"where:
\n
"
" - element #0 is matched by matcher #1,
\n
"
" - element #1 is matched by matcher #2"
));
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
TEST
(
IsSubsetOfTest
,
WorksForRhsInitializerList
)
{
const
int
numbers
[]
=
{
1
,
2
,
3
};
EXPECT_THAT
(
numbers
,
IsSubsetOf
({
1
,
2
,
3
,
4
}));
EXPECT_THAT
(
numbers
,
Not
(
IsSubsetOf
({
1
,
2
})));
}
#endif
// Tests using ElementsAre() and ElementsAreArray() with stream-like
// "containers".
...
...
@@ -5721,6 +6321,16 @@ TEST(PointwiseTest, WorksForRhsNativeArray) {
EXPECT_THAT
(
lhs
,
Not
(
Pointwise
(
Lt
(),
rhs
)));
}
// Test is effective only with sanitizers.
TEST
(
PointwiseTest
,
WorksForVectorOfBool
)
{
vector
<
bool
>
rhs
(
3
,
false
);
rhs
[
1
]
=
true
;
vector
<
bool
>
lhs
=
rhs
;
EXPECT_THAT
(
lhs
,
Pointwise
(
Eq
(),
rhs
));
rhs
[
0
]
=
true
;
EXPECT_THAT
(
lhs
,
Not
(
Pointwise
(
Eq
(),
rhs
)));
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
TEST
(
PointwiseTest
,
WorksForRhsInitializerList
)
{
...
...
@@ -5886,6 +6496,51 @@ TEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) {
EXPECT_THAT
(
lhs
,
UnorderedPointwise
(
m2
,
rhs
));
}
// Sample optional type implementation with minimal requirements for use with
// Optional matcher.
class
SampleOptionalInt
{
public:
typedef
int
value_type
;
explicit
SampleOptionalInt
(
int
value
)
:
value_
(
value
),
has_value_
(
true
)
{}
SampleOptionalInt
()
:
value_
(
0
),
has_value_
(
false
)
{}
operator
bool
()
const
{
return
has_value_
;
}
const
int
&
operator
*
()
const
{
return
value_
;
}
private:
int
value_
;
bool
has_value_
;
};
TEST
(
OptionalTest
,
DescribesSelf
)
{
const
Matcher
<
SampleOptionalInt
>
m
=
Optional
(
Eq
(
1
));
EXPECT_EQ
(
"value is equal to 1"
,
Describe
(
m
));
}
TEST
(
OptionalTest
,
ExplainsSelf
)
{
const
Matcher
<
SampleOptionalInt
>
m
=
Optional
(
Eq
(
1
));
EXPECT_EQ
(
"whose value 1 matches"
,
Explain
(
m
,
SampleOptionalInt
(
1
)));
EXPECT_EQ
(
"whose value 2 doesn't match"
,
Explain
(
m
,
SampleOptionalInt
(
2
)));
}
TEST
(
OptionalTest
,
MatchesNonEmptyOptional
)
{
const
Matcher
<
SampleOptionalInt
>
m1
=
Optional
(
1
);
const
Matcher
<
SampleOptionalInt
>
m2
=
Optional
(
Eq
(
2
));
const
Matcher
<
SampleOptionalInt
>
m3
=
Optional
(
Lt
(
3
));
SampleOptionalInt
opt
(
1
);
EXPECT_TRUE
(
m1
.
Matches
(
opt
));
EXPECT_FALSE
(
m2
.
Matches
(
opt
));
EXPECT_TRUE
(
m3
.
Matches
(
opt
));
}
TEST
(
OptionalTest
,
DoesNotMatchNullopt
)
{
const
Matcher
<
SampleOptionalInt
>
m
=
Optional
(
1
);
SampleOptionalInt
empty
;
EXPECT_FALSE
(
m
.
Matches
(
empty
));
}
class
SampleVariantIntString
{
public:
SampleVariantIntString
(
int
i
)
:
i_
(
i
),
has_int_
(
true
)
{}
...
...
@@ -5950,5 +6605,89 @@ TEST(VariantTest, InnerDoesNotMatch) {
EXPECT_FALSE
(
m
.
Matches
(
SampleVariantIntString
(
"2"
)));
}
class
SampleAnyType
{
public:
explicit
SampleAnyType
(
int
i
)
:
index_
(
0
),
i_
(
i
)
{}
explicit
SampleAnyType
(
const
std
::
string
&
s
)
:
index_
(
1
),
s_
(
s
)
{}
template
<
typename
T
>
friend
const
T
*
any_cast
(
const
SampleAnyType
*
any
)
{
return
any
->
get_impl
(
static_cast
<
T
*>
(
NULL
));
}
private:
int
index_
;
int
i_
;
std
::
string
s_
;
const
int
*
get_impl
(
int
*
)
const
{
return
index_
==
0
?
&
i_
:
NULL
;
}
const
std
::
string
*
get_impl
(
std
::
string
*
)
const
{
return
index_
==
1
?
&
s_
:
NULL
;
}
};
TEST
(
AnyWithTest
,
FullMatch
)
{
Matcher
<
SampleAnyType
>
m
=
AnyWith
<
int
>
(
Eq
(
1
));
EXPECT_TRUE
(
m
.
Matches
(
SampleAnyType
(
1
)));
}
TEST
(
AnyWithTest
,
TestBadCastType
)
{
Matcher
<
SampleAnyType
>
m
=
AnyWith
<
std
::
string
>
(
Eq
(
"fail"
));
EXPECT_FALSE
(
m
.
Matches
(
SampleAnyType
(
1
)));
}
#if GTEST_LANG_CXX11
TEST
(
AnyWithTest
,
TestUseInContainers
)
{
std
::
vector
<
SampleAnyType
>
a
;
a
.
emplace_back
(
1
);
a
.
emplace_back
(
2
);
a
.
emplace_back
(
3
);
EXPECT_THAT
(
a
,
ElementsAreArray
({
AnyWith
<
int
>
(
1
),
AnyWith
<
int
>
(
2
),
AnyWith
<
int
>
(
3
)}));
std
::
vector
<
SampleAnyType
>
b
;
b
.
emplace_back
(
"hello"
);
b
.
emplace_back
(
"merhaba"
);
b
.
emplace_back
(
"salut"
);
EXPECT_THAT
(
b
,
ElementsAreArray
({
AnyWith
<
std
::
string
>
(
"hello"
),
AnyWith
<
std
::
string
>
(
"merhaba"
),
AnyWith
<
std
::
string
>
(
"salut"
)}));
}
#endif // GTEST_LANG_CXX11
TEST
(
AnyWithTest
,
TestCompare
)
{
EXPECT_THAT
(
SampleAnyType
(
1
),
AnyWith
<
int
>
(
Gt
(
0
)));
}
TEST
(
AnyWithTest
,
DescribesSelf
)
{
const
Matcher
<
const
SampleAnyType
&>
m
=
AnyWith
<
int
>
(
Eq
(
1
));
EXPECT_THAT
(
Describe
(
m
),
ContainsRegex
(
"is an 'any' type with value of type "
"'.*' and the value is equal to 1"
));
}
TEST
(
AnyWithTest
,
ExplainsSelf
)
{
const
Matcher
<
const
SampleAnyType
&>
m
=
AnyWith
<
int
>
(
Eq
(
1
));
EXPECT_THAT
(
Explain
(
m
,
SampleAnyType
(
1
)),
ContainsRegex
(
"whose value 1"
));
EXPECT_THAT
(
Explain
(
m
,
SampleAnyType
(
"A"
)),
HasSubstr
(
"whose value is not of type '"
));
EXPECT_THAT
(
Explain
(
m
,
SampleAnyType
(
2
)),
"whose value 2 doesn't match"
);
}
#if GTEST_LANG_CXX11
TEST
(
PointeeTest
,
WorksOnMoveOnlyType
)
{
std
::
unique_ptr
<
int
>
p
(
new
int
(
3
));
EXPECT_THAT
(
p
,
Pointee
(
Eq
(
3
)));
EXPECT_THAT
(
p
,
Not
(
Pointee
(
Eq
(
2
))));
}
TEST
(
NotTest
,
WorksOnMoveOnlyType
)
{
std
::
unique_ptr
<
int
>
p
(
new
int
(
3
));
EXPECT_THAT
(
p
,
Pointee
(
Eq
(
3
)));
EXPECT_THAT
(
p
,
Not
(
Pointee
(
Eq
(
2
))));
}
#endif // GTEST_LANG_CXX11
}
// namespace gmock_matchers_test
}
// namespace testing
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