Add XCUI editor collection primitives and stack rollback

This commit is contained in:
2026-04-05 06:36:50 +08:00
parent 9525053624
commit 585575a738
7 changed files with 294 additions and 4 deletions

View File

@@ -205,3 +205,34 @@ TEST(UIRuntimeTest, ScreenStackControllerReplaceTopSwapsMenuContent) {
EXPECT_TRUE(DrawDataContainsText(frame.drawData, "Settings Menu"));
EXPECT_FALSE(DrawDataContainsText(frame.drawData, "Pause Menu"));
}
TEST(UIRuntimeTest, ScreenStackControllerReplaceTopKeepsPreviousScreenWhenReplacementFails) {
TempFileScope pauseView("xcui_runtime_pause", ".xcui", BuildViewMarkup("Pause Menu"));
UIDocumentScreenHost host = {};
UISystem system(host);
UIScreenStackController stack(system);
const auto pauseLayer = stack.PushMenu(BuildScreenAsset(pauseView.Path(), "runtime.pause"), "pause");
ASSERT_NE(pauseLayer, 0u);
XCEngine::UI::Runtime::UIScreenLayerOptions replacementOptions = {};
replacementOptions.debugName = "broken";
replacementOptions.acceptsInput = true;
replacementOptions.blocksLayersBelow = true;
UIScreenAsset invalidAsset = {};
invalidAsset.screenId = "runtime.invalid";
invalidAsset.documentPath = (fs::temp_directory_path() / "xcui_missing_runtime_screen.xcui").string();
EXPECT_FALSE(stack.ReplaceTop(invalidAsset, replacementOptions));
ASSERT_EQ(stack.GetEntryCount(), 1u);
ASSERT_NE(stack.GetTop(), nullptr);
EXPECT_EQ(stack.GetTop()->layerId, pauseLayer);
EXPECT_EQ(stack.GetTop()->asset.screenId, "runtime.pause");
EXPECT_EQ(system.GetLayerCount(), 1u);
const auto& frame = system.Update(BuildInputState(6u));
EXPECT_EQ(frame.presentedLayerCount, 1u);
EXPECT_TRUE(DrawDataContainsText(frame.drawData, "Pause Menu"));
}