new_editor: tighten window workspace validation

This commit is contained in:
2026-04-17 21:23:47 +08:00
parent a8b3877f4b
commit 8f847db816
4 changed files with 861 additions and 0 deletions

View File

@@ -8,6 +8,8 @@ namespace {
using XCEngine::UI::Editor::AreUIEditorWorkspaceModelsEquivalent;
using XCEngine::UI::Editor::AreUIEditorWorkspaceSessionsEquivalent;
using XCEngine::UI::Editor::BuildDefaultUIEditorWindowWorkspaceController;
using XCEngine::UI::Editor::BuildDefaultUIEditorWindowWorkspaceSet;
using XCEngine::UI::Editor::BuildDefaultUIEditorWorkspaceSession;
using XCEngine::UI::Editor::BuildUIEditorWorkspacePanel;
using XCEngine::UI::Editor::BuildUIEditorWorkspaceSingleTabStack;
using XCEngine::UI::Editor::BuildUIEditorWorkspaceSplit;
@@ -20,10 +22,13 @@ using XCEngine::UI::Editor::UIEditorPanelRegistry;
using XCEngine::UI::Editor::UIEditorWindowWorkspaceController;
using XCEngine::UI::Editor::UIEditorWindowWorkspaceOperationStatus;
using XCEngine::UI::Editor::UIEditorWindowWorkspaceSet;
using XCEngine::UI::Editor::UIEditorWindowWorkspaceState;
using XCEngine::UI::Editor::UIEditorWindowWorkspaceValidationCode;
using XCEngine::UI::Editor::UIEditorWorkspaceDockPlacement;
using XCEngine::UI::Editor::UIEditorWorkspaceModel;
using XCEngine::UI::Editor::UIEditorWorkspaceNodeKind;
using XCEngine::UI::Editor::UIEditorWorkspaceSplitAxis;
using XCEngine::UI::Editor::ValidateUIEditorWindowWorkspaceSet;
UIEditorPanelRegistry BuildPanelRegistry() {
UIEditorPanelRegistry registry = {};
@@ -448,3 +453,31 @@ TEST(UIEditorWindowWorkspaceControllerTest, RejectedCrossWindowMoveFromMissingSo
EXPECT_EQ(controller.GetWindowSet().primaryWindowId, "main-window");
EXPECT_TRUE(AreWindowSetsEquivalent(controller.GetWindowSet(), windowSetBefore));
}
TEST(UIEditorWindowWorkspaceControllerTest, ValidationRejectsDuplicatePanelAcrossWindows) {
const UIEditorPanelRegistry registry = BuildPanelRegistry();
UIEditorWindowWorkspaceSet windowSet =
BuildDefaultUIEditorWindowWorkspaceSet(registry, BuildWorkspace());
windowSet.activeWindowId = "doc-a-window";
UIEditorWindowWorkspaceState duplicateWindow = {};
duplicateWindow.windowId = "doc-a-window";
duplicateWindow.workspace.root = BuildUIEditorWorkspaceSingleTabStack(
"doc-a-window-root",
"doc-a",
"Document A",
true);
duplicateWindow.workspace.activePanelId = "doc-a";
duplicateWindow.session =
BuildDefaultUIEditorWorkspaceSession(registry, duplicateWindow.workspace);
windowSet.windows.push_back(std::move(duplicateWindow));
const auto validation = ValidateUIEditorWindowWorkspaceSet(registry, windowSet);
EXPECT_EQ(
validation.code,
UIEditorWindowWorkspaceValidationCode::DuplicatePanelAcrossWindows);
EXPECT_NE(validation.message.find("doc-a"), std::string::npos);
EXPECT_NE(validation.message.find("main-window"), std::string::npos);
EXPECT_NE(validation.message.find("doc-a-window"), std::string::npos);
}