// Copyright 2020 The Fuchsia 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 SRC_UI_SCENIC_LIB_FLATLAND_ENGINE_TESTS_MOCK_DISPLAY_CONTROLLER_H_
#define SRC_UI_SCENIC_LIB_FLATLAND_ENGINE_TESTS_MOCK_DISPLAY_CONTROLLER_H_

#include <fuchsia/hardware/display/cpp/fidl_test_base.h>

namespace flatland {

class MockDisplayController : public fuchsia::hardware::display::testing::Controller_TestBase {
 public:
  explicit MockDisplayController() : binding_(this) {}

  void WaitForMessage() { binding_.WaitForMessage(); }

  void Bind(zx::channel device_channel, zx::channel controller_channel,
            async_dispatcher_t* dispatcher = nullptr) {
    device_channel_ = std::move(device_channel);
    binding_.Bind(fidl::InterfaceRequest<fuchsia::hardware::display::Controller>(
                      std::move(controller_channel)),
                  dispatcher);
  }

  MOCK_METHOD3(SetLayerColorConfig, void(uint64_t, uint32_t, std::vector<uint8_t>));

  MOCK_METHOD4(SetLayerImage, void(uint64_t, uint64_t, uint64_t, uint64_t));

  MOCK_METHOD2(CheckConfig, void(bool, CheckConfigCallback));

  MOCK_METHOD3(ImportBufferCollection,
               void(uint64_t, fidl::InterfaceHandle<class ::fuchsia::sysmem::BufferCollectionToken>,
                    ImportBufferCollectionCallback));

  MOCK_METHOD3(SetBufferCollectionConstraints,
               void(uint64_t, fuchsia::hardware::display::ImageConfig,
                    SetBufferCollectionConstraintsCallback));

  MOCK_METHOD1(ReleaseBufferCollection, void(uint64_t));

  MOCK_METHOD4(ImportImage, void(fuchsia::hardware::display::ImageConfig, uint64_t, uint32_t,
                                 ImportImageCallback));

  MOCK_METHOD1(ReleaseImage, void(uint64_t));

  MOCK_METHOD4(SetLayerPrimaryPosition,
               void(uint64_t, fuchsia::hardware::display::Transform,
                    fuchsia::hardware::display::Frame, fuchsia::hardware::display::Frame));

  MOCK_METHOD1(CreateLayer, void(CreateLayerCallback));

  MOCK_METHOD1(DestroyLayer, void(uint64_t));

  MOCK_METHOD2(SetDisplayLayers, void(uint64_t, ::std::vector<uint64_t>));

 private:
  void NotImplemented_(const std::string& name) final {}

  fidl::Binding<fuchsia::hardware::display::Controller> binding_;
  zx::channel device_channel_;
};

}  // namespace flatland

#endif  // SRC_UI_SCENIC_LIB_FLATLAND_ENGINE_TESTS_MOCK_DISPLAY_CONTROLLER_H_
