Refactor editor scene document ownership into runtime coordinator
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user