diff --git a/tests/ScadaLink.Communication.Tests/Grpc/ProtoRoundtripTests.cs b/tests/ScadaLink.Communication.Tests/Grpc/ProtoRoundtripTests.cs index d49a421..6df09c2 100644 --- a/tests/ScadaLink.Communication.Tests/Grpc/ProtoRoundtripTests.cs +++ b/tests/ScadaLink.Communication.Tests/Grpc/ProtoRoundtripTests.cs @@ -126,4 +126,32 @@ public class ProtoRoundtripTests Assert.Equal(AlarmStateEnum.AlarmStateActive, deserialized.AlarmChanged.State); Assert.Equal(1, deserialized.AlarmChanged.Priority); } + + [Fact] + public void Timestamp_DateTimeOffset_FullRoundTrip() + { + var original = new DateTimeOffset(2026, 3, 21, 14, 30, 45, 123, TimeSpan.Zero); + var update = new AttributeValueUpdate + { + InstanceUniqueName = "Motor-1", + AttributePath = "Speed", + AttributeName = "Speed", + Value = "42.5", + Quality = Quality.Good, + Timestamp = Timestamp.FromDateTimeOffset(original) + }; + + var bytes = update.ToByteArray(); + var deserialized = AttributeValueUpdate.Parser.ParseFrom(bytes); + + var roundTripped = deserialized.Timestamp.ToDateTimeOffset(); + Assert.Equal(original.Year, roundTripped.Year); + Assert.Equal(original.Month, roundTripped.Month); + Assert.Equal(original.Day, roundTripped.Day); + Assert.Equal(original.Hour, roundTripped.Hour); + Assert.Equal(original.Minute, roundTripped.Minute); + Assert.Equal(original.Second, roundTripped.Second); + Assert.Equal(original.Millisecond, roundTripped.Millisecond); + Assert.Equal(TimeSpan.Zero, roundTripped.Offset); + } }