summaryrefslogtreecommitdiffstats
path: root/googlemock/test/gmock-actions_test.cc
diff options
context:
space:
mode:
authorAaron Jacobs <jacobsa@google.com>2022-04-13 22:03:55 (GMT)
committerCopybara-Service <copybara-worker@google.com>2022-04-13 22:04:29 (GMT)
commit80600e56cc9afe7ee02737429f9177aa87025054 (patch)
tree5e909205c42c38b09359cb4a225835b15e5afca6 /googlemock/test/gmock-actions_test.cc
parent733f875989a6fba05f4c366ea7b2ba4054994a7e (diff)
downloadgoogletest-80600e56cc9afe7ee02737429f9177aa87025054.zip
googletest-80600e56cc9afe7ee02737429f9177aa87025054.tar.gz
googletest-80600e56cc9afe7ee02737429f9177aa87025054.tar.bz2
Document two surprises in `DoAllAction::NonFinalType`.
PiperOrigin-RevId: 441589196 Change-Id: Ic3e483ca70d72261046bad464d817f9dfd4bec65
Diffstat (limited to 'googlemock/test/gmock-actions_test.cc')
-rw-r--r--googlemock/test/gmock-actions_test.cc83
1 files changed, 83 insertions, 0 deletions
diff --git a/googlemock/test/gmock-actions_test.cc b/googlemock/test/gmock-actions_test.cc
index 7ff5780..198510b 100644
--- a/googlemock/test/gmock-actions_test.cc
+++ b/googlemock/test/gmock-actions_test.cc
@@ -1192,6 +1192,89 @@ TEST(AssignTest, CompatibleTypes) {
EXPECT_DOUBLE_EQ(5, x);
}
+// DoAll should never provide rvalue references to the initial actions. If the
+// mock action itself accepts an rvalue reference or a non-scalar object by
+// value then the final action should receive an rvalue reference, but initial
+// actions should receive only lvalue references.
+TEST(DoAll, ProvidesLvalueReferencesToInitialActions) {
+ struct Obj {};
+
+ // Mock action accepts by value: the initial action should be fed a const
+ // lvalue reference, and the final action an rvalue reference.
+ {
+ struct InitialAction {
+ void operator()(Obj&) const { FAIL() << "Unexpected call"; }
+ void operator()(const Obj&) const {}
+ void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
+ void operator()(const Obj&&) const { FAIL() << "Unexpected call"; }
+ };
+
+ MockFunction<void(Obj)> mock;
+ EXPECT_CALL(mock, Call)
+ .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}))
+ .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
+
+ mock.AsStdFunction()(Obj{});
+ mock.AsStdFunction()(Obj{});
+ }
+
+ // Mock action accepts by const lvalue reference: both actions should receive
+ // a const lvalue reference.
+ {
+ struct InitialAction {
+ void operator()(Obj&) const { FAIL() << "Unexpected call"; }
+ void operator()(const Obj&) const {}
+ void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
+ void operator()(const Obj&&) const { FAIL() << "Unexpected call"; }
+ };
+
+ MockFunction<void(const Obj&)> mock;
+ EXPECT_CALL(mock, Call)
+ .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](const Obj&) {}))
+ .WillRepeatedly(
+ DoAll(InitialAction{}, InitialAction{}, [](const Obj&) {}));
+
+ mock.AsStdFunction()(Obj{});
+ mock.AsStdFunction()(Obj{});
+ }
+
+ // Mock action accepts by non-const lvalue reference: both actions should get
+ // a non-const lvalue reference if they want them.
+ {
+ struct InitialAction {
+ void operator()(Obj&) const {}
+ void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
+ };
+
+ MockFunction<void(Obj&)> mock;
+ EXPECT_CALL(mock, Call)
+ .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&) {}))
+ .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&) {}));
+
+ Obj obj;
+ mock.AsStdFunction()(obj);
+ mock.AsStdFunction()(obj);
+ }
+
+ // Mock action accepts by rvalue reference: the initial actions should receive
+ // a non-const lvalue reference if it wants it, and the final action an rvalue
+ // reference.
+ {
+ struct InitialAction {
+ void operator()(Obj&) const {}
+ void operator()(Obj&&) const { FAIL() << "Unexpected call"; }
+ };
+
+ MockFunction<void(Obj &&)> mock;
+ EXPECT_CALL(mock, Call)
+ .WillOnce(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}))
+ .WillRepeatedly(DoAll(InitialAction{}, InitialAction{}, [](Obj&&) {}));
+
+ mock.AsStdFunction()(Obj{});
+ mock.AsStdFunction()(Obj{});
+ }
+}
+
// Tests using WithArgs and with an action that takes 1 argument.
TEST(WithArgsTest, OneArg) {
Action<bool(double x, int n)> a = WithArgs<1>(Invoke(Unary)); // NOLINT