Refactor editor scene document ownership into runtime coordinator

This commit is contained in:
2026-04-29 16:24:06 +08:00
parent 749417989a
commit 631bf32db2
9 changed files with 197 additions and 78 deletions

View File

@@ -62,7 +62,13 @@ public:
return true;
}
bool OpenSceneAsset(const std::filesystem::path&) override {
bool OpenSceneAsset(const std::filesystem::path& scenePath) override {
lastOpenedScenePath = scenePath;
if (!openSceneResult) {
return false;
}
editScene = std::make_unique<Scene>(openedSceneName);
activeScene = editScene.get();
return true;
}
@@ -142,11 +148,14 @@ public:
std::unique_ptr<Scene> editScene = {};
std::unique_ptr<Scene> runtimeScene = {};
Scene* activeScene = nullptr;
std::filesystem::path lastOpenedScenePath = {};
int beginPlaySessionCallCount = 0;
int endPlaySessionCallCount = 0;
int saveActiveSceneCallCount = 0;
bool savedActiveSceneWasEditScene = false;
bool failBeginPlaySession = false;
bool openSceneResult = true;
std::string openedSceneName = "Opened";
};
FakeEditorScenePlaySession::~FakeEditorScenePlaySession() {
@@ -162,12 +171,15 @@ struct RuntimeCoordinatorHarness {
auto backend = std::make_unique<FakeEditorSceneBackend>();
backendPtr = backend.get();
sceneRuntime.SetBackend(std::move(backend));
EXPECT_TRUE(sceneRuntime.Initialize("D:/Project"));
const EditorStartupSceneResult startupScene =
sceneRuntime.Initialize("D:/Project");
EXPECT_TRUE(startupScene.ready);
coordinator.Initialize(
session,
sceneRuntime,
projectRuntime,
EditorRuntimePaths{});
EditorRuntimePaths{},
startupScene);
}
EditorSession session = {};
@@ -177,6 +189,42 @@ struct RuntimeCoordinatorHarness {
EditorRuntimeCoordinator coordinator = {};
};
TEST(EditorRuntimeCoordinatorTests, InitializeProjectsStartupSceneDocumentStateToSession) {
RuntimeCoordinatorHarness harness = {};
EXPECT_EQ(
harness.session.currentScenePath,
std::filesystem::path("D:/Project/Assets/Scenes/Main.xc"));
EXPECT_EQ(harness.session.currentSceneName, "Edit");
EXPECT_FALSE(harness.session.sceneDocumentDirty);
EXPECT_EQ(harness.session.runtimeMode, EditorRuntimeMode::Edit);
}
TEST(EditorRuntimeCoordinatorTests, NewSceneProjectsUnsavedDirtyDocumentStateToSession) {
RuntimeCoordinatorHarness harness = {};
const UIEditorHostCommandDispatchResult newSceneResult =
harness.coordinator.DispatchFileCommand("file.new_scene");
EXPECT_TRUE(newSceneResult.commandExecuted);
EXPECT_TRUE(harness.session.currentScenePath.empty());
EXPECT_EQ(harness.session.currentSceneName, "Untitled");
EXPECT_TRUE(harness.session.sceneDocumentDirty);
}
TEST(EditorRuntimeCoordinatorTests, OpenSceneProjectsCoordinatorOwnedDocumentStateToSession) {
RuntimeCoordinatorHarness harness = {};
ASSERT_NE(harness.backendPtr, nullptr);
harness.backendPtr->openedSceneName = "Opened Scene";
const std::filesystem::path scenePath =
"D:/Project/Assets/Scenes/Secondary.xc";
ASSERT_TRUE(harness.coordinator.RequestOpenSceneAsset(scenePath));
EXPECT_EQ(harness.backendPtr->lastOpenedScenePath, scenePath);
EXPECT_EQ(harness.session.currentScenePath, scenePath);
EXPECT_EQ(harness.session.currentSceneName, "Opened Scene");
EXPECT_FALSE(harness.session.sceneDocumentDirty);
}
TEST(EditorRuntimeCoordinatorTests, PlayModeRunsRuntimeSceneAndRestoresEditSceneOnStop) {
RuntimeCoordinatorHarness harness = {};
ASSERT_NE(harness.backendPtr, nullptr);

View File

@@ -112,7 +112,9 @@ public:
TEST(EditorSceneRuntimeBackendTests, InitializeFailsWithoutBoundBackend) {
EditorSceneRuntime runtime = {};
EXPECT_FALSE(runtime.Initialize("D:/Xuanchi/Main/XCEngine/project"));
const EditorStartupSceneResult result =
runtime.Initialize("D:/Xuanchi/Main/XCEngine/project");
EXPECT_FALSE(result.ready);
}
TEST(EditorSceneRuntimeBackendTests, InitializeUsesBoundBackend) {
@@ -124,12 +126,14 @@ TEST(EditorSceneRuntimeBackendTests, InitializeUsesBoundBackend) {
EditorSceneRuntime runtime = {};
runtime.SetBackend(std::move(backend));
EXPECT_TRUE(runtime.Initialize("D:/Xuanchi/Main/XCEngine/project"));
const EditorStartupSceneResult result =
runtime.Initialize("D:/Xuanchi/Main/XCEngine/project");
EXPECT_TRUE(result.ready);
EXPECT_EQ(backendPtr->ensureStartupSceneCallCount, 1);
EXPECT_EQ(
backendPtr->lastProjectRoot,
std::filesystem::path("D:/Xuanchi/Main/XCEngine/project"));
EXPECT_EQ(runtime.GetStartupResult().sceneName, "Main");
EXPECT_EQ(result.sceneName, "Main");
}
TEST(EditorSceneRuntimeBackendTests, SetSelectionUsesBoundBackendObjectSnapshotLookup) {