using System.Text.Json; using Xunit; namespace StellaOps.HybridLogicalClock.Tests; public partial class HlcTimestampJsonConverterTests { [Fact] public void ObjectConverter_Deserialize_ReadsObject() { var options = CreateObjectOptions(); var json = """{"physicalTime":1704067200000,"nodeId":"test-node","logicalCounter":42}"""; var result = JsonSerializer.Deserialize(json, options); Assert.Equal(BasePhysicalTime, result.PhysicalTime); Assert.Equal("test-node", result.NodeId); Assert.Equal(42, result.LogicalCounter); } [Fact] public void ObjectConverter_Deserialize_PascalCaseProperties_Works() { var options = CreateObjectOptions(); var json = """{"PhysicalTime":1704067200000,"NodeId":"test-node","LogicalCounter":42}"""; var result = JsonSerializer.Deserialize(json, options); Assert.Equal(BasePhysicalTime, result.PhysicalTime); Assert.Equal("test-node", result.NodeId); Assert.Equal(42, result.LogicalCounter); } [Fact] public void ObjectConverter_Deserialize_MissingPhysicalTime_ThrowsJsonException() { var options = CreateObjectOptions(); var json = """{"nodeId":"test-node","logicalCounter":42}"""; var ex = Assert.Throws(() => JsonSerializer.Deserialize(json, options)); Assert.Contains("physicalTime", ex.Message); } [Fact] public void ObjectConverter_Deserialize_MissingNodeId_ThrowsJsonException() { var options = CreateObjectOptions(); var json = """{"physicalTime":1704067200000,"logicalCounter":42}"""; var ex = Assert.Throws(() => JsonSerializer.Deserialize(json, options)); Assert.Contains("nodeId", ex.Message); } [Fact] public void ObjectConverter_Deserialize_MissingLogicalCounter_ThrowsJsonException() { var options = CreateObjectOptions(); var json = """{"physicalTime":1704067200000,"nodeId":"test-node"}"""; var ex = Assert.Throws(() => JsonSerializer.Deserialize(json, options)); Assert.Contains("logicalCounter", ex.Message); } [Fact] public void ObjectConverter_Deserialize_ExtraProperties_Ignored() { var options = CreateObjectOptions(); var json = """{"physicalTime":1704067200000,"nodeId":"test-node","logicalCounter":42,"extra":"ignored"}"""; var result = JsonSerializer.Deserialize(json, options); Assert.Equal(BasePhysicalTime, result.PhysicalTime); Assert.Equal("test-node", result.NodeId); Assert.Equal(42, result.LogicalCounter); } [Fact] public void ObjectConverter_Deserialize_StringToken_ThrowsJsonException() { var options = CreateObjectOptions(); Assert.Throws(() => JsonSerializer.Deserialize("\"not-an-object\"", options)); } }