Document two surprises in DoAllAction::NonFinalType.
PiperOrigin-RevId: 441589196 Change-Id: Ic3e483ca70d72261046bad464d817f9dfd4bec65
This commit is contained in:
committed by
Copybara-Service
parent
733f875989
commit
80600e56cc
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user