// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_SHELL_PLATFORM_LINUX_MOCK_SIGNAL_HANDLER_H_
#define FLUTTER_SHELL_PLATFORM_LINUX_MOCK_SIGNAL_HANDLER_H_

#include <glib-object.h>
#include <glib.h>

#include "gmock/gmock.h"

// Expects a signal that has no arguments.
//
// MockSignalHandler timeout(timer, "timeout");
// EXPECT_SIGNAL(timeout).Times(3);
//
#define EXPECT_SIGNAL(mock) EXPECT_CALL(mock, Handler())

// Expects a signal that has 1 argument.
//
// MockSignalHandler1<int> name_changed(object, "name-changed");
// EXPECT_SIGNAL(name_changed, testing::StrEq("example"));
//
#define EXPECT_SIGNAL1(mock, a1) EXPECT_CALL(mock, Handler1(a1))

// Expects a signal that has 2 arguments.
//
// MockSignalHandler2<int, GObject*> child_added(parent, "children::add");
// EXPECT_SIGNAL2(child_added, testing::Eq(1), testing::A<GObject*>());
//
#define EXPECT_SIGNAL2(mock, a1, a2) EXPECT_CALL(mock, Handler2(a1, a2))

namespace flutter {
namespace testing {

class SignalHandler {
 public:
  SignalHandler(gpointer instance, const gchar* name, GCallback callback);
  virtual ~SignalHandler();

 private:
  gulong id_ = 0;
  gpointer instance_ = nullptr;
};

// A mock signal handler that has no arguments. Used with EXPECT_SIGNAL().
class MockSignalHandler : public SignalHandler {
 public:
  MockSignalHandler(gpointer instance, const gchar* name)
      : SignalHandler(instance, name, G_CALLBACK(OnSignal)) {}

  MOCK_METHOD0(Handler, void());

 private:
  static void OnSignal(MockSignalHandler* mock) { mock->Handler(); }
};

// A mock signal handler that has 1 argument. Used with EXPECT_SIGNAL1().
template <typename A1>
class MockSignalHandler1 : public SignalHandler {
 public:
  MockSignalHandler1(gpointer instance, const gchar* name)
      : SignalHandler(instance, name, G_CALLBACK(OnSignal1)) {}

  MOCK_METHOD1(Handler1, void(A1 a1));

 private:
  static void OnSignal1(MockSignalHandler1* mock, A1 a1) { mock->Handler1(a1); }
};

// A mock signal handler that has 2 arguments. Used with EXPECT_SIGNAL2().
template <typename A1, typename A2>
class MockSignalHandler2 : public SignalHandler {
 public:
  MockSignalHandler2(gpointer instance, const gchar* name)
      : SignalHandler(instance, name, G_CALLBACK(OnSignal2)) {}

  MOCK_METHOD2(Handler2, void(A1 a1, A2 a2));

 private:
  static void OnSignal2(MockSignalHandler2* mock, A1 a1, A2 a2) {
    mock->Handler2(a1, a2);
  }
};

}  // namespace testing
}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_LINUX_MOCK_SIGNAL_HANDLER_H_
