aboutsummaryrefslogtreecommitdiff
path: root/googlemock
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2024-02-29 07:41:40 -0800
committerCopybara-Service <copybara-worker@google.com>2024-02-29 07:42:26 -0800
commite4fdb87e76b9fc4b01c54ad81aea19d6e994b994 (patch)
tree9b132ffd8e590d62e372f1695fdb561954ddf80a /googlemock
parente15c5a51b818baedc8e33197d2427bc9568e110c (diff)
downloadgoogletest-e4fdb87e76b9fc4b01c54ad81aea19d6e994b994.zip
googletest-e4fdb87e76b9fc4b01c54ad81aea19d6e994b994.tar.gz
googletest-e4fdb87e76b9fc4b01c54ad81aea19d6e994b994.tar.bz2
Accept one-shot callables in InvokeArgument.
PiperOrigin-RevId: 611467660 Change-Id: Ic89ffc986141bee61f835cb60088aee92eb8bad9
Diffstat (limited to 'googlemock')
-rw-r--r--googlemock/include/gmock/gmock-more-actions.h5
-rw-r--r--googlemock/test/gmock-more-actions_test.cc10
2 files changed, 13 insertions, 2 deletions
diff --git a/googlemock/include/gmock/gmock-more-actions.h b/googlemock/include/gmock/gmock-more-actions.h
index dd90e31..e341d47 100644
--- a/googlemock/include/gmock/gmock-more-actions.h
+++ b/googlemock/include/gmock/gmock-more-actions.h
@@ -592,8 +592,9 @@ namespace internal {
// Overloads for other custom-callables are provided in the
// internal/custom/gmock-generated-actions.h header.
template <typename F, typename... Args>
-auto InvokeArgument(F f, Args... args) -> decltype(f(args...)) {
- return f(args...);
+auto InvokeArgument(F &&f,
+ Args... args) -> decltype(std::forward<F>(f)(args...)) {
+ return std::forward<F>(f)(args...);
}
template <std::size_t index, typename... Params>
diff --git a/googlemock/test/gmock-more-actions_test.cc b/googlemock/test/gmock-more-actions_test.cc
index 16af689..7ed89a9 100644
--- a/googlemock/test/gmock-more-actions_test.cc
+++ b/googlemock/test/gmock-more-actions_test.cc
@@ -91,6 +91,10 @@ struct UnaryMoveOnlyFunctor : UnaryFunctor {
UnaryMoveOnlyFunctor(UnaryMoveOnlyFunctor&&) = default;
};
+struct OneShotUnaryFunctor {
+ int operator()(bool x) && { return x ? 1 : -1; }
+};
+
const char* Binary(const char* input, short n) { return input + n; } // NOLINT
int Ternary(int x, char y, short z) { return x + y + z; } // NOLINT
@@ -716,6 +720,12 @@ TEST(InvokeArgumentTest, Functor1MoveOnly) {
EXPECT_EQ(1, a.Perform(std::make_tuple(UnaryMoveOnlyFunctor())));
}
+// Tests using InvokeArgument with a one-shot unary functor.
+TEST(InvokeArgumentTest, OneShotFunctor1) {
+ Action<int(OneShotUnaryFunctor)> a = InvokeArgument<0>(true); // NOLINT
+ EXPECT_EQ(1, a.Perform(std::make_tuple(OneShotUnaryFunctor())));
+}
+
// Tests using InvokeArgument with a 5-ary function.
TEST(InvokeArgumentTest, Function5) {
Action<int(int (*)(int, int, int, int, int))> a = // NOLINT