Skip to content

Commit

Permalink
Googletest export
Browse files Browse the repository at this point in the history
Fix DoAll to work with move-only sink arguments.

This changes types of the first n - 1 actions so that they only get a readonly
view of the arguments. The last action will accept move only objects.

PiperOrigin-RevId: 324600664
  • Loading branch information
Abseil Team authored and derekmauro committed Aug 7, 2020
1 parent e6e2d3b commit 48ec640
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
2 changes: 1 addition & 1 deletion googlemock/docs/cheat_sheet.md
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,7 @@ composite action - trying to do so will result in a run-time error.
<!-- mdformat off(no multiline tables) -->
| | |
| :----------------------------- | :------------------------------------------ |
| `DoAll(a1, a2, ..., an)` | Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void. |
| `DoAll(a1, a2, ..., an)` | Do all actions `a1` to `an` and return the result of `an` in each invocation. The first `n - 1` sub-actions must return void and will receive a readonly view of the arguments. |
| `IgnoreResult(a)` | Perform action `a` and ignore its result. `a` must not return void. |
| `WithArg<N>(a)` | Pass the `N`-th (0-based) argument of the mock function to action `a` and perform it. |
| `WithArgs<N1, N2, ..., Nk>(a)` | Pass the selected (0-based) arguments of the mock function to action `a` and perform it. |
Expand Down
17 changes: 11 additions & 6 deletions googlemock/include/gmock/gmock-actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -1032,8 +1032,13 @@ struct WithArgsAction {
template <typename... Actions>
struct DoAllAction {
private:
template <typename T>
using NonFinalType =
typename std::conditional<std::is_scalar<T>::value, T, const T&>::type;

template <typename... Args, size_t... I>
std::vector<Action<void(Args...)>> Convert(IndexSequence<I...>) const {
std::vector<Action<void(NonFinalType<Args>...)>> Convert(
IndexSequence<I...>) const {
return {std::get<I>(actions)...};
}

Expand All @@ -1043,14 +1048,13 @@ struct DoAllAction {
template <typename R, typename... Args>
operator Action<R(Args...)>() const { // NOLINT
struct Op {
std::vector<Action<void(Args...)>> converted;
std::vector<Action<void(NonFinalType<Args>...)>> converted;
Action<R(Args...)> last;
R operator()(Args... args) const {
auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...);
for (auto& a : converted) {
a.Perform(tuple_args);
a.Perform(std::forward_as_tuple(std::forward<Args>(args)...));
}
return last.Perform(tuple_args);
return last.Perform(std::forward_as_tuple(std::forward<Args>(args)...));
}
};
return Op{Convert<Args...>(MakeIndexSequence<sizeof...(Actions) - 1>()),
Expand Down Expand Up @@ -1093,7 +1097,8 @@ struct DoAllAction {
typedef internal::IgnoredValue Unused;

// Creates an action that does actions a1, a2, ..., sequentially in
// each invocation.
// each invocation. All but the last action will have a readonly view of the
// arguments.
template <typename... Action>
internal::DoAllAction<typename std::decay<Action>::type...> DoAll(
Action&&... action) {
Expand Down
9 changes: 9 additions & 0 deletions googlemock/test/gmock-generated-actions_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,15 @@ TEST(DoAllTest, TenActions) {
EXPECT_EQ('g', g);
}

TEST(DoAllTest, MoveOnlyArgs) {
bool ran_first = false;
Action<int(std::unique_ptr<int>)> a =
DoAll(InvokeWithoutArgs([&] { ran_first = true; }),
[](std::unique_ptr<int> p) { return *p; });
EXPECT_EQ(7, a.Perform(std::make_tuple(std::unique_ptr<int>(new int(7)))));
EXPECT_TRUE(ran_first);
}

// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
Expand Down

0 comments on commit 48ec640

Please sign in to comment.