Make ReturnNull() support unique_ptr and shared_ptr.

This commit is contained in:
kosak 2015-01-08 03:03:09 +00:00
parent 8e838ce0fd
commit 53d49dc43e
2 changed files with 19 additions and 1 deletions

View File

@ -583,12 +583,18 @@ class ReturnAction {
// Implements the ReturnNull() action. // Implements the ReturnNull() action.
class ReturnNullAction { class ReturnNullAction {
public: public:
// Allows ReturnNull() to be used in any pointer-returning function. // Allows ReturnNull() to be used in any pointer-returning function. In C++11
// this is enforced by returning nullptr, and in non-C++11 by asserting a
// pointer type on compile time.
template <typename Result, typename ArgumentTuple> template <typename Result, typename ArgumentTuple>
static Result Perform(const ArgumentTuple&) { static Result Perform(const ArgumentTuple&) {
#if GTEST_LANG_CXX11
return nullptr;
#else
GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value, GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value,
ReturnNull_can_be_used_to_return_a_pointer_only); ReturnNull_can_be_used_to_return_a_pointer_only);
return NULL; return NULL;
#endif // GTEST_LANG_CXX11
} }
}; };

View File

@ -604,6 +604,18 @@ TEST(ReturnNullTest, WorksInPointerReturningFunction) {
EXPECT_TRUE(a2.Perform(make_tuple(true)) == NULL); EXPECT_TRUE(a2.Perform(make_tuple(true)) == NULL);
} }
#if GTEST_HAS_STD_UNIQUE_PTR_
// Tests that ReturnNull() returns NULL for shared_ptr and unique_ptr returning
// functions.
TEST(ReturnNullTest, WorksInSmartPointerReturningFunction) {
const Action<std::unique_ptr<const int>()> a1 = ReturnNull();
EXPECT_TRUE(a1.Perform(make_tuple()) == nullptr);
const Action<std::shared_ptr<int>(std::string)> a2 = ReturnNull();
EXPECT_TRUE(a2.Perform(make_tuple("foo")) == nullptr);
}
#endif // GTEST_HAS_STD_UNIQUE_PTR_
// Tests that ReturnRef(v) works for reference types. // Tests that ReturnRef(v) works for reference types.
TEST(ReturnRefTest, WorksForReference) { TEST(ReturnRefTest, WorksForReference) {
const int n = 0; const int n = 0;