Enable safe matcher casts from Matcher<const T&> to Matcher<T>.
PiperOrigin-RevId: 715826130 Change-Id: Id962fd456f6da21ea2a909f331f92d814f1dad46
This commit is contained in:
committed by
Copybara-Service
parent
504ea69cf7
commit
e4ece4881d
@@ -411,9 +411,27 @@ class IntValue {
|
||||
int value_;
|
||||
};
|
||||
|
||||
// For testing casting matchers between compatible types. This is similar to
|
||||
// IntValue, but takes a non-const reference to the value, showing MatcherCast
|
||||
// works with such types (and doesn't, for example, use a const ref internally).
|
||||
class MutableIntView {
|
||||
public:
|
||||
// An int& can be statically (although not implicitly) cast to a
|
||||
// MutableIntView.
|
||||
explicit MutableIntView(int& a_value) : value_(a_value) {}
|
||||
|
||||
int& value() const { return value_; }
|
||||
|
||||
private:
|
||||
int& value_;
|
||||
};
|
||||
|
||||
// For testing casting matchers between compatible types.
|
||||
bool IsPositiveIntValue(const IntValue& foo) { return foo.value() > 0; }
|
||||
|
||||
// For testing casting matchers between compatible types.
|
||||
bool IsPositiveMutableIntView(MutableIntView foo) { return foo.value() > 0; }
|
||||
|
||||
// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T
|
||||
// can be statically converted to U.
|
||||
TEST(MatcherCastTest, FromCompatibleType) {
|
||||
@@ -429,14 +447,34 @@ TEST(MatcherCastTest, FromCompatibleType) {
|
||||
// predicate.
|
||||
EXPECT_TRUE(m4.Matches(1));
|
||||
EXPECT_FALSE(m4.Matches(0));
|
||||
|
||||
Matcher<MutableIntView> m5 = Truly(IsPositiveMutableIntView);
|
||||
Matcher<int> m6 = MatcherCast<int>(m5);
|
||||
// In the following, the arguments 1 and 0 are statically converted to
|
||||
// MutableIntView objects, and then tested by the IsPositiveMutableIntView()
|
||||
// predicate.
|
||||
EXPECT_TRUE(m6.Matches(1));
|
||||
EXPECT_FALSE(m6.Matches(0));
|
||||
}
|
||||
|
||||
// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.
|
||||
TEST(MatcherCastTest, FromConstReferenceToNonReference) {
|
||||
Matcher<const int&> m1 = Eq(0);
|
||||
int n = 0;
|
||||
Matcher<const int&> m1 = Ref(n);
|
||||
Matcher<int> m2 = MatcherCast<int>(m1);
|
||||
EXPECT_TRUE(m2.Matches(0));
|
||||
EXPECT_FALSE(m2.Matches(1));
|
||||
int n1 = 0;
|
||||
EXPECT_TRUE(m2.Matches(n));
|
||||
EXPECT_FALSE(m2.Matches(n1));
|
||||
}
|
||||
|
||||
// Tests that MatcherCast<T&>(m) works when m is a Matcher<const T&>.
|
||||
TEST(MatcherCastTest, FromConstReferenceToReference) {
|
||||
int n = 0;
|
||||
Matcher<const int&> m1 = Ref(n);
|
||||
Matcher<int&> m2 = MatcherCast<int&>(m1);
|
||||
int n1 = 0;
|
||||
EXPECT_TRUE(m2.Matches(n));
|
||||
EXPECT_FALSE(m2.Matches(n1));
|
||||
}
|
||||
|
||||
// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.
|
||||
@@ -445,6 +483,12 @@ TEST(MatcherCastTest, FromReferenceToNonReference) {
|
||||
Matcher<int> m2 = MatcherCast<int>(m1);
|
||||
EXPECT_TRUE(m2.Matches(0));
|
||||
EXPECT_FALSE(m2.Matches(1));
|
||||
|
||||
// Of course, reference identity isn't preserved since a copy is required.
|
||||
int n = 0;
|
||||
Matcher<int&> m3 = Ref(n);
|
||||
Matcher<int> m4 = MatcherCast<int>(m3);
|
||||
EXPECT_FALSE(m4.Matches(n));
|
||||
}
|
||||
|
||||
// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
|
||||
@@ -649,6 +693,16 @@ TEST(SafeMatcherCastTest, FromBaseClass) {
|
||||
EXPECT_FALSE(m4.Matches(d2));
|
||||
}
|
||||
|
||||
// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<const T&>.
|
||||
TEST(SafeMatcherCastTest, FromConstReferenceToNonReference) {
|
||||
int n = 0;
|
||||
Matcher<const int&> m1 = Ref(n);
|
||||
Matcher<int> m2 = SafeMatcherCast<int>(m1);
|
||||
int n1 = 0;
|
||||
EXPECT_TRUE(m2.Matches(n));
|
||||
EXPECT_FALSE(m2.Matches(n1));
|
||||
}
|
||||
|
||||
// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
|
||||
TEST(SafeMatcherCastTest, FromConstReferenceToReference) {
|
||||
int n = 0;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
// This file tests some commonly used argument matchers.
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
@@ -747,6 +748,24 @@ TYPED_TEST(OptionalTest, DoesNotMatchNullopt) {
|
||||
EXPECT_FALSE(m.Matches(empty));
|
||||
}
|
||||
|
||||
TYPED_TEST(OptionalTest, ComposesWithMonomorphicMatchersTakingReferences) {
|
||||
const Matcher<const int&> eq1 = Eq(1);
|
||||
const Matcher<const int&> eq2 = Eq(2);
|
||||
TypeParam opt(1);
|
||||
EXPECT_THAT(opt, Optional(eq1));
|
||||
EXPECT_THAT(opt, Optional(Not(eq2)));
|
||||
EXPECT_THAT(opt, Optional(AllOf(eq1, Not(eq2))));
|
||||
}
|
||||
|
||||
TYPED_TEST(OptionalTest, ComposesWithMonomorphicMatchersRequiringConversion) {
|
||||
const Matcher<int64_t> eq1 = Eq(1);
|
||||
const Matcher<int64_t> eq2 = Eq(2);
|
||||
TypeParam opt(1);
|
||||
EXPECT_THAT(opt, Optional(eq1));
|
||||
EXPECT_THAT(opt, Optional(Not(eq2)));
|
||||
EXPECT_THAT(opt, Optional(AllOf(eq1, Not(eq2))));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class MoveOnlyOptionalTest : public testing::Test {};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user