Googletest export
Deduplicate testing::ReferenceWrapper with std::reference_wrapper. Minor cleanups in matchers_test. PiperOrigin-RevId: 229022872
This commit is contained in:
parent
0599a7b841
commit
097407fd3c
@ -936,33 +936,6 @@ class IgnoreResultAction {
|
|||||||
GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);
|
GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);
|
||||||
};
|
};
|
||||||
|
|
||||||
// A ReferenceWrapper<T> object represents a reference to type T,
|
|
||||||
// which can be either const or not. It can be explicitly converted
|
|
||||||
// from, and implicitly converted to, a T&. Unlike a reference,
|
|
||||||
// ReferenceWrapper<T> can be copied and can survive template type
|
|
||||||
// inference. This is used to support by-reference arguments in the
|
|
||||||
// InvokeArgument<N>(...) action. The idea was from "reference
|
|
||||||
// wrappers" in tr1, which we don't have in our source tree yet.
|
|
||||||
template <typename T>
|
|
||||||
class ReferenceWrapper {
|
|
||||||
public:
|
|
||||||
// Constructs a ReferenceWrapper<T> object from a T&.
|
|
||||||
explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {} // NOLINT
|
|
||||||
|
|
||||||
// Allows a ReferenceWrapper<T> object to be implicitly converted to
|
|
||||||
// a T&.
|
|
||||||
operator T&() const { return *pointer_; }
|
|
||||||
private:
|
|
||||||
T* pointer_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Allows the expression ByRef(x) to be printed as a reference to x.
|
|
||||||
template <typename T>
|
|
||||||
void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {
|
|
||||||
T& value = ref;
|
|
||||||
UniversalPrinter<T&>::Print(value, os);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename InnerAction, size_t... I>
|
template <typename InnerAction, size_t... I>
|
||||||
struct WithArgsAction {
|
struct WithArgsAction {
|
||||||
InnerAction action;
|
InnerAction action;
|
||||||
@ -1219,9 +1192,12 @@ inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {
|
|||||||
// where Base is a base class of Derived, just write:
|
// where Base is a base class of Derived, just write:
|
||||||
//
|
//
|
||||||
// ByRef<const Base>(derived)
|
// ByRef<const Base>(derived)
|
||||||
|
//
|
||||||
|
// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper.
|
||||||
|
// However, it may still be used for consistency with ByMove().
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline internal::ReferenceWrapper<T> ByRef(T& l_value) { // NOLINT
|
inline ::std::reference_wrapper<T> ByRef(T& l_value) { // NOLINT
|
||||||
return internal::ReferenceWrapper<T>(l_value);
|
return ::std::reference_wrapper<T>(l_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
@ -1164,13 +1164,12 @@ TEST_F(SetErrnoAndReturnTest, CompatibleTypes) {
|
|||||||
|
|
||||||
// Tests ByRef().
|
// Tests ByRef().
|
||||||
|
|
||||||
// Tests that ReferenceWrapper<T> is copyable.
|
// Tests that the result of ByRef() is copyable.
|
||||||
TEST(ByRefTest, IsCopyable) {
|
TEST(ByRefTest, IsCopyable) {
|
||||||
const std::string s1 = "Hi";
|
const std::string s1 = "Hi";
|
||||||
const std::string s2 = "Hello";
|
const std::string s2 = "Hello";
|
||||||
|
|
||||||
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper =
|
auto ref_wrapper = ByRef(s1);
|
||||||
ByRef(s1);
|
|
||||||
const std::string& r1 = ref_wrapper;
|
const std::string& r1 = ref_wrapper;
|
||||||
EXPECT_EQ(&s1, &r1);
|
EXPECT_EQ(&s1, &r1);
|
||||||
|
|
||||||
@ -1179,8 +1178,7 @@ TEST(ByRefTest, IsCopyable) {
|
|||||||
const std::string& r2 = ref_wrapper;
|
const std::string& r2 = ref_wrapper;
|
||||||
EXPECT_EQ(&s2, &r2);
|
EXPECT_EQ(&s2, &r2);
|
||||||
|
|
||||||
::testing::internal::ReferenceWrapper<const std::string> ref_wrapper1 =
|
auto ref_wrapper1 = ByRef(s1);
|
||||||
ByRef(s1);
|
|
||||||
// Copies ref_wrapper1 to ref_wrapper.
|
// Copies ref_wrapper1 to ref_wrapper.
|
||||||
ref_wrapper = ref_wrapper1;
|
ref_wrapper = ref_wrapper1;
|
||||||
const std::string& r3 = ref_wrapper;
|
const std::string& r3 = ref_wrapper;
|
||||||
|
@ -80,65 +80,6 @@ using std::pair;
|
|||||||
using std::set;
|
using std::set;
|
||||||
using std::stringstream;
|
using std::stringstream;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
using testing::_;
|
|
||||||
using testing::A;
|
|
||||||
using testing::AllArgs;
|
|
||||||
using testing::AllOf;
|
|
||||||
using testing::An;
|
|
||||||
using testing::AnyOf;
|
|
||||||
using testing::ByRef;
|
|
||||||
using testing::ContainsRegex;
|
|
||||||
using testing::DoubleEq;
|
|
||||||
using testing::DoubleNear;
|
|
||||||
using testing::EndsWith;
|
|
||||||
using testing::Eq;
|
|
||||||
using testing::ExplainMatchResult;
|
|
||||||
using testing::Field;
|
|
||||||
using testing::FloatEq;
|
|
||||||
using testing::FloatNear;
|
|
||||||
using testing::Ge;
|
|
||||||
using testing::Gt;
|
|
||||||
using testing::HasSubstr;
|
|
||||||
using testing::IsEmpty;
|
|
||||||
using testing::IsNull;
|
|
||||||
using testing::Key;
|
|
||||||
using testing::Le;
|
|
||||||
using testing::Lt;
|
|
||||||
using testing::MakeMatcher;
|
|
||||||
using testing::MakePolymorphicMatcher;
|
|
||||||
using testing::Matcher;
|
|
||||||
using testing::MatcherCast;
|
|
||||||
using testing::MatcherInterface;
|
|
||||||
using testing::Matches;
|
|
||||||
using testing::MatchesRegex;
|
|
||||||
using testing::MatchResultListener;
|
|
||||||
using testing::NanSensitiveDoubleEq;
|
|
||||||
using testing::NanSensitiveDoubleNear;
|
|
||||||
using testing::NanSensitiveFloatEq;
|
|
||||||
using testing::NanSensitiveFloatNear;
|
|
||||||
using testing::Ne;
|
|
||||||
using testing::Not;
|
|
||||||
using testing::NotNull;
|
|
||||||
using testing::Pair;
|
|
||||||
using testing::Pointee;
|
|
||||||
using testing::Pointwise;
|
|
||||||
using testing::PolymorphicMatcher;
|
|
||||||
using testing::Property;
|
|
||||||
using testing::Ref;
|
|
||||||
using testing::ResultOf;
|
|
||||||
using testing::SizeIs;
|
|
||||||
using testing::StartsWith;
|
|
||||||
using testing::StrCaseEq;
|
|
||||||
using testing::StrCaseNe;
|
|
||||||
using testing::StrEq;
|
|
||||||
using testing::StringMatchResultListener;
|
|
||||||
using testing::StrNe;
|
|
||||||
using testing::Truly;
|
|
||||||
using testing::TypedEq;
|
|
||||||
using testing::UnorderedPointwise;
|
|
||||||
using testing::Value;
|
|
||||||
using testing::WhenSorted;
|
|
||||||
using testing::WhenSortedBy;
|
|
||||||
using testing::internal::DummyMatchResultListener;
|
using testing::internal::DummyMatchResultListener;
|
||||||
using testing::internal::ElementMatcherPair;
|
using testing::internal::ElementMatcherPair;
|
||||||
using testing::internal::ElementMatcherPairs;
|
using testing::internal::ElementMatcherPairs;
|
||||||
@ -6995,10 +6936,6 @@ class PredicateFormatterFromMatcherTest : public ::testing::Test {
|
|||||||
matcher);
|
matcher);
|
||||||
return predicate_formatter("dummy-name", behavior);
|
return predicate_formatter("dummy-name", behavior);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string kMatcherType =
|
|
||||||
"testing::gmock_matchers_test::PredicateFormatterFromMatcherTest::"
|
|
||||||
"Behavior";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(PredicateFormatterFromMatcherTest, ShortCircuitOnSuccess) {
|
TEST_F(PredicateFormatterFromMatcherTest, ShortCircuitOnSuccess) {
|
||||||
|
@ -637,8 +637,7 @@ inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {
|
void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {
|
||||||
// Delegate to wrapped value.
|
UniversalPrinter<T&>::Print(ref.get(), os);
|
||||||
PrintTo(ref.get(), os);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function for printing a tuple. T must be instantiated with
|
// Helper function for printing a tuple. T must be instantiated with
|
||||||
|
@ -1023,15 +1023,19 @@ TEST(PrintNullptrT, Basic) {
|
|||||||
|
|
||||||
TEST(PrintReferenceWrapper, Printable) {
|
TEST(PrintReferenceWrapper, Printable) {
|
||||||
int x = 5;
|
int x = 5;
|
||||||
EXPECT_EQ("5", Print(std::ref(x)));
|
EXPECT_EQ("@" + PrintPointer(&x) + " 5", Print(std::ref(x)));
|
||||||
EXPECT_EQ("5", Print(std::cref(x)));
|
EXPECT_EQ("@" + PrintPointer(&x) + " 5", Print(std::cref(x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PrintReferenceWrapper, Unprintable) {
|
TEST(PrintReferenceWrapper, Unprintable) {
|
||||||
::foo::UnprintableInFoo up;
|
::foo::UnprintableInFoo up;
|
||||||
EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
|
EXPECT_EQ(
|
||||||
|
"@" + PrintPointer(&up) +
|
||||||
|
" 16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
|
||||||
Print(std::ref(up)));
|
Print(std::ref(up)));
|
||||||
EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
|
EXPECT_EQ(
|
||||||
|
"@" + PrintPointer(&up) +
|
||||||
|
" 16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
|
||||||
Print(std::cref(up)));
|
Print(std::cref(up)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user