Googletest export
Fix the ACTION* macros to allow for more than 10 arguments in the action. Only the first 10 will be passed as individual arguments as `argN`, but the rest can be accessed from the `args` tuple. PiperOrigin-RevId: 311542098
This commit is contained in:
parent
011959aafd
commit
63713e1ce4
@ -1335,15 +1335,17 @@ class ActionHelper {
|
|||||||
public:
|
public:
|
||||||
template <typename... Ts>
|
template <typename... Ts>
|
||||||
static Result Perform(Impl* impl, const std::tuple<Ts...>& args) {
|
static Result Perform(Impl* impl, const std::tuple<Ts...>& args) {
|
||||||
return Apply(impl, args, MakeIndexSequence<sizeof...(Ts)>{},
|
static constexpr size_t kMaxArgs = sizeof...(Ts) <= 10 ? sizeof...(Ts) : 10;
|
||||||
MakeIndexSequence<10 - sizeof...(Ts)>{});
|
return Apply(impl, args, MakeIndexSequence<kMaxArgs>{},
|
||||||
|
MakeIndexSequence<10 - kMaxArgs>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename... Ts, std::size_t... tuple_ids, std::size_t... rest_ids>
|
template <typename... Ts, std::size_t... tuple_ids, std::size_t... rest_ids>
|
||||||
static Result Apply(Impl* impl, const std::tuple<Ts...>& args,
|
static Result Apply(Impl* impl, const std::tuple<Ts...>& args,
|
||||||
IndexSequence<tuple_ids...>, IndexSequence<rest_ids...>) {
|
IndexSequence<tuple_ids...>, IndexSequence<rest_ids...>) {
|
||||||
return impl->template gmock_PerformImpl<Ts...>(
|
return impl->template gmock_PerformImpl<
|
||||||
|
typename std::tuple_element<tuple_ids, std::tuple<Ts...>>::type...>(
|
||||||
args, std::get<tuple_ids>(args)...,
|
args, std::get<tuple_ids>(args)...,
|
||||||
((void)rest_ids, ExcessiveArg())...);
|
((void)rest_ids, ExcessiveArg())...);
|
||||||
}
|
}
|
||||||
|
@ -1550,6 +1550,26 @@ TEST(MoveOnlyArgumentsTest, ReturningActions) {
|
|||||||
EXPECT_EQ(x, 3);
|
EXPECT_EQ(x, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ACTION(ReturnArity) {
|
||||||
|
return std::tuple_size<args_type>::value;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(ActionMacro, LargeArity) {
|
||||||
|
EXPECT_EQ(
|
||||||
|
1, testing::Action<int(int)>(ReturnArity()).Perform(std::make_tuple(0)));
|
||||||
|
EXPECT_EQ(
|
||||||
|
10,
|
||||||
|
testing::Action<int(int, int, int, int, int, int, int, int, int, int)>(
|
||||||
|
ReturnArity())
|
||||||
|
.Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)));
|
||||||
|
EXPECT_EQ(
|
||||||
|
20,
|
||||||
|
testing::Action<int(int, int, int, int, int, int, int, int, int, int, int,
|
||||||
|
int, int, int, int, int, int, int, int, int)>(
|
||||||
|
ReturnArity())
|
||||||
|
.Perform(std::make_tuple(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||||
|
14, 15, 16, 17, 18, 19)));
|
||||||
|
}
|
||||||
|
|
||||||
} // Unnamed namespace
|
} // Unnamed namespace
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user