#include "XCUIBackend/XCUINativeShellLayout.h" #include namespace { using XCEngine::Editor::XCUIBackend::BuildXCUINativeShellCanvasRect; using XCEngine::Editor::XCUIBackend::BuildXCUINativeShellLayout; using XCEngine::Editor::XCUIBackend::XCUINativeShellMetrics; using XCEngine::Editor::XCUIBackend::XCUINativeShellPanelLayout; using XCEngine::Editor::XCUIBackend::XCUINativeShellPanelSpec; using XCEngine::Editor::XCUIBackend::XCUIShellPanelId; using XCEngine::UI::UIPoint; using XCEngine::UI::UIRect; void ExpectRectEq( const UIRect& actual, const UIRect& expected) { EXPECT_FLOAT_EQ(actual.x, expected.x); EXPECT_FLOAT_EQ(actual.y, expected.y); EXPECT_FLOAT_EQ(actual.width, expected.width); EXPECT_FLOAT_EQ(actual.height, expected.height); } TEST(XCUINativeShellLayoutTest, CanvasRectUsesPanelHeaderAndPaddingInsets) { const XCUINativeShellMetrics metrics = {}; const UIRect panelRect(10.0f, 20.0f, 400.0f, 300.0f); const UIRect canvasRect = BuildXCUINativeShellCanvasRect(panelRect, metrics); ExpectRectEq(canvasRect, UIRect(24.0f, 62.0f, 372.0f, 244.0f)); } TEST(XCUINativeShellLayoutTest, ActivePanelFallsBackToVisiblePanelWhenRequestedPanelIsHidden) { const auto layout = BuildXCUINativeShellLayout( UIRect(0.0f, 0.0f, 1200.0f, 800.0f), { XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUIDemo, "XCUI Demo", false }, XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUILayoutLab, "XCUI Layout Lab", true }, }, XCUIShellPanelId::XCUIDemo, UIPoint(), false, false); ASSERT_EQ(layout.panelLayouts.size(), 1u); EXPECT_EQ(layout.activePanel, XCUIShellPanelId::XCUILayoutLab); EXPECT_TRUE(layout.panelLayouts.front().active); } TEST(XCUINativeShellLayoutTest, TwoPanelSplitMatchesCurrentSandboxPolicy) { const XCUINativeShellMetrics metrics = {}; const auto layout = BuildXCUINativeShellLayout( UIRect(0.0f, 0.0f, 1200.0f, 800.0f), { XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUIDemo, "XCUI Demo", true }, XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUILayoutLab, "XCUI Layout Lab", true }, }, XCUIShellPanelId::XCUIDemo, UIPoint(), false, false, metrics); ExpectRectEq(layout.topBarRect, UIRect(22.0f, 22.0f, 1156.0f, 58.0f)); ExpectRectEq(layout.footerRect, UIRect(22.0f, 744.0f, 1156.0f, 34.0f)); ExpectRectEq(layout.workspaceRect, UIRect(22.0f, 98.0f, 1156.0f, 628.0f)); ASSERT_EQ(layout.panelLayouts.size(), 2u); const XCUINativeShellPanelLayout& leftPanel = layout.panelLayouts[0]; const XCUINativeShellPanelLayout& rightPanel = layout.panelLayouts[1]; EXPECT_EQ(leftPanel.panelId, XCUIShellPanelId::XCUIDemo); EXPECT_EQ(rightPanel.panelId, XCUIShellPanelId::XCUILayoutLab); EXPECT_NEAR(leftPanel.panelRect.width, 693.6f, 0.001f); EXPECT_NEAR(rightPanel.panelRect.width, 444.4f, 0.001f); EXPECT_NEAR(rightPanel.panelRect.x, 733.6f, 0.001f); EXPECT_FLOAT_EQ(leftPanel.panelRect.height, 628.0f); EXPECT_FLOAT_EQ(rightPanel.panelRect.height, 628.0f); } TEST(XCUINativeShellLayoutTest, PointerPressTransfersActivePanelToHoveredCanvas) { const auto layout = BuildXCUINativeShellLayout( UIRect(0.0f, 0.0f, 1200.0f, 800.0f), { XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUIDemo, "XCUI Demo", true }, XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUILayoutLab, "XCUI Layout Lab", true }, }, XCUIShellPanelId::XCUIDemo, UIPoint(900.0f, 200.0f), true, true); ASSERT_EQ(layout.panelLayouts.size(), 2u); EXPECT_EQ(layout.activePanel, XCUIShellPanelId::XCUILayoutLab); EXPECT_FALSE(layout.panelLayouts[0].active); EXPECT_TRUE(layout.panelLayouts[1].active); EXPECT_TRUE(layout.panelLayouts[1].hovered); } TEST(XCUINativeShellLayoutTest, SingleVisiblePanelFillsWorkspaceAndBecomesActive) { const auto layout = BuildXCUINativeShellLayout( UIRect(0.0f, 0.0f, 1000.0f, 720.0f), { XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUIDemo, "XCUI Demo", true }, XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUILayoutLab, "XCUI Layout Lab", false }, }, XCUIShellPanelId::XCUILayoutLab, UIPoint(), false, false); ASSERT_EQ(layout.panelLayouts.size(), 1u); EXPECT_EQ(layout.activePanel, XCUIShellPanelId::XCUIDemo); ExpectRectEq(layout.panelLayouts[0].panelRect, layout.workspaceRect); } TEST(XCUINativeShellLayoutTest, UndersizedPanelStillParticipatesButReportsNotVisible) { const auto layout = BuildXCUINativeShellLayout( UIRect(0.0f, 0.0f, 240.0f, 400.0f), { XCUINativeShellPanelSpec{ XCUIShellPanelId::XCUIDemo, "XCUI Demo", true }, }, XCUIShellPanelId::XCUIDemo, UIPoint(), false, false); ASSERT_EQ(layout.panelLayouts.size(), 1u); EXPECT_FALSE(layout.panelLayouts[0].visible); ExpectRectEq(layout.panelLayouts[0].panelRect, layout.workspaceRect); } } // namespace