Prepare script lifecycle and data layer

This commit is contained in:
2026-03-26 20:14:58 +08:00
parent 5ca5ca1f19
commit 0921f2a459
20 changed files with 1367 additions and 26 deletions

View File

@@ -27,9 +27,22 @@ public:
bool m_awakeCalled = false;
bool m_updateCalled = false;
bool m_onDestroyCalled = false;
int m_startCount = 0;
int m_updateCount = 0;
int m_onDestroyCount = 0;
int* m_externalOnDestroyCount = nullptr;
void Awake() override { m_awakeCalled = true; }
void Update(float deltaTime) override { m_updateCalled = true; }
void Start() override { ++m_startCount; }
void Update(float deltaTime) override { m_updateCalled = true; ++m_updateCount; }
void OnDestroy() override {
m_onDestroyCalled = true;
++m_onDestroyCount;
if (m_externalOnDestroyCount) {
++(*m_externalOnDestroyCount);
}
}
private:
std::string m_customName;
@@ -111,6 +124,17 @@ TEST_F(SceneTest, DestroyGameObject_WithChildren) {
EXPECT_EQ(testScene->Find("Child"), nullptr);
}
TEST_F(SceneTest, DestroyGameObject_CallsOnDestroyOnce) {
GameObject* go = testScene->CreateGameObject("DestroyMe");
TestComponent* comp = go->AddComponent<TestComponent>();
int destroyCount = 0;
comp->m_externalOnDestroyCount = &destroyCount;
testScene->DestroyGameObject(go);
EXPECT_EQ(destroyCount, 1);
}
TEST_F(SceneTest, Find_Exists) {
testScene->CreateGameObject("FindMe");
@@ -163,6 +187,28 @@ TEST_F(SceneTest, Update_SkipsInactiveObjects) {
EXPECT_FALSE(comp->m_updateCalled);
}
TEST_F(SceneTest, Update_RecursivelyUpdatesChildObjects) {
GameObject* parent = testScene->CreateGameObject("Parent");
GameObject* child = testScene->CreateGameObject("Child", parent);
TestComponent* comp = child->AddComponent<TestComponent>();
testScene->Update(0.016f);
EXPECT_TRUE(comp->m_updateCalled);
EXPECT_EQ(comp->m_updateCount, 1);
}
TEST_F(SceneTest, Update_CallsStartOnlyOnceBeforeUpdate) {
GameObject* go = testScene->CreateGameObject("TestObject");
TestComponent* comp = go->AddComponent<TestComponent>();
testScene->Update(0.016f);
testScene->Update(0.016f);
EXPECT_EQ(comp->m_startCount, 1);
EXPECT_EQ(comp->m_updateCount, 2);
}
TEST(Scene_Test, IsActive_DefaultTrue) {
Scene s;
@@ -415,6 +461,27 @@ TEST_F(SceneTest, SerializeToString_And_DeserializeFromString_PreservesHierarchy
EXPECT_TRUE(loadedCamera->IsPrimary());
}
TEST_F(SceneTest, SerializeToString_And_DeserializeFromString_PreservesUUIDs) {
GameObject* parent = testScene->CreateGameObject("Parent");
GameObject* child = testScene->CreateGameObject("Child", parent);
const uint64_t parentUUID = parent->GetUUID();
const uint64_t childUUID = child->GetUUID();
const std::string serialized = testScene->SerializeToString();
Scene loadedScene;
loadedScene.DeserializeFromString(serialized);
GameObject* loadedParent = loadedScene.Find("Parent");
GameObject* loadedChild = loadedScene.Find("Child");
ASSERT_NE(loadedParent, nullptr);
ASSERT_NE(loadedChild, nullptr);
EXPECT_EQ(loadedParent->GetUUID(), parentUUID);
EXPECT_EQ(loadedChild->GetUUID(), childUUID);
}
TEST_F(SceneTest, Save_ContainsHierarchyAndComponentEntries) {
GameObject* parent = testScene->CreateGameObject("Parent");
GameObject* child = testScene->CreateGameObject("Child", parent);