Commit d5e7d78b authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Commit Bot

[base] Introduce convenience typedefs for MockCallback

This change introduces the convenience typedefs base::MockOnceCallback,
base::MockRepeatingCallback, base::MockOnceClosure and
base::MockRepeatingClosure to base/test/mock_callback.h

Change-Id: I2db99b32e246b94da85805af666f9de93033ab33
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1674154Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672571}
parent 417b29c3
......@@ -8,7 +8,9 @@
// Analogous to GMock's built-in MockFunction, but for base::Callback instead of
// std::function. It takes the full callback type as a parameter, so that it can
// support both OnceCallback and RepeatingCallback.
// support both OnceCallback and RepeatingCallback. Furthermore, this file
// defines convenience typedefs in the form of MockOnceCallback<Signature>,
// MockRepeatingCallback<Signature>, MockOnceClosure and MockRepeatingClosure.
//
// Use:
// using FooCallback = base::RepeatingCallback<int(std::string)>;
......@@ -19,6 +21,15 @@
// Foo(callback.Get());
// }
//
// Or equivalently:
//
// TEST(FooTest, RunsCallbackWithBarArgument) {
// base::MockRepeatingCallback<int(std::string)> callback;
// EXPECT_CALL(callback, Run("bar")).WillOnce(Return(1));
// Foo(callback.Get());
// }
//
//
// Can be used with StrictMock and NiceMock. Caller must ensure that it outlives
// any base::Callback obtained from it.
......@@ -37,6 +48,14 @@ namespace base {
template <typename F>
class MockCallback;
template <typename Signature>
using MockOnceCallback = MockCallback<OnceCallback<Signature>>;
template <typename Signature>
using MockRepeatingCallback = MockCallback<RepeatingCallback<Signature>>;
using MockOnceClosure = MockCallback<OnceClosure>;
using MockRepeatingClosure = MockCallback<RepeatingClosure>;
template <typename R>
class MockCallback<RepeatingCallback<R()>> {
public:
......
......@@ -14,7 +14,9 @@ $$
// Analogous to GMock's built-in MockFunction, but for base::Callback instead of
// std::function. It takes the full callback type as a parameter, so that it can
// support both OnceCallback and RepeatingCallback.
// support both OnceCallback and RepeatingCallback. Furthermore, this file
// defines convenience typedefs in the form of MockOnceCallback<Signature>,
// MockRepeatingCallback<Signature>, MockOnceClosure and MockRepeatingClosure.
//
// Use:
// using FooCallback = base::RepeatingCallback<int(std::string)>;
......@@ -25,6 +27,15 @@ $$
// Foo(callback.Get());
// }
//
// Or equivalently:
//
// TEST(FooTest, RunsCallbackWithBarArgument) {
// base::MockRepeatingCallback<int(std::string)> callback;
// EXPECT_CALL(callback, Run("bar")).WillOnce(Return(1));
// Foo(callback.Get());
// }
//
//
// Can be used with StrictMock and NiceMock. Caller must ensure that it outlives
// any base::Callback obtained from it.
......@@ -43,6 +54,14 @@ namespace base {
template <typename F>
class MockCallback;
template <typename Signature>
using MockOnceCallback = MockCallback<OnceCallback<Signature>>;
template <typename Signature>
using MockRepeatingCallback = MockCallback<RepeatingCallback<Signature>>;
using MockOnceClosure = MockCallback<OnceClosure>;
using MockRepeatingClosure = MockCallback<RepeatingClosure>;
$range i 0..MAX_ARITY
$for i [[
$range j 1..i
......
......@@ -56,5 +56,26 @@ TEST(MockCallbackTest, WithArgsOnce) {
EXPECT_EQ(42, std::move(two_int_callback).Run(1, 2));
}
TEST(MockCallbackTest, Typedefs) {
static_assert(std::is_same<MockCallback<RepeatingCallback<int()>>,
MockRepeatingCallback<int()>>::value,
"Repeating typedef differs for zero args");
static_assert(std::is_same<MockCallback<RepeatingCallback<int(int, int)>>,
MockRepeatingCallback<int(int, int)>>::value,
"Repeating typedef differs for multiple args");
static_assert(std::is_same<MockCallback<RepeatingCallback<void()>>,
MockRepeatingClosure>::value,
"Repeating typedef differs for closure");
static_assert(std::is_same<MockCallback<OnceCallback<int()>>,
MockOnceCallback<int()>>::value,
"Once typedef differs for zero args");
static_assert(std::is_same<MockCallback<OnceCallback<int(int, int)>>,
MockOnceCallback<int(int, int)>>::value,
"Once typedef differs for multiple args");
static_assert(std::is_same<MockCallback<RepeatingCallback<void()>>,
MockRepeatingClosure>::value,
"Once typedef differs for closure");
}
} // namespace
} // namespace base
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment