1. GameObject 析构函数:从全局注册表移除自己,防止悬挂指针 2. SceneManager 测试:事件订阅后正确 Unsubscribe,防止 lambda 销毁后悬挂调用 3. SceneManager 测试:使用唯一场景名称避免覆盖问题
175 lines
4.5 KiB
C++
175 lines
4.5 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_F(SceneManagerTest, GetAllScenes_ReturnsAll) {
|
|
SceneManager& sm = SceneManager::Get();
|
|
size_t beforeCount = sm.GetAllScenes().size();
|
|
sm.CreateScene("GetAllScenes_TestScene1");
|
|
sm.CreateScene("GetAllScenes_TestScene2");
|
|
sm.CreateScene("GetAllScenes_TestScene3");
|
|
|
|
auto scenes = sm.GetAllScenes();
|
|
|
|
EXPECT_EQ(scenes.size(), beforeCount + 3);
|
|
}
|
|
|
|
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;
|
|
uint64_t subId = sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) {
|
|
eventFired = true;
|
|
});
|
|
|
|
sm.CreateScene("TestScene");
|
|
|
|
EXPECT_TRUE(eventFired);
|
|
sm.OnSceneLoaded().Unsubscribe(subId);
|
|
}
|
|
|
|
TEST(SceneManager_Test, OnActiveSceneChanged_Event) {
|
|
SceneManager& sm = SceneManager::Get();
|
|
Scene* scene1 = sm.CreateScene("Scene1");
|
|
Scene* scene2 = sm.CreateScene("Scene2");
|
|
|
|
bool eventFired = false;
|
|
uint64_t subId = sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) {
|
|
eventFired = true;
|
|
});
|
|
|
|
sm.SetActiveScene(scene2);
|
|
|
|
EXPECT_TRUE(eventFired);
|
|
sm.OnActiveSceneChanged().Unsubscribe(subId);
|
|
}
|
|
|
|
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
|