// 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/common/cpp/client_wrapper/include/flutter/method_result_functions.h"

#include <functional>
#include <string>

#include "gtest/gtest.h"

namespace flutter {

// Tests that unset handlers don't cause crashes.
TEST(MethodChannelTest, NoHandlers) {
  MethodResultFunctions<int> result(nullptr, nullptr, nullptr);
  result.Success();
  result.Error("error");
  result.NotImplemented();
}

// Tests that Success calls through to handler.
TEST(MethodChannelTest, Success) {
  bool called = false;
  int value = 1;
  MethodResultFunctions<int> result(
      [&called, value](const int* i) {
        called = true;
        EXPECT_EQ(*i, value);
      },
      nullptr, nullptr);
  result.Success(&value);
  EXPECT_TRUE(called);
}

// Tests that Error calls through to handler.
TEST(MethodChannelTest, Error) {
  bool called = false;
  std::string error_code = "a";
  std::string error_message = "b";
  int error_details = 1;
  MethodResultFunctions<int> result(
      nullptr,
      [&called, error_code, error_message, error_details](
          const std::string& code, const std::string& message,
          const int* details) {
        called = true;
        EXPECT_EQ(code, error_code);
        EXPECT_EQ(message, error_message);
        EXPECT_EQ(*details, error_details);
      },
      nullptr);
  result.Error(error_code, error_message, &error_details);
  EXPECT_TRUE(called);
}

// Tests that NotImplemented calls through to handler.
TEST(MethodChannelTest, NotImplemented) {
  bool called = false;
  MethodResultFunctions<int> result(nullptr, nullptr,
                                    [&called]() { called = true; });
  result.NotImplemented();
  EXPECT_TRUE(called);
}

}  // namespace flutter
