// Copyright 2015 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.

#include "chromecast/base/bind_to_task_runner.h"

#include <memory>
#include <utility>

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::Pointee;

namespace chromecast {

namespace {

using Type = int;

constexpr Type kValue = 15;

class Callbacks {
 public:
  virtual void VoidCallback() = 0;
  virtual void ValueCallback(Type) = 0;
  virtual void ConstRefCallback(const Type&) = 0;
  virtual void MoveOnlyCallback(std::unique_ptr<Type>) = 0;
};

class MockCallbacks : public Callbacks {
 public:
  MOCK_METHOD0(VoidCallback, void());
  MOCK_METHOD1(ValueCallback, void(Type));
  MOCK_METHOD1(ConstRefCallback, void(const Type&));
  void MoveOnlyCallback(std::unique_ptr<Type> arg) override {
    DoMoveOnlyCallback(arg.get());
  }
  MOCK_METHOD1(DoMoveOnlyCallback, void(Type*));
};

}  // namespace

class BindToTaskRunnerTest : public ::testing::Test {
 public:
  ~BindToTaskRunnerTest() override { base::RunLoop().RunUntilIdle(); }

  base::MessageLoop loop_;
  MockCallbacks callbacks_;
};

TEST_F(BindToTaskRunnerTest, OnceClosure) {
  base::OnceClosure callback = BindToCurrentThread(
      base::BindOnce(&Callbacks::VoidCallback, base::Unretained(&callbacks_)));
  std::move(callback).Run();
  EXPECT_CALL(callbacks_, VoidCallback());
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithBoundValue) {
  base::OnceCallback<void()> callback = BindToCurrentThread(base::BindOnce(
      &Callbacks::ValueCallback, base::Unretained(&callbacks_), kValue));
  std::move(callback).Run();
  EXPECT_CALL(callbacks_, ValueCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithUnboundValue) {
  base::OnceCallback<void(Type)> callback = BindToCurrentThread(
      base::BindOnce(&Callbacks::ValueCallback, base::Unretained(&callbacks_)));
  std::move(callback).Run(kValue);
  EXPECT_CALL(callbacks_, ValueCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithBoundConstRef) {
  base::OnceCallback<void()> callback = BindToCurrentThread(base::BindOnce(
      &Callbacks::ConstRefCallback, base::Unretained(&callbacks_), kValue));
  std::move(callback).Run();
  EXPECT_CALL(callbacks_, ConstRefCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithUnboundConstRef) {
  base::OnceCallback<void(const Type&)> callback =
      BindToCurrentThread(base::BindOnce(&Callbacks::ConstRefCallback,
                                         base::Unretained(&callbacks_)));
  std::move(callback).Run(kValue);
  EXPECT_CALL(callbacks_, ConstRefCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithBoundMoveOnly) {
  base::OnceCallback<void()> callback = BindToCurrentThread(base::BindOnce(
      &Callbacks::MoveOnlyCallback, base::Unretained(&callbacks_),
      std::make_unique<Type>(kValue)));
  std::move(callback).Run();
  EXPECT_CALL(callbacks_, DoMoveOnlyCallback(Pointee(kValue)));
}

TEST_F(BindToTaskRunnerTest, OnceCallbackWithUnboundMoveOnly) {
  base::OnceCallback<void(std::unique_ptr<Type>)> callback =
      BindToCurrentThread(base::BindOnce(&Callbacks::MoveOnlyCallback,
                                         base::Unretained(&callbacks_)));
  std::move(callback).Run(std::make_unique<Type>(kValue));
  EXPECT_CALL(callbacks_, DoMoveOnlyCallback(Pointee(kValue)));
}

TEST_F(BindToTaskRunnerTest, RepeatingClosure) {
  base::RepeatingClosure callback = BindToCurrentThread(base::BindRepeating(
      &Callbacks::VoidCallback, base::Unretained(&callbacks_)));
  callback.Run();
  EXPECT_CALL(callbacks_, VoidCallback());
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithBoundValue) {
  base::RepeatingCallback<void()> callback =
      BindToCurrentThread(base::BindRepeating(
          &Callbacks::ValueCallback, base::Unretained(&callbacks_), kValue));
  callback.Run();
  EXPECT_CALL(callbacks_, ValueCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithUnboundValue) {
  base::RepeatingCallback<void(Type)> callback =
      BindToCurrentThread(base::BindRepeating(&Callbacks::ValueCallback,
                                              base::Unretained(&callbacks_)));
  callback.Run(kValue);
  EXPECT_CALL(callbacks_, ValueCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithBoundConstRef) {
  base::RepeatingCallback<void()> callback =
      BindToCurrentThread(base::BindRepeating(
          &Callbacks::ConstRefCallback, base::Unretained(&callbacks_), kValue));
  callback.Run();
  EXPECT_CALL(callbacks_, ConstRefCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithUnboundConstRef) {
  base::RepeatingCallback<void(const Type&)> callback =
      BindToCurrentThread(base::BindRepeating(&Callbacks::ConstRefCallback,
                                              base::Unretained(&callbacks_)));
  callback.Run(kValue);
  EXPECT_CALL(callbacks_, ConstRefCallback(kValue));
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithBoundMoveOnly) {
  base::RepeatingCallback<void()> callback =
      BindToCurrentThread(base::BindRepeating(
          &Callbacks::MoveOnlyCallback, base::Unretained(&callbacks_),
          base::Passed(std::make_unique<Type>(kValue))));
  callback.Run();
  EXPECT_CALL(callbacks_, DoMoveOnlyCallback(Pointee(kValue)));
}

TEST_F(BindToTaskRunnerTest, RepeatingCallbackWithUnboundMoveOnly) {
  base::RepeatingCallback<void(std::unique_ptr<Type>)> callback =
      BindToCurrentThread(base::BindRepeating(&Callbacks::MoveOnlyCallback,
                                              base::Unretained(&callbacks_)));
  callback.Run(std::make_unique<Type>(kValue));
  EXPECT_CALL(callbacks_, DoMoveOnlyCallback(Pointee(kValue)));
}

}  // namespace chromecast
