blob: 04ef0cffdd8f89224dc0685d423f37ff917b1efc [file] [log] [blame] [edit]
// Copyright 2025 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/graphics/display/drivers/coordinator/added-display-info.h"
#include <fidl/fuchsia.hardware.display.engine/cpp/driver/wire.h>
#include <fidl/fuchsia.hardware.display.types/cpp/wire.h>
#include <fidl/fuchsia.images2/cpp/wire.h>
#include <lib/driver/testing/cpp/scoped_global_logger.h>
#include <lib/zx/result.h>
#include <zircon/errors.h>
#include <array>
#include <memory>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "src/graphics/display/lib/api-types/cpp/display-id.h"
#include "src/graphics/display/lib/api-types/cpp/mode.h"
#include "src/graphics/display/lib/api-types/cpp/pixel-format.h"
#include "src/lib/testing/predicates/status.h"
namespace display_coordinator {
namespace {
class AddedDisplayInfoTest : public ::testing::Test {
private:
fdf_testing::ScopedGlobalLogger logger_;
};
TEST_F(AddedDisplayInfoTest, CreateFromFidlTranscribesDisplayId) {
static constexpr display::DisplayId kDisplayId(42);
static constexpr std::array<display::Mode, 1> kModes = {
display::Mode({
.active_width = 1024,
.active_height = 768,
.refresh_rate_millihertz = 60'000,
}),
};
static constexpr std::array<display::PixelFormat, 1> kPixelFormats = {
display::PixelFormat::kR8G8B8A8};
std::array<fuchsia_hardware_display_types::wire::Mode, 1> fidl_modes = {kModes[0].ToFidl()};
std::array<fuchsia_images2::wire::PixelFormat, 1> fidl_pixel_formats = {
kPixelFormats[0].ToFidl()};
const fuchsia_hardware_display_engine::wire::RawDisplayInfo fidl_display_info = {
.display_id = kDisplayId.ToFidl(),
.preferred_modes =
fidl::VectorView<fuchsia_hardware_display_types::wire::Mode>::FromExternal(fidl_modes),
.pixel_formats =
fidl::VectorView<fuchsia_images2::wire::PixelFormat>::FromExternal(fidl_pixel_formats),
};
zx::result<std::unique_ptr<AddedDisplayInfo>> added_display_info_result =
AddedDisplayInfo::Create(fidl_display_info);
ASSERT_OK(added_display_info_result);
std::unique_ptr<AddedDisplayInfo> added_display_info =
std::move(added_display_info_result).value();
EXPECT_EQ(kDisplayId, added_display_info->display_id);
EXPECT_THAT(added_display_info->preferred_modes, ::testing::SizeIs(1));
EXPECT_THAT(added_display_info->pixel_formats, ::testing::SizeIs(1));
}
TEST_F(AddedDisplayInfoTest, CreateFromFidlTranscribesPixelFormats) {
static constexpr display::DisplayId kDisplayId(42);
static constexpr std::array<display::Mode, 1> kModes = {
display::Mode({
.active_width = 1024,
.active_height = 768,
.refresh_rate_millihertz = 60'000,
}),
};
static constexpr std::array<display::PixelFormat, 2> kPixelFormats = {
display::PixelFormat::kR8G8B8A8, display::PixelFormat::kB8G8R8A8};
std::array<fuchsia_hardware_display_types::wire::Mode, 1> fidl_modes = {kModes[0].ToFidl()};
std::array<fuchsia_images2::wire::PixelFormat, 2> fidl_pixel_formats = {
kPixelFormats[0].ToFidl(), kPixelFormats[1].ToFidl()};
const fuchsia_hardware_display_engine::wire::RawDisplayInfo fidl_display_info = {
.display_id = kDisplayId.ToFidl(),
.preferred_modes =
fidl::VectorView<fuchsia_hardware_display_types::wire::Mode>::FromExternal(fidl_modes),
.pixel_formats =
fidl::VectorView<fuchsia_images2::wire::PixelFormat>::FromExternal(fidl_pixel_formats),
};
zx::result<std::unique_ptr<AddedDisplayInfo>> added_display_info_result =
AddedDisplayInfo::Create(fidl_display_info);
ASSERT_OK(added_display_info_result);
std::unique_ptr<AddedDisplayInfo> added_display_info =
std::move(added_display_info_result).value();
EXPECT_THAT(added_display_info->pixel_formats, ::testing::ElementsAreArray(kPixelFormats));
EXPECT_EQ(kDisplayId, added_display_info->display_id);
EXPECT_THAT(added_display_info->preferred_modes, ::testing::SizeIs(1));
}
TEST_F(AddedDisplayInfoTest, CreateFromFidlCopiesDisplayModes) {
static constexpr display::DisplayId kDisplayId(42);
static constexpr std::array<display::PixelFormat, 1> kPixelFormats = {
display::PixelFormat::kR8G8B8A8};
std::array<fuchsia_images2::wire::PixelFormat, 1> fidl_pixel_formats = {
kPixelFormats[0].ToFidl()};
std::array<fuchsia_hardware_display_types::wire::Mode, 2> fidl_display_modes = {{
{
.active_area = {.width = 640, .height = 480},
.refresh_rate_millihertz = 60'000,
},
{
.active_area = {.width = 1024, .height = 768},
.refresh_rate_millihertz = 75'000,
},
}};
const fuchsia_hardware_display_engine::wire::RawDisplayInfo fidl_display_info = {
.display_id = kDisplayId.ToFidl(),
.preferred_modes = fidl::VectorView<fuchsia_hardware_display_types::wire::Mode>::FromExternal(
fidl_display_modes),
.pixel_formats =
fidl::VectorView<fuchsia_images2::wire::PixelFormat>::FromExternal(fidl_pixel_formats),
};
zx::result<std::unique_ptr<AddedDisplayInfo>> added_display_info_result =
AddedDisplayInfo::Create(fidl_display_info);
ASSERT_OK(added_display_info_result);
std::unique_ptr<AddedDisplayInfo> added_display_info =
std::move(added_display_info_result).value();
ASSERT_THAT(added_display_info->preferred_modes, ::testing::SizeIs(2));
EXPECT_EQ(640, added_display_info->preferred_modes[0].active_area().width());
EXPECT_EQ(480, added_display_info->preferred_modes[0].active_area().height());
EXPECT_EQ(60'000, added_display_info->preferred_modes[0].refresh_rate_millihertz());
EXPECT_EQ(1024, added_display_info->preferred_modes[1].active_area().width());
EXPECT_EQ(768, added_display_info->preferred_modes[1].active_area().height());
EXPECT_EQ(75'000, added_display_info->preferred_modes[1].refresh_rate_millihertz());
EXPECT_EQ(kDisplayId, added_display_info->display_id);
EXPECT_THAT(added_display_info->pixel_formats, ::testing::SizeIs(1));
}
} // namespace
} // namespace display_coordinator