// 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.
#include "flutter/shell/platform/windows/settings_plugin.h"

#include "flutter/shell/platform/windows/task_runner.h"
#include "flutter/shell/platform/windows/testing/test_binary_messenger.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace flutter {
namespace testing {

namespace {

class MockSettingsPlugin : public SettingsPlugin {
 public:
  explicit MockSettingsPlugin(BinaryMessenger* messenger,
                              TaskRunner* task_runner)
      : SettingsPlugin(messenger, task_runner) {}

  virtual ~MockSettingsPlugin() = default;

  // |SettingsPlugin|
  MOCK_METHOD0(StartWatching, void());
  MOCK_METHOD0(StopWatching, void());

  MOCK_METHOD0(GetAlwaysUse24HourFormat, bool());
  MOCK_METHOD0(GetTextScaleFactor, float());
  MOCK_METHOD0(GetPreferredBrightness, PlatformBrightness());
};

}  // namespace

TEST(SettingsPluginTest, SendSettingsSendsMessage) {
  bool message_is_sent = false;
  TestBinaryMessenger messenger(
      [&message_is_sent](const std::string& channel, const uint8_t* message,
                         size_t message_size,
                         BinaryReply reply) { message_is_sent = true; });
  ::testing::NiceMock<MockSettingsPlugin> settings_plugin(&messenger, nullptr);

  settings_plugin.SendSettings();

  EXPECT_TRUE(message_is_sent);
}

TEST(SettingsPluginTest, SendSettingsGetsSettings) {
  TestBinaryMessenger messenger([](const std::string& channel,
                                   const uint8_t* message, size_t message_size,
                                   BinaryReply reply) {});
  ::testing::NiceMock<MockSettingsPlugin> settings_plugin(&messenger, nullptr);

  EXPECT_CALL(settings_plugin, GetAlwaysUse24HourFormat).Times(1);
  EXPECT_CALL(settings_plugin, GetTextScaleFactor).Times(1);
  EXPECT_CALL(settings_plugin, GetPreferredBrightness).Times(1);

  settings_plugin.SendSettings();
}

}  // namespace testing
}  // namespace flutter
