#include #include using namespace XCEngine::Math; using namespace XCEngine::Scripting; namespace { TEST(ScriptFieldStorage_Test, StoresRetrievesAndRemovesSupportedValues) { ScriptFieldStorage storage; EXPECT_TRUE(storage.SetFieldValue("Speed", 3.5f)); EXPECT_TRUE(storage.SetFieldValue("Accuracy", 0.875)); EXPECT_TRUE(storage.SetFieldValue("IsAlive", true)); EXPECT_TRUE(storage.SetFieldValue("Health", int32_t(125))); EXPECT_TRUE(storage.SetFieldValue("Score", uint64_t(9001))); EXPECT_TRUE(storage.SetFieldValue("DisplayName", std::string("Player One"))); EXPECT_TRUE(storage.SetFieldValue("Offset2D", Vector2(1.0f, 2.0f))); EXPECT_TRUE(storage.SetFieldValue("Velocity", Vector3(3.0f, 4.0f, 5.0f))); EXPECT_TRUE(storage.SetFieldValue("Tint", Vector4(0.1f, 0.2f, 0.3f, 1.0f))); EXPECT_TRUE(storage.SetFieldValue("Target", GameObjectReference{42})); float speed = 0.0f; double accuracy = 0.0; bool isAlive = false; int32_t health = 0; uint64_t score = 0; std::string displayName; Vector2 offset2D; Vector3 velocity; Vector4 tint; GameObjectReference target; EXPECT_EQ(storage.GetFieldCount(), 10u); EXPECT_TRUE(storage.Contains("Velocity")); EXPECT_TRUE(storage.TryGetFieldValue("Speed", speed)); EXPECT_TRUE(storage.TryGetFieldValue("Accuracy", accuracy)); EXPECT_TRUE(storage.TryGetFieldValue("IsAlive", isAlive)); EXPECT_TRUE(storage.TryGetFieldValue("Health", health)); EXPECT_TRUE(storage.TryGetFieldValue("Score", score)); EXPECT_TRUE(storage.TryGetFieldValue("DisplayName", displayName)); EXPECT_TRUE(storage.TryGetFieldValue("Offset2D", offset2D)); EXPECT_TRUE(storage.TryGetFieldValue("Velocity", velocity)); EXPECT_TRUE(storage.TryGetFieldValue("Tint", tint)); EXPECT_TRUE(storage.TryGetFieldValue("Target", target)); EXPECT_FLOAT_EQ(speed, 3.5f); EXPECT_DOUBLE_EQ(accuracy, 0.875); EXPECT_TRUE(isAlive); EXPECT_EQ(health, 125); EXPECT_EQ(score, 9001u); EXPECT_EQ(displayName, "Player One"); EXPECT_EQ(offset2D, Vector2(1.0f, 2.0f)); EXPECT_EQ(velocity, Vector3(3.0f, 4.0f, 5.0f)); EXPECT_EQ(tint, Vector4(0.1f, 0.2f, 0.3f, 1.0f)); EXPECT_EQ(target, GameObjectReference{42}); EXPECT_TRUE(storage.Remove("IsAlive")); EXPECT_FALSE(storage.Contains("IsAlive")); EXPECT_EQ(storage.GetFieldCount(), 9u); } TEST(ScriptFieldStorage_Test, SerializeRoundTripPreservesFieldValues) { ScriptFieldStorage original; ASSERT_TRUE(original.SetFieldValue("Message", std::string("Ready;Set=Go|100%\nLine2"))); ASSERT_TRUE(original.SetFieldValue("Scale", Vector3(2.0f, 3.0f, 4.0f))); ASSERT_TRUE(original.SetFieldValue("Owner", GameObjectReference{778899})); ASSERT_TRUE(original.SetFieldValue("Counter", int32_t(-17))); const std::string serialized = original.SerializeToString(); ScriptFieldStorage restored; restored.DeserializeFromString(serialized); std::string message; Vector3 scale; GameObjectReference owner; int32_t counter = 0; EXPECT_TRUE(restored.TryGetFieldValue("Message", message)); EXPECT_TRUE(restored.TryGetFieldValue("Scale", scale)); EXPECT_TRUE(restored.TryGetFieldValue("Owner", owner)); EXPECT_TRUE(restored.TryGetFieldValue("Counter", counter)); EXPECT_EQ(message, "Ready;Set=Go|100%\nLine2"); EXPECT_EQ(scale, Vector3(2.0f, 3.0f, 4.0f)); EXPECT_EQ(owner, GameObjectReference{778899}); EXPECT_EQ(counter, -17); } } // namespace