summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2020-05-14 12:00:56 -0400
committerDerek Mauro <dmauro@google.com>2020-05-28 19:53:26 -0400
commit63713e1ce49019da205daa1ca91b73fcfc9b333f (patch)
tree624e49e4868589aa4b0936d673ec828b8302f078
parent011959aafddcd30611003de96cfd8d7a7685c700 (diff)
downloadgoogletest-63713e1ce49019da205daa1ca91b73fcfc9b333f.tar.gz
googletest-63713e1ce49019da205daa1ca91b73fcfc9b333f.zip
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
-rw-r--r--googlemock/include/gmock/gmock-actions.h8
-rw-r--r--googlemock/test/gmock-actions_test.cc20
2 files changed, 25 insertions, 3 deletions
diff --git a/googlemock/include/gmock/gmock-actions.h b/googlemock/include/gmock/gmock-actions.h
index 0f30abde..ecf47c40 100644
--- a/googlemock/include/gmock/gmock-actions.h
+++ b/googlemock/include/gmock/gmock-actions.h
@@ -1335,15 +1335,17 @@ class ActionHelper {
public:
template <typename... Ts>
static Result Perform(Impl* impl, const std::tuple<Ts...>& args) {
- return Apply(impl, args, MakeIndexSequence<sizeof...(Ts)>{},
- MakeIndexSequence<10 - sizeof...(Ts)>{});
+ static constexpr size_t kMaxArgs = sizeof...(Ts) <= 10 ? sizeof...(Ts) : 10;
+ return Apply(impl, args, MakeIndexSequence<kMaxArgs>{},
+ MakeIndexSequence<10 - kMaxArgs>{});
}
private:
template <typename... Ts, std::size_t... tuple_ids, std::size_t... rest_ids>
static Result Apply(Impl* impl, const std::tuple<Ts...>& args,
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)...,
((void)rest_ids, ExcessiveArg())...);
}
diff --git a/googlemock/test/gmock-actions_test.cc b/googlemock/test/gmock-actions_test.cc
index cac8f94f..547f48f4 100644
--- a/googlemock/test/gmock-actions_test.cc
+++ b/googlemock/test/gmock-actions_test.cc
@@ -1550,6 +1550,26 @@ TEST(MoveOnlyArgumentsTest, ReturningActions) {
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
OpenPOWER on IntegriCloud