$$ This is a pump file for generating file templates.  Pump is a python
$$ script that is part of the Google Test suite of utilities.  Description
$$ can be found here:
$$
$$ https://github.com/google/googletest/blob/master/googletest/docs/PumpManual.md
$$
$$ MAX_ARITY controls the number of arguments that MockCallback supports.
$$ It is choosen to match the number GMock supports.
$var MAX_ARITY = 10
$$
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// 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.
//
// Use:
//   using FooCallback = base::Callback<int(std::string)>;
//
//   TEST(FooTest, RunsCallbackWithBarArgument) {
//     base::MockCallback<FooCallback> 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.

#ifndef BASE_TEST_MOCK_CALLBACK_H_
#define BASE_TEST_MOCK_CALLBACK_H_

#include "base/bind.h"
#include "base/callback.h"
#include "base/macros.h"
#include "testing/gmock/include/gmock/gmock.h"

namespace base {

// clang-format off

template <typename F>
class MockCallback;

$range i 0..MAX_ARITY
$for i [[
$range j 1..i
$var run_type = [[R($for j, [[A$j]])]]

template <typename R$for j [[, typename A$j]]>
class MockCallback<Callback<$run_type>> {
 public:
  MockCallback() = default;
  MOCK_METHOD$(i)_T(Run, $run_type);

  Callback<$run_type> Get() {
    return Bind(&MockCallback::Run, Unretained(this));
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(MockCallback);
};

template <typename R$for j [[, typename A$j]]>
class MockCallback<OnceCallback<$run_type>> {
 public:
  MockCallback() = default;
  MOCK_METHOD$(i)_T(Run, $run_type);

  OnceCallback<$run_type> Get() {
    return BindOnce(&MockCallback::Run, Unretained(this));
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(MockCallback);
};

]]

// clang-format on

}  // namespace base

#endif  // BASE_TEST_MOCK_CALLBACK_H_
