using System.Threading.Tasks; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Host.OpcUa; using ZB.MOM.WW.LmxOpcUa.Tests.Helpers; namespace ZB.MOM.WW.LmxOpcUa.Tests.Wiring { /// /// Verifies: FakeMxProxy OnDataChange → MxAccessClient → OnTagValueChanged → node manager delivery /// public class MxAccessToNodeManagerWiringTest { /// /// Confirms that a simulated data change reaches the global tag-value-changed event. /// [Fact] public async Task DataChange_ReachesGlobalHandler() { var mxClient = new FakeMxAccessClient(); string? receivedAddress = null; Vtq? receivedVtq = null; mxClient.OnTagValueChanged += (addr, vtq) => { receivedAddress = addr; receivedVtq = vtq; }; mxClient.SimulateDataChange("TestTag.Attr", Vtq.Good(42)); receivedAddress.ShouldBe("TestTag.Attr"); receivedVtq.ShouldNotBeNull(); receivedVtq.Value.Value.ShouldBe(42); receivedVtq.Value.Quality.ShouldBe(Quality.Good); } /// /// Confirms that a simulated data change reaches the stored per-tag subscription callback. /// [Fact] public async Task DataChange_ReachesSubscriptionCallback() { var mxClient = new FakeMxAccessClient(); Vtq? received = null; await mxClient.SubscribeAsync("TestTag.Attr", (addr, vtq) => received = vtq); mxClient.SimulateDataChange("TestTag.Attr", Vtq.Good(99)); received.ShouldNotBeNull(); received.Value.Value.ShouldBe(99); } } }