Googletest export

Deduplicate testing::ReferenceWrapper with std::reference_wrapper.
Minor cleanups in matchers_test.

PiperOrigin-RevId: 229022872
This commit is contained in:
Abseil Team 2019-01-12 12:26:37 -05:00 committed by Gennadiy Civil
parent 0599a7b841
commit 097407fd3c
5 changed files with 19 additions and 105 deletions

View File

@ -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

View File

@ -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;

View File

@ -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) {

View File

@ -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

View File

@ -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)));
} }