Files
XCEngine/tests/Scene/test_scene_manager.cpp
ssdfasd 00f70eccf1 Engine: 实现 Components 和 Scene 模块,包含完整单元测试
新增 Components 模块:
- Component 基类 (生命周期、启用状态管理)
- TransformComponent (本地/世界空间变换、矩阵缓存、父子层级)
- GameObject (组件管理、父子层级、激活状态、静态查找)

新增 Scene 模块:
- Scene (场景管理、对象创建销毁、查找、生命周期)
- SceneManager (单例模式、多场景管理、场景切换)

新增测试:
- test_component.cpp (12 个测试)
- test_transform_component.cpp (35 个测试)
- test_game_object.cpp (26 个测试)
- test_scene.cpp (20 个测试)
- test_scene_manager.cpp (17 个测试)

所有测试均已编译通过。
2026-03-20 20:22:04 +08:00

172 lines
4.2 KiB
C++

#include <gtest/gtest.h>
#include <XCEngine/Scene/SceneManager.h>
#include <XCEngine/Components/GameObject.h>
using namespace XCEngine::Components;
namespace {
class SceneManagerTest : public ::testing::Test {
protected:
void TearDown() override {
auto scenes = SceneManager::Get().GetAllScenes();
for (auto* scene : scenes) {
SceneManager::Get().UnloadScene(scene);
}
}
};
TEST(SceneManager_Test, Get_ReturnsSingleton) {
SceneManager& sm1 = SceneManager::Get();
SceneManager& sm2 = SceneManager::Get();
EXPECT_EQ(&sm1, &sm2);
}
TEST(SceneManager_Test, CreateScene_Simple) {
SceneManager& sm = SceneManager::Get();
Scene* scene = sm.CreateScene("TestScene");
EXPECT_NE(scene, nullptr);
EXPECT_EQ(scene->GetName(), "TestScene");
}
TEST(SceneManager_Test, CreateScene_AssignsName) {
SceneManager& sm = SceneManager::Get();
Scene* scene = sm.CreateScene("MyScene");
EXPECT_EQ(scene->GetName(), "MyScene");
}
TEST(SceneManager_Test, GetScene_Exists) {
SceneManager& sm = SceneManager::Get();
sm.CreateScene("TestScene");
Scene* found = sm.GetScene("TestScene");
EXPECT_NE(found, nullptr);
EXPECT_EQ(found->GetName(), "TestScene");
}
TEST(SceneManager_Test, GetScene_NotExists) {
SceneManager& sm = SceneManager::Get();
Scene* found = sm.GetScene("NonExistent");
EXPECT_EQ(found, nullptr);
}
TEST(SceneManager_Test, GetAllScenes_ReturnsAll) {
SceneManager& sm = SceneManager::Get();
sm.CreateScene("Scene1");
sm.CreateScene("Scene2");
sm.CreateScene("Scene3");
auto scenes = sm.GetAllScenes();
EXPECT_EQ(scenes.size(), 3u);
}
TEST(SceneManager_Test, SetActiveScene) {
SceneManager& sm = SceneManager::Get();
Scene* scene1 = sm.CreateScene("Scene1");
Scene* scene2 = sm.CreateScene("Scene2");
sm.SetActiveScene(scene2);
EXPECT_EQ(sm.GetActiveScene(), scene2);
}
TEST(SceneManager_Test, SetActiveScene_ByName) {
SceneManager& sm = SceneManager::Get();
sm.CreateScene("Scene1");
sm.CreateScene("Scene2");
sm.SetActiveScene("Scene2");
EXPECT_EQ(sm.GetActiveScene()->GetName(), "Scene2");
}
TEST(SceneManager_Test, GetActiveScene_InitiallyFirst) {
SceneManager& sm = SceneManager::Get();
auto scenes = sm.GetAllScenes();
for (auto* scene : scenes) {
sm.UnloadScene(scene);
}
Scene* scene1 = sm.CreateScene("First");
EXPECT_EQ(sm.GetActiveScene(), scene1);
}
TEST(SceneManager_Test, UnloadScene) {
SceneManager& sm = SceneManager::Get();
Scene* scene = sm.CreateScene("ToUnload");
sm.UnloadScene(scene);
EXPECT_EQ(sm.GetScene("ToUnload"), nullptr);
}
TEST(SceneManager_Test, UnloadScene_ByName) {
SceneManager& sm = SceneManager::Get();
sm.CreateScene("ToUnload");
sm.UnloadScene("ToUnload");
EXPECT_EQ(sm.GetScene("ToUnload"), nullptr);
}
TEST(SceneManager_Test, OnSceneLoaded_Event) {
SceneManager& sm = SceneManager::Get();
bool eventFired = false;
sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) {
eventFired = true;
});
sm.CreateScene("TestScene");
EXPECT_TRUE(eventFired);
}
TEST(SceneManager_Test, OnActiveSceneChanged_Event) {
SceneManager& sm = SceneManager::Get();
Scene* scene1 = sm.CreateScene("Scene1");
Scene* scene2 = sm.CreateScene("Scene2");
bool eventFired = false;
sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) {
eventFired = true;
});
sm.SetActiveScene(scene2);
EXPECT_TRUE(eventFired);
}
TEST(SceneManager_Test, CreateScene_MultipleScenes) {
SceneManager& sm = SceneManager::Get();
Scene* scene1 = sm.CreateScene("Scene1");
Scene* scene2 = sm.CreateScene("Scene2");
Scene* scene3 = sm.CreateScene("Scene3");
EXPECT_NE(scene1, scene2);
EXPECT_NE(scene2, scene3);
EXPECT_NE(scene1, scene3);
}
TEST(SceneManager_Test, SetActiveScene_ToNullptr) {
SceneManager& sm = SceneManager::Get();
Scene* scene1 = sm.CreateScene("Scene1");
Scene* scene2 = sm.CreateScene("Scene2");
sm.SetActiveScene(scene2);
sm.SetActiveScene(nullptr);
EXPECT_EQ(sm.GetActiveScene(), nullptr);
}
} // namespace