#include #include "XCUIBackend/ImGuiTransitionBackend.h" #include #include namespace { class ImGuiContextScope { public: ImGuiContextScope() { IMGUI_CHECKVERSION(); ImGui::CreateContext(); } ~ImGuiContextScope() { ImGui::DestroyContext(); } }; } // namespace TEST(XCUIImGuiTransitionBackendTest, BeginFrameResetsPendingState) { ImGuiContextScope contextScope; XCEngine::Editor::XCUIBackend::ImGuiTransitionBackend backend = {}; XCEngine::UI::UIDrawList drawList("Pending"); drawList.AddFilledRect( XCEngine::UI::UIRect(0.0f, 0.0f, 16.0f, 16.0f), XCEngine::UI::UIColor(1.0f, 0.0f, 0.0f, 1.0f)); backend.BeginFrame(); backend.Submit(drawList); ASSERT_EQ(backend.GetPendingDrawListCount(), 1u); ASSERT_EQ(backend.GetPendingCommandCount(), 1u); backend.BeginFrame(); EXPECT_EQ(backend.GetPendingDrawListCount(), 0u); EXPECT_EQ(backend.GetPendingCommandCount(), 0u); } TEST(XCUIImGuiTransitionBackendTest, EndFrameFlushesCommandsToImGuiDrawList) { ImGuiContextScope contextScope; ImGuiIO& io = ImGui::GetIO(); io.DisplaySize = ImVec2(1280.0f, 720.0f); io.DeltaTime = 1.0f / 60.0f; unsigned char* fontPixels = nullptr; int fontWidth = 0; int fontHeight = 0; io.Fonts->GetTexDataAsRGBA32(&fontPixels, &fontWidth, &fontHeight); io.Fonts->SetTexID(static_cast(1)); XCEngine::Editor::XCUIBackend::ImGuiTransitionBackend backend = {}; XCEngine::UI::UIDrawList drawList("FlushTest"); drawList.PushClipRect(XCEngine::UI::UIRect(0.0f, 0.0f, 220.0f, 160.0f)); drawList.AddFilledRect( XCEngine::UI::UIRect(10.0f, 10.0f, 60.0f, 40.0f), XCEngine::UI::UIColor(0.1f, 0.2f, 0.3f, 1.0f), 4.0f); drawList.AddRectOutline( XCEngine::UI::UIRect(10.0f, 10.0f, 60.0f, 40.0f), XCEngine::UI::UIColor(0.9f, 0.9f, 0.9f, 1.0f), 2.0f, 4.0f); drawList.AddText( XCEngine::UI::UIPoint(18.0f, 26.0f), "Backend", XCEngine::UI::UIColor(1.0f, 1.0f, 1.0f, 1.0f), 16.0f); drawList.AddImage( XCEngine::UI::UIRect(90.0f, 12.0f, 32.0f, 32.0f), XCEngine::UI::UITextureHandle{ 0x100u, 32u, 32u }, XCEngine::UI::UIColor(1.0f, 1.0f, 1.0f, 1.0f)); drawList.PopClipRect(); backend.BeginFrame(); backend.Submit(drawList); ImGui::NewFrame(); ASSERT_TRUE(ImGui::Begin("XCUIBackendTest")); ImDrawList* targetDrawList = ImGui::GetWindowDrawList(); ASSERT_NE(targetDrawList, nullptr); const bool flushed = backend.EndFrame(targetDrawList); ImGui::End(); ImGui::EndFrame(); EXPECT_TRUE(flushed); EXPECT_EQ(backend.GetLastFlushedDrawListCount(), 1u); EXPECT_EQ(backend.GetLastFlushedCommandCount(), 6u); EXPECT_EQ(backend.GetPendingCommandCount(), 0u); EXPECT_GT(targetDrawList->VtxBuffer.Size, 0); EXPECT_GT(targetDrawList->CmdBuffer.Size, 0); }