// Copyright 2021 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.

#include "src/ui/lib/display/get_hardware_display_controller.h"

#include <lib/fpromise/promise.h>
#include <lib/fpromise/single_threaded_executor.h>
#include <lib/gtest/real_loop_fixture.h>
#include <lib/sys/cpp/component_context.h>

#include <gtest/gtest.h>

#include "src/ui/lib/display/hardware_display_controller_provider_impl.h"

namespace ui_display {
namespace test {

struct fake_context : fpromise::context {
  fpromise::executor* executor() const override { return nullptr; }
  fpromise::suspended_task suspend_task() override { return fpromise::suspended_task(); }
};

class GetHardwareDisplayControllerTest : public gtest::RealLoopFixture {};

TEST_F(GetHardwareDisplayControllerTest, ErrorCase) {
  auto promise = GetHardwareDisplayController();
  fake_context context;
  EXPECT_TRUE(promise(context).is_error());
}

TEST_F(GetHardwareDisplayControllerTest, WithHardwareDisplayControllerProviderImpl) {
  std::unique_ptr<sys::ComponentContext> app_context = sys::ComponentContext::Create();
  ui_display::HardwareDisplayControllerProviderImpl hdcp_service_impl(app_context.get());
  auto promise = GetHardwareDisplayController(&hdcp_service_impl);
  fake_context context;
  EXPECT_FALSE(promise(context).is_error());
}

}  // namespace test
}  // namespace ui_display
