Fix play mode runtime scene replacement

This commit is contained in:
2026-04-08 00:33:50 +08:00
parent 69cb80ccd4
commit 23ff4004f4
9 changed files with 149 additions and 0 deletions

View File

@@ -3,6 +3,7 @@
#include "Core/EditorContext.h"
#include "Core/EditorEvents.h"
#include "Core/PlaySessionController.h"
#include "Commands/EntityCommands.h"
#include <XCEngine/Core/Math/Vector3.h>
#include <XCEngine/Input/InputManager.h>
@@ -236,5 +237,42 @@ TEST_F(PlaySessionControllerTest, GameViewInputFramesDriveAndReleaseRuntimeInput
m_controller.Detach(m_context);
}
TEST_F(PlaySessionControllerTest, RuntimeSceneUndoRedoRebindsPlaySessionBeforeStop) {
auto* editorEntity = m_context.GetSceneManager().CreateEntity("Persistent");
ASSERT_NE(editorEntity, nullptr);
const uint64_t editorEntityId = editorEntity->GetID();
ASSERT_TRUE(m_controller.StartPlay(m_context));
ASSERT_EQ(m_context.GetRuntimeMode(), EditorRuntimeMode::Play);
const auto* runtimeSceneBeforeUndo = m_context.GetSceneManager().GetScene();
ASSERT_NE(runtimeSceneBeforeUndo, nullptr);
ASSERT_EQ(m_controller.GetRuntimeScene(), runtimeSceneBeforeUndo);
auto* runtimeEntity = Commands::CreateEmptyEntity(m_context, nullptr, "Create Runtime Entity", "RuntimeOnly");
ASSERT_NE(runtimeEntity, nullptr);
const uint64_t runtimeEntityId = runtimeEntity->GetID();
ASSERT_EQ(m_controller.GetRuntimeScene(), m_context.GetSceneManager().GetScene());
m_context.GetUndoManager().Undo();
const auto* runtimeSceneAfterUndo = m_context.GetSceneManager().GetScene();
ASSERT_NE(runtimeSceneAfterUndo, nullptr);
EXPECT_NE(runtimeSceneAfterUndo, runtimeSceneBeforeUndo);
EXPECT_EQ(m_controller.GetRuntimeScene(), runtimeSceneAfterUndo);
EXPECT_EQ(m_context.GetSceneManager().GetEntity(runtimeEntityId), nullptr);
m_context.GetUndoManager().Redo();
const auto* runtimeSceneAfterRedo = m_context.GetSceneManager().GetScene();
ASSERT_NE(runtimeSceneAfterRedo, nullptr);
EXPECT_NE(runtimeSceneAfterRedo, runtimeSceneAfterUndo);
EXPECT_EQ(m_controller.GetRuntimeScene(), runtimeSceneAfterRedo);
EXPECT_NE(m_context.GetSceneManager().GetEntity(runtimeEntityId), nullptr);
ASSERT_TRUE(m_controller.StopPlay(m_context));
EXPECT_EQ(m_context.GetRuntimeMode(), EditorRuntimeMode::Edit);
ASSERT_NE(m_context.GetSceneManager().GetEntity(editorEntityId), nullptr);
EXPECT_EQ(m_context.GetSceneManager().GetEntity(runtimeEntityId), nullptr);
}
} // namespace
} // namespace XCEngine::Editor