Add SerializeField private field support
This commit is contained in:
@@ -177,6 +177,7 @@ TEST_F(MonoScriptRuntimeTest, ClassFieldMetadataListsSupportedPublicInstanceFiel
|
||||
|
||||
const std::vector<ScriptFieldMetadata> expected = {
|
||||
{"Health", ScriptFieldType::Int32},
|
||||
{"HiddenFlag", ScriptFieldType::Bool},
|
||||
{"Label", ScriptFieldType::String},
|
||||
{"SpawnPoint", ScriptFieldType::Vector3},
|
||||
{"Speed", ScriptFieldType::Float},
|
||||
@@ -230,6 +231,23 @@ TEST_F(MonoScriptRuntimeTest, ClassFieldDefaultValueQueryReturnsEnumInitializers
|
||||
EXPECT_EQ(std::get<int32_t>(fieldIt->value), 2);
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, ClassFieldDefaultValueQueryReturnsSerializeFieldPrivateInitializers) {
|
||||
std::vector<ScriptFieldDefaultValue> fields;
|
||||
|
||||
EXPECT_TRUE(runtime->TryGetClassFieldDefaultValues("GameScripts", "Gameplay", "FieldMetadataProbe", fields));
|
||||
|
||||
const auto fieldIt = std::find_if(
|
||||
fields.begin(),
|
||||
fields.end(),
|
||||
[](const ScriptFieldDefaultValue& field) {
|
||||
return field.fieldName == "HiddenFlag";
|
||||
});
|
||||
|
||||
ASSERT_NE(fieldIt, fields.end());
|
||||
EXPECT_EQ(fieldIt->type, ScriptFieldType::Bool);
|
||||
EXPECT_TRUE(std::get<bool>(fieldIt->value));
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, ScriptEngineAppliesStoredFieldsAndInvokesLifecycleMethods) {
|
||||
Scene* runtimeScene = CreateScene("MonoRuntimeScene");
|
||||
GameObject* host = runtimeScene->CreateGameObject("Host");
|
||||
@@ -864,6 +882,92 @@ TEST_F(MonoScriptRuntimeTest, EnumScriptFieldsApplyStoredValuesAndPersistAcrossS
|
||||
EXPECT_EQ(loadedRuntimeState, 9);
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, SerializeFieldPrivateFieldsApplyStoredValuesAndPersistAcrossSceneRoundTrip) {
|
||||
Scene* runtimeScene = CreateScene("MonoRuntimeScene");
|
||||
GameObject* host = runtimeScene->CreateGameObject("Host");
|
||||
ScriptComponent* component = AddScript(host, "Gameplay", "SerializeFieldProbe");
|
||||
|
||||
component->GetFieldStorage().SetFieldValue("HiddenCounter", int32_t(42));
|
||||
component->GetFieldStorage().SetFieldValue("HiddenEnabled", false);
|
||||
|
||||
engine->OnRuntimeStart(runtimeScene);
|
||||
engine->OnUpdate(0.016f);
|
||||
|
||||
int32_t observedInitialHiddenCounter = 0;
|
||||
bool observedInitialHiddenEnabled = true;
|
||||
bool observedStoredValuesApplied = false;
|
||||
int32_t observedUpdatedHiddenCounter = 0;
|
||||
bool observedUpdatedHiddenEnabled = false;
|
||||
bool observedIgnoredPrivateCounterUntouched = false;
|
||||
int32_t runtimeHiddenCounter = 0;
|
||||
bool runtimeHiddenEnabled = false;
|
||||
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialHiddenCounter", observedInitialHiddenCounter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedInitialHiddenEnabled", observedInitialHiddenEnabled));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedStoredValuesApplied", observedStoredValuesApplied));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedHiddenCounter", observedUpdatedHiddenCounter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedUpdatedHiddenEnabled", observedUpdatedHiddenEnabled));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "ObservedIgnoredPrivateCounterUntouched", observedIgnoredPrivateCounterUntouched));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "HiddenCounter", runtimeHiddenCounter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(component, "HiddenEnabled", runtimeHiddenEnabled));
|
||||
|
||||
EXPECT_EQ(observedInitialHiddenCounter, 42);
|
||||
EXPECT_FALSE(observedInitialHiddenEnabled);
|
||||
EXPECT_TRUE(observedStoredValuesApplied);
|
||||
EXPECT_EQ(observedUpdatedHiddenCounter, 43);
|
||||
EXPECT_TRUE(observedUpdatedHiddenEnabled);
|
||||
EXPECT_TRUE(observedIgnoredPrivateCounterUntouched);
|
||||
EXPECT_EQ(runtimeHiddenCounter, 43);
|
||||
EXPECT_TRUE(runtimeHiddenEnabled);
|
||||
EXPECT_FALSE(component->GetFieldStorage().Contains("IgnoredPrivateCounter"));
|
||||
|
||||
int32_t storedHiddenCounter = 0;
|
||||
bool storedHiddenEnabled = false;
|
||||
EXPECT_TRUE(component->GetFieldStorage().TryGetFieldValue("HiddenCounter", storedHiddenCounter));
|
||||
EXPECT_TRUE(component->GetFieldStorage().TryGetFieldValue("HiddenEnabled", storedHiddenEnabled));
|
||||
EXPECT_EQ(storedHiddenCounter, 43);
|
||||
EXPECT_TRUE(storedHiddenEnabled);
|
||||
|
||||
const std::string serializedScene = runtimeScene->SerializeToString();
|
||||
|
||||
engine->OnRuntimeStop();
|
||||
|
||||
scene = std::make_unique<Scene>("ReloadedSerializeFieldScene");
|
||||
scene->DeserializeFromString(serializedScene);
|
||||
Scene* reloadedScene = scene.get();
|
||||
|
||||
GameObject* loadedHost = reloadedScene->Find("Host");
|
||||
ASSERT_NE(loadedHost, nullptr);
|
||||
|
||||
ScriptComponent* loadedComponent = FindScriptComponentByClass(loadedHost, "Gameplay", "SerializeFieldProbe");
|
||||
ASSERT_NE(loadedComponent, nullptr);
|
||||
|
||||
int32_t loadedStoredHiddenCounter = 0;
|
||||
bool loadedStoredHiddenEnabled = false;
|
||||
EXPECT_TRUE(loadedComponent->GetFieldStorage().TryGetFieldValue("HiddenCounter", loadedStoredHiddenCounter));
|
||||
EXPECT_TRUE(loadedComponent->GetFieldStorage().TryGetFieldValue("HiddenEnabled", loadedStoredHiddenEnabled));
|
||||
EXPECT_EQ(loadedStoredHiddenCounter, 43);
|
||||
EXPECT_TRUE(loadedStoredHiddenEnabled);
|
||||
|
||||
engine->OnRuntimeStart(reloadedScene);
|
||||
engine->OnUpdate(0.016f);
|
||||
|
||||
int32_t loadedObservedInitialHiddenCounter = 0;
|
||||
bool loadedObservedInitialHiddenEnabled = false;
|
||||
int32_t loadedRuntimeHiddenCounter = 0;
|
||||
bool loadedRuntimeHiddenEnabled = false;
|
||||
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(loadedComponent, "ObservedInitialHiddenCounter", loadedObservedInitialHiddenCounter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(loadedComponent, "ObservedInitialHiddenEnabled", loadedObservedInitialHiddenEnabled));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(loadedComponent, "HiddenCounter", loadedRuntimeHiddenCounter));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(loadedComponent, "HiddenEnabled", loadedRuntimeHiddenEnabled));
|
||||
|
||||
EXPECT_EQ(loadedObservedInitialHiddenCounter, 43);
|
||||
EXPECT_TRUE(loadedObservedInitialHiddenEnabled);
|
||||
EXPECT_EQ(loadedRuntimeHiddenCounter, 44);
|
||||
EXPECT_FALSE(loadedRuntimeHiddenEnabled);
|
||||
}
|
||||
|
||||
TEST_F(MonoScriptRuntimeTest, ScriptEngineFieldApiUpdatesLiveManagedInstanceAndStoredCache) {
|
||||
Scene* runtimeScene = CreateScene("MonoRuntimeScene");
|
||||
GameObject* host = runtimeScene->CreateGameObject("Host");
|
||||
|
||||
Reference in New Issue
Block a user