using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Host.GalaxyRepository; using ZB.MOM.WW.LmxOpcUa.Host.OpcUa; using ZB.MOM.WW.LmxOpcUa.Tests.Helpers; namespace ZB.MOM.WW.LmxOpcUa.Tests.Wiring { /// /// Verifies: Galaxy change detection → OnGalaxyChanged → address space rebuild /// public class ChangeDetectionToRebuildWiringTest { /// /// Confirms that a changed deploy timestamp causes the change-detection pipeline to raise another rebuild signal. /// [Fact] public async Task ChangedTimestamp_TriggersRebuild() { var repo = new FakeGalaxyRepository { LastDeployTime = new DateTime(2024, 1, 1), Hierarchy = new List { new GalaxyObjectInfo { GobjectId = 1, TagName = "Obj1", BrowseName = "Obj1", ParentGobjectId = 0, IsArea = false } }, Attributes = new List { new GalaxyAttributeInfo { GobjectId = 1, TagName = "Obj1", AttributeName = "Attr1", FullTagReference = "Obj1.Attr1", MxDataType = 5, IsArray = false } } }; var rebuildCount = 0; var service = new ChangeDetectionService(repo, intervalSeconds: 1); service.OnGalaxyChanged += () => Interlocked.Increment(ref rebuildCount); service.Start(); await Task.Delay(500); // First poll triggers rebuildCount.ShouldBeGreaterThanOrEqualTo(1); // Change deploy time → should trigger rebuild repo.LastDeployTime = new DateTime(2024, 2, 1); await Task.Delay(1500); service.Stop(); rebuildCount.ShouldBeGreaterThanOrEqualTo(2); service.Dispose(); } } }