Use explicit workspace mutation requests for window sync

This commit is contained in:
2026-04-26 00:25:49 +08:00
parent 5b6c46d382
commit c62a7fec0a
10 changed files with 130 additions and 23 deletions

View File

@@ -1,5 +1,6 @@
#include <gtest/gtest.h>
#include "Windowing/Frame/EditorWindowTransferRequests.h"
#include "Windowing/System/EditorWindowSystem.h"
#include <XCEditor/Workspace/UIEditorWindowWorkspaceController.h>
@@ -13,6 +14,7 @@ using XCEngine::UI::Editor::App::EditorWindowHostSnapshot;
using XCEngine::UI::Editor::App::EditorWindowSynchronizationActionKind;
using XCEngine::UI::Editor::App::EditorWindowSynchronizationPlannerInput;
using XCEngine::UI::Editor::App::EditorWindowSystem;
using XCEngine::UI::Editor::App::EditorWindowWorkspaceMutationRequest;
using XCEngine::UI::Editor::BuildDefaultUIEditorWorkspaceController;
using XCEngine::UI::Editor::BuildUIEditorWorkspacePanel;
using XCEngine::UI::Editor::BuildUIEditorWorkspaceSingleTabStack;
@@ -319,6 +321,78 @@ TEST(EditorWindowSynchronizationPlannerTest, LiveWindowMutationBuildsCommitPlanW
EXPECT_EQ(system.GetWindowSet().windows.front().workspace.activePanelId, "doc-b");
}
TEST(EditorWindowSynchronizationPlannerTest, WorkspaceMutationRequestBuildsCommitPlanFromExplicitPayload) {
EditorWindowSystem system = BuildSystem();
const auto workspaceController =
BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace());
std::string error = {};
ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error;
auto liveController = workspaceController;
const auto commandResult = liveController.Dispatch(
UIEditorWorkspaceCommand{
.kind = UIEditorWorkspaceCommandKind::ActivatePanel,
.panelId = "doc-b",
});
ASSERT_EQ(commandResult.status, UIEditorWorkspaceCommandStatus::Changed);
EditorWindowWorkspaceMutationRequest request = {};
request.windowState.windowId = "main";
request.windowState.workspace = liveController.GetWorkspace();
request.windowState.session = liveController.GetSession();
auto plan = system.BuildPlanForWorkspaceMutationRequest(
request,
{
BuildWorkspaceSnapshot(
"main",
true,
workspaceController,
L"Main Scene - XCEngine Editor"),
},
L"Main Scene - XCEngine Editor",
error);
ASSERT_TRUE(plan.valid) << error;
ASSERT_EQ(plan.actions.size(), 1u);
EXPECT_EQ(plan.actions[0].kind, EditorWindowSynchronizationActionKind::UpdateWorkspaceWindow);
EXPECT_EQ(plan.actions[0].update.windowState.windowId, "main");
const auto* mutatedState = FindUIEditorWindowWorkspaceState(plan.targetWindowSet, "main");
ASSERT_NE(mutatedState, nullptr);
EXPECT_EQ(mutatedState->workspace.activePanelId, "doc-b");
ASSERT_TRUE(system.CommitSynchronizationPlan(plan, error)) << error;
EXPECT_EQ(system.GetWindowSet().windows.front().workspace.activePanelId, "doc-b");
}
TEST(EditorWindowSynchronizationPlannerTest, WorkspaceMutationRequestRejectsUnknownWindowId) {
EditorWindowSystem system = BuildSystem();
const auto workspaceController =
BuildDefaultUIEditorWorkspaceController(BuildPanelRegistry(), BuildWorkspace());
std::string error = {};
ASSERT_TRUE(system.BootstrapPrimaryWindow("main", workspaceController, error)) << error;
EditorWindowWorkspaceMutationRequest request = {};
request.windowState.windowId = "missing-window";
request.windowState.workspace = workspaceController.GetWorkspace();
request.windowState.session = workspaceController.GetSession();
auto plan = system.BuildPlanForWorkspaceMutationRequest(
request,
{
BuildWorkspaceSnapshot(
"main",
true,
workspaceController,
L"Main Scene - XCEngine Editor"),
},
L"Main Scene - XCEngine Editor",
error);
EXPECT_FALSE(plan.valid);
EXPECT_NE(error.find("missing-window"), std::string::npos);
}
TEST(EditorWindowSynchronizationPlannerTest, DestroyedPrimaryWindowProducesCloseActionsForRemainingDetachedWindows) {
EditorWindowSystem system = BuildSystem();
const auto workspaceController =