From 206d9383958da13125f3899cd370837bc60a282e Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:51:42 -0700 Subject: [PATCH] test(spawners): lock legacy homeRange->spawnBounds JSON read Add regression tests for homeRange property conversion on deserialize. Tests verify that legacy JSON with homeRange field (no spawnBounds) deserializes to centered Rectangle3D bounds as implemented in BaseSpawner.OnAfterJsonDeserialize. - homeRange: 3 -> Rectangle3D(97, 197, -128, 7, 7, 256) - homeRange: 0 -> Rectangle3D(100, 200, 5, 1, 1, 0) Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Spawners/Json/LegacyHomeRangeTests.cs | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Projects/UOContent.Tests/Tests/Engines/Spawners/Json/LegacyHomeRangeTests.cs diff --git a/Projects/UOContent.Tests/Tests/Engines/Spawners/Json/LegacyHomeRangeTests.cs b/Projects/UOContent.Tests/Tests/Engines/Spawners/Json/LegacyHomeRangeTests.cs new file mode 100644 index 000000000..9fb614938 --- /dev/null +++ b/Projects/UOContent.Tests/Tests/Engines/Spawners/Json/LegacyHomeRangeTests.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.Text.Json; +using Server; +using Server.Engines.Spawners; +using Xunit; + +namespace UOContent.Tests.Engines.Spawners.Json; + +[Collection("Sequential UOContent Tests")] +public class LegacyHomeRangeTests +{ + [Fact] + public void HomeRange_NoSpawnBounds_ProducesCenteredBounds() + { + const string legacy = """ + [ + { + "$type": "Spawner", + "guid": "3df0543a-373c-4673-a98b-8191686f4ab3", + "location": [100, 200, 5], + "map": "Felucca", + "count": 1, + "homeRange": 3, + "entries": [ { "name": "Fisherman", "maxCount": 1, "probability": 100 } ] + } + ] + """; + + var rt = JsonSerializer.Deserialize>(legacy, SpawnerJsonSerializer.Options); + var s = Assert.IsType(Assert.Single(rt)); + + // homeRange 3 -> Rectangle3D(100-3, 200-3, -128, 7, 7, 256) + Assert.Equal(new Rectangle3D(97, 197, -128, 7, 7, 256), s.SpawnBounds); + + s.Delete(); + } + + [Fact] + public void HomeRangeZero_ProducesSingleTileBounds() + { + const string legacy = """ + [ + { + "$type": "Spawner", + "location": [100, 200, 5], + "map": "Felucca", + "count": 1, + "homeRange": 0, + "entries": [ { "name": "Fisherman", "maxCount": 1, "probability": 100 } ] + } + ] + """; + + var rt = JsonSerializer.Deserialize>(legacy, SpawnerJsonSerializer.Options); + var s = Assert.IsType(Assert.Single(rt)); + + // homeRange 0 -> Rectangle3D(100, 200, 5, 1, 1, 0) + Assert.Equal(new Rectangle3D(100, 200, 5, 1, 1, 0), s.SpawnBounds); + + s.Delete(); + } +}