Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
95555251
Commit
95555251
authored
Apr 24, 2020
by
Abseil Team
Committed by
Gennadiy Rozental
May 01, 2020
Browse files
Googletest export
Rewrite ReturnNew action without using pump. PiperOrigin-RevId: 308219616
parent
d7ca9af0
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
104 additions
and
175 deletions
+104
-175
googlemock/include/gmock/gmock-actions.h
googlemock/include/gmock/gmock-actions.h
+26
-0
googlemock/include/gmock/gmock-generated-actions.h
googlemock/include/gmock/gmock-generated-actions.h
+0
-71
googlemock/include/gmock/gmock-generated-actions.h.pump
googlemock/include/gmock/gmock-generated-actions.h.pump
+0
-18
googlemock/include/gmock/internal/gmock-internal-utils.h
googlemock/include/gmock/internal/gmock-internal-utils.h
+6
-4
googlemock/test/gmock-actions_test.cc
googlemock/test/gmock-actions_test.cc
+72
-27
googlemock/test/gmock-generated-actions_test.cc
googlemock/test/gmock-generated-actions_test.cc
+0
-55
No files found.
googlemock/include/gmock/gmock-actions.h
View file @
95555251
...
@@ -138,6 +138,7 @@
...
@@ -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
...
@@ -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
...
...
googlemock/include/gmock/gmock-generated-actions.h
View file @
95555251
...
@@ -602,77 +602,6 @@ ACTION_TEMPLATE(InvokeArgument,
...
@@ -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
...
...
googlemock/include/gmock/gmock-generated-actions.h.pump
View file @
95555251
...
@@ -344,24 +344,6 @@ ACTION_TEMPLATE(InvokeArgument,
...
@@ -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
...
...
googlemock/include/gmock/internal/gmock-internal-utils.h
View file @
95555251
...
@@ -422,11 +422,13 @@ auto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(
...
@@ -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
...
...
googlemock/test/gmock-actions_test.cc
View file @
95555251
...
@@ -54,35 +54,34 @@
...
@@ -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) {
...
@@ -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
));
...
...
googlemock/test/gmock-generated-actions_test.cc
View file @
95555251
...
@@ -53,7 +53,6 @@ using testing::ByRef;
...
@@ -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) {
...
@@ -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 {
...
@@ -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
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment