diff --git a/Projects/Server.Tests/Tests/Json/Rectangle3DConverterTests.cs b/Projects/Server.Tests/Tests/Json/Rectangle3DConverterTests.cs new file mode 100644 index 000000000..b91c521dc --- /dev/null +++ b/Projects/Server.Tests/Tests/Json/Rectangle3DConverterTests.cs @@ -0,0 +1,46 @@ +using System.Text.Json; +using Server.Json; +using Xunit; + +namespace Server.Tests.Json; + +public class Rectangle3DConverterTests +{ + private static Rectangle3D RoundTrip(Rectangle3D value) + { + var json = JsonSerializer.Serialize(value, JsonConfig.DefaultOptions); + return JsonSerializer.Deserialize(json, JsonConfig.DefaultOptions); + } + + [Theory] + // homeRange-style full vertical range (z1=-128, depth 256 -> z2=128): must survive losslessly. + [InlineData(100, 100, -128, 11, 11, 256)] + // The omitted-z sentinel itself (z1=-128, z2=127 -> depth 255). + [InlineData(100, 100, -128, 11, 11, 255)] + // Ordinary bounds with a meaningful z. + [InlineData(100, 100, 0, 11, 11, 5)] + [InlineData(100, 100, 5, 11, 11, 122)] // z2 == 127 but z1 != -128 + [InlineData(100, 100, -128, 11, 11, 200)] // z1 == -128 but z2 != 127 + public void RoundTrips(int x, int y, int z, int w, int h, int d) + { + var rect = new Rectangle3D(x, y, z, w, h, d); + Assert.Equal(rect, RoundTrip(rect)); + } + + [Fact] + public void FullRangeSentinel_OmitsZ() + { + // z1=-128, z2=127 is the only case z is omitted. + var json = JsonSerializer.Serialize(new Rectangle3D(0, 0, -128, 10, 10, 255), JsonConfig.DefaultOptions); + Assert.DoesNotContain("z1", json); + Assert.DoesNotContain("z2", json); + } + + [Fact] + public void HomeRangeBounds_WritesZ() + { + var json = JsonSerializer.Serialize(new Rectangle3D(0, 0, -128, 10, 10, 256), JsonConfig.DefaultOptions); + Assert.Contains("\"z1\":", json); + Assert.Contains("\"z2\":", json); + } +} diff --git a/Projects/Server/Json/Converters/Rectangle3DConverter.cs b/Projects/Server/Json/Converters/Rectangle3DConverter.cs index 74d469f3b..890c5d6f7 100644 --- a/Projects/Server/Json/Converters/Rectangle3DConverter.cs +++ b/Projects/Server/Json/Converters/Rectangle3DConverter.cs @@ -175,7 +175,7 @@ public class Rectangle3DConverter : JsonConverter public override void Write(Utf8JsonWriter writer, Rectangle3D value, JsonSerializerOptions options) { - var writeZ = value.Start.Z is > sbyte.MinValue and < sbyte.MaxValue || value.End.Z is > sbyte.MinValue and < sbyte.MaxValue; + var writeZ = value.Start.Z != sbyte.MinValue || value.End.Z != sbyte.MaxValue; writer.WriteStartObject(); writer.WritePropertyName("x1");