using System; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Host.OpcUa; namespace ZB.MOM.WW.LmxOpcUa.Tests.OpcUa { public class DataValueConverterTests { [Fact] public void FromVtq_Boolean() { var vtq = Vtq.Good(true); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(true); Opc.Ua.StatusCode.IsGood(dv.StatusCode).ShouldBe(true); } [Fact] public void FromVtq_Int32() { var vtq = Vtq.Good(42); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(42); } [Fact] public void FromVtq_Float() { var vtq = Vtq.Good(3.14f); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(3.14f); } [Fact] public void FromVtq_Double() { var vtq = Vtq.Good(3.14159); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(3.14159); } [Fact] public void FromVtq_String() { var vtq = Vtq.Good("hello"); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe("hello"); } [Fact] public void FromVtq_DateTime_IsUtc() { var utcTime = new DateTime(2024, 6, 15, 10, 30, 0, DateTimeKind.Utc); var vtq = new Vtq(utcTime, utcTime, Quality.Good); var dv = DataValueConverter.FromVtq(vtq); ((DateTime)dv.Value).Kind.ShouldBe(DateTimeKind.Utc); } [Fact] public void FromVtq_TimeSpan_ConvertedToSeconds() { var vtq = Vtq.Good(TimeSpan.FromMinutes(2.5)); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(150.0); } [Fact] public void FromVtq_StringArray() { var arr = new[] { "a", "b", "c" }; var vtq = Vtq.Good(arr); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(arr); } [Fact] public void FromVtq_IntArray() { var arr = new[] { 1, 2, 3 }; var vtq = Vtq.Good(arr); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBe(arr); } [Fact] public void FromVtq_BadQuality_MapsToStatusCode() { var vtq = Vtq.Bad(Quality.BadCommFailure); var dv = DataValueConverter.FromVtq(vtq); Opc.Ua.StatusCode.IsBad(dv.StatusCode).ShouldBe(true); } [Fact] public void FromVtq_UncertainQuality() { var vtq = Vtq.Uncertain(42); var dv = DataValueConverter.FromVtq(vtq); Opc.Ua.StatusCode.IsUncertain(dv.StatusCode).ShouldBe(true); } [Fact] public void FromVtq_NullValue() { var vtq = Vtq.Good(null); var dv = DataValueConverter.FromVtq(vtq); dv.Value.ShouldBeNull(); } [Fact] public void ToVtq_RoundTrip() { var original = new Vtq(42, DateTime.UtcNow, Quality.Good); var dv = DataValueConverter.FromVtq(original); var roundTrip = DataValueConverter.ToVtq(dv); roundTrip.Value.ShouldBe(42); roundTrip.Quality.ShouldBe(Quality.Good); } } }