// 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_WINDOWS_TESTING_TEST_BINARY_MESSENGER_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_TEST_BINARY_MESSENGER_H_

#include <cassert>
#include <functional>
#include <map>
#include <string>

#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"

namespace flutter {

// A trivial BinaryMessenger implementation for use in tests.
class TestBinaryMessenger : public BinaryMessenger {
 public:
  using SendHandler = std::function<void(const std::string& channel,
                                         const uint8_t* message,
                                         size_t message_size,
                                         BinaryReply reply)>;

  // Creates a new messenge that forwards all calls to |send_handler|.
  explicit TestBinaryMessenger(SendHandler send_handler = nullptr)
      : send_handler_(std::move(send_handler)) {}

  virtual ~TestBinaryMessenger() = default;

  // Prevent copying.
  TestBinaryMessenger(TestBinaryMessenger const&) = delete;
  TestBinaryMessenger& operator=(TestBinaryMessenger const&) = delete;

  // Simulates a message from the engine on the given channel.
  //
  // Returns false if no handler is registered on that channel.
  bool SimulateEngineMessage(const std::string& channel,
                             const uint8_t* message,
                             size_t message_size,
                             BinaryReply reply) {
    auto handler = registered_handlers_.find(channel);
    if (handler == registered_handlers_.end()) {
      return false;
    }
    (handler->second)(message, message_size, reply);
    return true;
  }

  // |flutter::BinaryMessenger|
  void Send(const std::string& channel,
            const uint8_t* message,
            size_t message_size,
            BinaryReply reply) const override {
    // If something under test sends a message, the test should be handling it.
    assert(send_handler_);
    send_handler_(channel, message, message_size, reply);
  }

  // |flutter::BinaryMessenger|
  void SetMessageHandler(const std::string& channel,
                         BinaryMessageHandler handler) override {
    if (handler) {
      registered_handlers_[channel] = handler;
    } else {
      registered_handlers_.erase(channel);
    }
  }

 private:
  // Handler to call for SendMessage.
  SendHandler send_handler_;

  // Mapping of channel name to registered handlers.
  std::map<std::string, BinaryMessageHandler> registered_handlers_;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_WINDOWS_TESTING_TEST_BINARY_MESSENGER_H_
