Use explicit workspace mutation requests for window sync
This commit is contained in:
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user