#include #include "XCUIBackend/NullXCUIPanelCanvasHost.h" namespace { using XCEngine::Editor::XCUIBackend::CreateNullXCUIPanelCanvasHost; using XCEngine::Editor::XCUIBackend::BuildPassiveXCUIPanelCanvasSession; using XCEngine::Editor::XCUIBackend::IXCUIPanelCanvasHost; using XCEngine::Editor::XCUIBackend::ResolveXCUIPanelCanvasChildId; using XCEngine::Editor::XCUIBackend::XCUIPanelCanvasRequest; using XCEngine::Editor::XCUIBackend::XCUIPanelCanvasSession; TEST(NewEditorXCUIPanelCanvasHostTest, NullHostProvidesStableDebugNameAndSafePassiveSessions) { std::unique_ptr host = CreateNullXCUIPanelCanvasHost(); ASSERT_NE(host, nullptr); EXPECT_STREQ(host->GetDebugName(), "NullXCUIPanelCanvasHost"); const XCUIPanelCanvasSession session = host->BeginCanvas({}); EXPECT_FALSE(session.validCanvas); EXPECT_FALSE(session.hovered); EXPECT_FALSE(session.windowFocused); EXPECT_FLOAT_EQ(session.hostRect.width, 0.0f); EXPECT_FLOAT_EQ(session.hostRect.height, 0.0f); host->EndCanvas(); } TEST(NewEditorXCUIPanelCanvasHostTest, ResolveChildIdFallsBackToStableDefaultForMissingNames) { XCUIPanelCanvasRequest request = {}; EXPECT_STREQ(ResolveXCUIPanelCanvasChildId(request), "XCUIPanelCanvasHost"); EXPECT_STREQ(ResolveXCUIPanelCanvasChildId(request, "FallbackCanvas"), "FallbackCanvas"); request.childId = ""; EXPECT_STREQ(ResolveXCUIPanelCanvasChildId(request), "XCUIPanelCanvasHost"); request.childId = "CanvasHost"; EXPECT_STREQ(ResolveXCUIPanelCanvasChildId(request, "FallbackCanvas"), "CanvasHost"); } TEST(NewEditorXCUIPanelCanvasHostTest, PassiveSessionClampsRequestGeometryIntoSafeDefaultState) { XCUIPanelCanvasRequest request = {}; request.height = -18.0f; request.topInset = 42.0f; XCUIPanelCanvasSession session = BuildPassiveXCUIPanelCanvasSession(request); EXPECT_FALSE(session.validCanvas); EXPECT_FALSE(session.hovered); EXPECT_FALSE(session.windowFocused); EXPECT_FLOAT_EQ(session.hostRect.width, 0.0f); EXPECT_FLOAT_EQ(session.hostRect.height, 0.0f); EXPECT_FLOAT_EQ(session.canvasRect.y, 0.0f); EXPECT_FLOAT_EQ(session.canvasRect.height, 0.0f); request.height = 120.0f; request.topInset = 180.0f; session = BuildPassiveXCUIPanelCanvasSession(request); EXPECT_FLOAT_EQ(session.hostRect.height, 120.0f); EXPECT_FLOAT_EQ(session.canvasRect.y, 120.0f); EXPECT_FLOAT_EQ(session.canvasRect.height, 0.0f); } TEST(NewEditorXCUIPanelCanvasHostTest, NullHostBeginCanvasReturnsSafePassiveSessionAndDrawCallsAreNoops) { std::unique_ptr host = CreateNullXCUIPanelCanvasHost(); ASSERT_NE(host, nullptr); XCUIPanelCanvasRequest request = {}; request.childId = "NullCanvas"; request.height = 280.0f; request.topInset = 24.0f; request.bordered = true; request.showSurfaceImage = true; request.drawPreviewFrame = true; request.placeholderTitle = "Placeholder"; request.badgeTitle = "Badge"; const XCUIPanelCanvasSession session = host->BeginCanvas(request); EXPECT_FALSE(session.validCanvas); EXPECT_FALSE(session.hovered); EXPECT_FALSE(session.windowFocused); EXPECT_FLOAT_EQ(session.hostRect.width, 0.0f); EXPECT_FLOAT_EQ(session.hostRect.height, 280.0f); EXPECT_FLOAT_EQ(session.canvasRect.width, 0.0f); EXPECT_FLOAT_EQ(session.canvasRect.y, 24.0f); EXPECT_FLOAT_EQ(session.canvasRect.height, 256.0f); EXPECT_FLOAT_EQ(session.pointerPosition.x, 0.0f); EXPECT_FLOAT_EQ(session.pointerPosition.y, 0.0f); host->DrawFilledRect( XCEngine::UI::UIRect(10.0f, 12.0f, 48.0f, 64.0f), XCEngine::UI::UIColor(1.0f, 0.0f, 0.0f, 1.0f), 6.0f); host->DrawOutlineRect( XCEngine::UI::UIRect(5.0f, 6.0f, 100.0f, 40.0f), XCEngine::UI::UIColor(0.0f, 1.0f, 0.0f, 1.0f), 2.0f, 8.0f); host->DrawText( XCEngine::UI::UIPoint(8.0f, 14.0f), "Null host should ignore text draws", XCEngine::UI::UIColor(1.0f, 1.0f, 1.0f, 1.0f), 16.0f); host->EndCanvas(); const XCUIPanelCanvasSession secondSession = host->BeginCanvas({}); EXPECT_FLOAT_EQ(secondSession.hostRect.height, 0.0f); EXPECT_FLOAT_EQ(secondSession.canvasRect.height, 0.0f); host->EndCanvas(); } } // namespace