Googletest export
Rewrite ReturnNew action without using pump. PiperOrigin-RevId: 308219616
This commit is contained in:
parent
d7ca9af004
commit
955552518b
@ -138,6 +138,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <tuple>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
@ -1311,6 +1312,31 @@ inline ::std::reference_wrapper<T> ByRef(T& l_value) { // NOLINT
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
template <typename T, typename... Params>
|
||||||
|
struct ReturnNewAction {
|
||||||
|
T* operator()() const {
|
||||||
|
return internal::Apply(
|
||||||
|
[](const Params&... unpacked_params) {
|
||||||
|
return new T(unpacked_params...);
|
||||||
|
},
|
||||||
|
params);
|
||||||
|
}
|
||||||
|
std::tuple<Params...> params;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
|
// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
|
||||||
|
// instance of type T, constructed on the heap with constructor arguments
|
||||||
|
// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
|
||||||
|
template <typename T, typename... Params>
|
||||||
|
internal::ReturnNewAction<T, typename std::decay<Params>::type...> ReturnNew(
|
||||||
|
Params&&... params) {
|
||||||
|
return {std::forward_as_tuple(std::forward<Params>(params)...)};
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
// A macro from the ACTION* family (defined later in gmock-generated-actions.h)
|
// A macro from the ACTION* family (defined later in gmock-generated-actions.h)
|
||||||
// defines an action that can be used in a mock function. Typically,
|
// defines an action that can be used in a mock function. Typically,
|
||||||
// these actions only care about a subset of the arguments of the mock
|
// these actions only care about a subset of the arguments of the mock
|
||||||
|
@ -602,77 +602,6 @@ ACTION_TEMPLATE(InvokeArgument,
|
|||||||
p8, p9);
|
p8, p9);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Various overloads for ReturnNew<T>().
|
|
||||||
//
|
|
||||||
// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
|
|
||||||
// instance of type T, constructed on the heap with constructor arguments
|
|
||||||
// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_0_VALUE_PARAMS()) {
|
|
||||||
return new T();
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_1_VALUE_PARAMS(p0)) {
|
|
||||||
return new T(p0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_2_VALUE_PARAMS(p0, p1)) {
|
|
||||||
return new T(p0, p1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_3_VALUE_PARAMS(p0, p1, p2)) {
|
|
||||||
return new T(p0, p1, p2);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
|
|
||||||
return new T(p0, p1, p2, p3);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4, p5);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4, p5, p6);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4, p5, p6, p7);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
|
|
||||||
return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# pragma warning(pop)
|
# pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
@ -344,24 +344,6 @@ ACTION_TEMPLATE(InvokeArgument,
|
|||||||
|
|
||||||
]]
|
]]
|
||||||
|
|
||||||
// Various overloads for ReturnNew<T>().
|
|
||||||
//
|
|
||||||
// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
|
|
||||||
// instance of type T, constructed on the heap with constructor arguments
|
|
||||||
// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
|
|
||||||
$range i 0..n
|
|
||||||
$for i [[
|
|
||||||
$range j 0..i-1
|
|
||||||
$var ps = [[$for j, [[p$j]]]]
|
|
||||||
|
|
||||||
ACTION_TEMPLATE(ReturnNew,
|
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
|
||||||
AND_$i[[]]_VALUE_PARAMS($ps)) {
|
|
||||||
return new T($ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
]]
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# pragma warning(pop)
|
# pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
@ -422,11 +422,13 @@ auto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(
|
|||||||
|
|
||||||
// Apply the function to a tuple of arguments.
|
// Apply the function to a tuple of arguments.
|
||||||
template <typename F, typename Tuple>
|
template <typename F, typename Tuple>
|
||||||
auto Apply(F&& f, Tuple&& args)
|
auto Apply(F&& f, Tuple&& args) -> decltype(
|
||||||
-> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
|
ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
|
||||||
MakeIndexSequence<std::tuple_size<Tuple>::value>())) {
|
MakeIndexSequence<std::tuple_size<
|
||||||
|
typename std::remove_reference<Tuple>::type>::value>())) {
|
||||||
return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
|
return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
|
||||||
MakeIndexSequence<std::tuple_size<Tuple>::value>());
|
MakeIndexSequence<std::tuple_size<
|
||||||
|
typename std::remove_reference<Tuple>::type>::value>());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Template struct Function<F>, where F must be a function type, contains
|
// Template struct Function<F>, where F must be a function type, contains
|
||||||
|
@ -54,35 +54,34 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// This list should be kept sorted.
|
using ::testing::_;
|
||||||
using testing::_;
|
using ::testing::Action;
|
||||||
using testing::Action;
|
using ::testing::ActionInterface;
|
||||||
using testing::ActionInterface;
|
using ::testing::Assign;
|
||||||
using testing::Assign;
|
using ::testing::ByMove;
|
||||||
using testing::ByMove;
|
using ::testing::ByRef;
|
||||||
using testing::ByRef;
|
using ::testing::DefaultValue;
|
||||||
using testing::DefaultValue;
|
using ::testing::DoAll;
|
||||||
using testing::DoAll;
|
using ::testing::DoDefault;
|
||||||
using testing::DoDefault;
|
using ::testing::IgnoreResult;
|
||||||
using testing::IgnoreResult;
|
using ::testing::Invoke;
|
||||||
using testing::Invoke;
|
using ::testing::InvokeWithoutArgs;
|
||||||
using testing::InvokeWithoutArgs;
|
using ::testing::MakePolymorphicAction;
|
||||||
using testing::MakePolymorphicAction;
|
using ::testing::PolymorphicAction;
|
||||||
using testing::Ne;
|
using ::testing::Return;
|
||||||
using testing::PolymorphicAction;
|
using ::testing::ReturnNew;
|
||||||
using testing::Return;
|
using ::testing::ReturnNull;
|
||||||
using testing::ReturnNull;
|
using ::testing::ReturnRef;
|
||||||
using testing::ReturnRef;
|
using ::testing::ReturnRefOfCopy;
|
||||||
using testing::ReturnRefOfCopy;
|
using ::testing::ReturnRoundRobin;
|
||||||
using testing::ReturnRoundRobin;
|
using ::testing::SetArgPointee;
|
||||||
using testing::SetArgPointee;
|
using ::testing::SetArgumentPointee;
|
||||||
using testing::SetArgumentPointee;
|
using ::testing::Unused;
|
||||||
using testing::Unused;
|
using ::testing::WithArgs;
|
||||||
using testing::WithArgs;
|
using ::testing::internal::BuiltInDefaultValue;
|
||||||
using testing::internal::BuiltInDefaultValue;
|
|
||||||
|
|
||||||
#if !GTEST_OS_WINDOWS_MOBILE
|
#if !GTEST_OS_WINDOWS_MOBILE
|
||||||
using testing::SetErrnoAndReturn;
|
using ::testing::SetErrnoAndReturn;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Tests that BuiltInDefaultValue<T*>::Get() returns NULL.
|
// Tests that BuiltInDefaultValue<T*>::Get() returns NULL.
|
||||||
@ -1292,6 +1291,52 @@ TEST(ByRefTest, PrintsCorrectly) {
|
|||||||
EXPECT_EQ(expected.str(), actual.str());
|
EXPECT_EQ(expected.str(), actual.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct UnaryConstructorClass {
|
||||||
|
explicit UnaryConstructorClass(int v) : value(v) {}
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Tests using ReturnNew() with a unary constructor.
|
||||||
|
TEST(ReturnNewTest, Unary) {
|
||||||
|
Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
|
||||||
|
UnaryConstructorClass* c = a.Perform(std::make_tuple());
|
||||||
|
EXPECT_EQ(4000, c->value);
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
|
||||||
|
Action<UnaryConstructorClass*(bool, int)> a =
|
||||||
|
ReturnNew<UnaryConstructorClass>(4000);
|
||||||
|
UnaryConstructorClass* c = a.Perform(std::make_tuple(false, 5));
|
||||||
|
EXPECT_EQ(4000, c->value);
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
|
||||||
|
Action<const UnaryConstructorClass*()> a =
|
||||||
|
ReturnNew<UnaryConstructorClass>(4000);
|
||||||
|
const UnaryConstructorClass* c = a.Perform(std::make_tuple());
|
||||||
|
EXPECT_EQ(4000, c->value);
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
|
||||||
|
class TenArgConstructorClass {
|
||||||
|
public:
|
||||||
|
TenArgConstructorClass(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
|
||||||
|
int a8, int a9, int a10)
|
||||||
|
: value_(a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10) {}
|
||||||
|
int value_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Tests using ReturnNew() with a 10-argument constructor.
|
||||||
|
TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
|
||||||
|
Action<TenArgConstructorClass*()> a = ReturnNew<TenArgConstructorClass>(
|
||||||
|
1000000000, 200000000, 30000000, 4000000, 500000, 60000, 7000, 800, 90,
|
||||||
|
0);
|
||||||
|
TenArgConstructorClass* c = a.Perform(std::make_tuple());
|
||||||
|
EXPECT_EQ(1234567890, c->value_);
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<int> UniquePtrSource() {
|
std::unique_ptr<int> UniquePtrSource() {
|
||||||
return std::unique_ptr<int>(new int(19));
|
return std::unique_ptr<int>(new int(19));
|
||||||
|
@ -53,7 +53,6 @@ using testing::ByRef;
|
|||||||
using testing::DoAll;
|
using testing::DoAll;
|
||||||
using testing::Invoke;
|
using testing::Invoke;
|
||||||
using testing::Return;
|
using testing::Return;
|
||||||
using testing::ReturnNew;
|
|
||||||
using testing::SetArgPointee;
|
using testing::SetArgPointee;
|
||||||
using testing::StaticAssertTypeEq;
|
using testing::StaticAssertTypeEq;
|
||||||
using testing::Unused;
|
using testing::Unused;
|
||||||
@ -844,49 +843,6 @@ TEST(ActionPnMacroTest, CanExplicitlyInstantiateWithReferenceTypes) {
|
|||||||
EXPECT_EQ(55, a.Perform(empty));
|
EXPECT_EQ(55, a.Perform(empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
class NullaryConstructorClass {
|
|
||||||
public:
|
|
||||||
NullaryConstructorClass() : value_(123) {}
|
|
||||||
int value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Tests using ReturnNew() with a nullary constructor.
|
|
||||||
TEST(ReturnNewTest, NoArgs) {
|
|
||||||
Action<NullaryConstructorClass*()> a = ReturnNew<NullaryConstructorClass>();
|
|
||||||
NullaryConstructorClass* c = a.Perform(std::make_tuple());
|
|
||||||
EXPECT_EQ(123, c->value_);
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
|
|
||||||
class UnaryConstructorClass {
|
|
||||||
public:
|
|
||||||
explicit UnaryConstructorClass(int value) : value_(value) {}
|
|
||||||
int value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Tests using ReturnNew() with a unary constructor.
|
|
||||||
TEST(ReturnNewTest, Unary) {
|
|
||||||
Action<UnaryConstructorClass*()> a = ReturnNew<UnaryConstructorClass>(4000);
|
|
||||||
UnaryConstructorClass* c = a.Perform(std::make_tuple());
|
|
||||||
EXPECT_EQ(4000, c->value_);
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ReturnNewTest, UnaryWorksWhenMockMethodHasArgs) {
|
|
||||||
Action<UnaryConstructorClass*(bool, int)> a =
|
|
||||||
ReturnNew<UnaryConstructorClass>(4000);
|
|
||||||
UnaryConstructorClass* c = a.Perform(std::make_tuple(false, 5));
|
|
||||||
EXPECT_EQ(4000, c->value_);
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ReturnNewTest, UnaryWorksWhenMockMethodReturnsPointerToConst) {
|
|
||||||
Action<const UnaryConstructorClass*()> a =
|
|
||||||
ReturnNew<UnaryConstructorClass>(4000);
|
|
||||||
const UnaryConstructorClass* c = a.Perform(std::make_tuple());
|
|
||||||
EXPECT_EQ(4000, c->value_);
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
|
|
||||||
class TenArgConstructorClass {
|
class TenArgConstructorClass {
|
||||||
public:
|
public:
|
||||||
@ -897,17 +853,6 @@ class TenArgConstructorClass {
|
|||||||
int value_;
|
int value_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Tests using ReturnNew() with a 10-argument constructor.
|
|
||||||
TEST(ReturnNewTest, ConstructorThatTakes10Arguments) {
|
|
||||||
Action<TenArgConstructorClass*()> a =
|
|
||||||
ReturnNew<TenArgConstructorClass>(1000000000, 200000000, 30000000,
|
|
||||||
4000000, 500000, 60000,
|
|
||||||
7000, 800, 90, 0);
|
|
||||||
TenArgConstructorClass* c = a.Perform(std::make_tuple());
|
|
||||||
EXPECT_EQ(1234567890, c->value_);
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that ACTION_TEMPLATE works when there is no value parameter.
|
// Tests that ACTION_TEMPLATE works when there is no value parameter.
|
||||||
ACTION_TEMPLATE(CreateNew,
|
ACTION_TEMPLATE(CreateNew,
|
||||||
HAS_1_TEMPLATE_PARAMS(typename, T),
|
HAS_1_TEMPLATE_PARAMS(typename, T),
|
||||||
|
Loading…
Reference in New Issue
Block a user