using System.Collections.Generic; 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 { /// /// Verifies rebuild behavior by comparing address-space models before and after metadata changes. /// public class LmxNodeManagerRebuildTests { /// /// Confirms that rebuilding with new metadata replaces the old tag-reference set. /// [Fact] public void Rebuild_NewBuild_ReplacesOldData() { var hierarchy1 = new List { new GalaxyObjectInfo { GobjectId = 1, TagName = "OldObj", BrowseName = "OldObj", ParentGobjectId = 0, IsArea = false } }; var attrs1 = new List { new GalaxyAttributeInfo { GobjectId = 1, TagName = "OldObj", AttributeName = "OldAttr", FullTagReference = "OldObj.OldAttr", MxDataType = 5, IsArray = false } }; var model1 = AddressSpaceBuilder.Build(hierarchy1, attrs1); model1.NodeIdToTagReference.ContainsKey("OldObj.OldAttr").ShouldBe(true); // Rebuild with new data var hierarchy2 = new List { new GalaxyObjectInfo { GobjectId = 2, TagName = "NewObj", BrowseName = "NewObj", ParentGobjectId = 0, IsArea = false } }; var attrs2 = new List { new GalaxyAttributeInfo { GobjectId = 2, TagName = "NewObj", AttributeName = "NewAttr", FullTagReference = "NewObj.NewAttr", MxDataType = 2, IsArray = false } }; var model2 = AddressSpaceBuilder.Build(hierarchy2, attrs2); // Old nodes not in new model, new nodes present model2.NodeIdToTagReference.ContainsKey("OldObj.OldAttr").ShouldBe(false); model2.NodeIdToTagReference.ContainsKey("NewObj.NewAttr").ShouldBe(true); } /// /// Confirms that object counts are recalculated from the latest rebuild input. /// [Fact] public void Rebuild_UpdatesNodeCounts() { var hierarchy1 = new List { new GalaxyObjectInfo { GobjectId = 1, TagName = "Obj1", BrowseName = "Obj1", ParentGobjectId = 0, IsArea = false }, new GalaxyObjectInfo { GobjectId = 2, TagName = "Obj2", BrowseName = "Obj2", ParentGobjectId = 0, IsArea = false } }; var model1 = AddressSpaceBuilder.Build(hierarchy1, new List()); model1.ObjectCount.ShouldBe(2); var hierarchy2 = new List { new GalaxyObjectInfo { GobjectId = 3, TagName = "Obj3", BrowseName = "Obj3", ParentGobjectId = 0, IsArea = false } }; var model2 = AddressSpaceBuilder.Build(hierarchy2, new List()); model2.ObjectCount.ShouldBe(1); } /// /// Confirms that empty metadata produces an empty address-space model. /// [Fact] public void EmptyHierarchy_ProducesEmptyModel() { var model = AddressSpaceBuilder.Build(new List(), new List()); model.RootNodes.ShouldBeEmpty(); model.NodeIdToTagReference.ShouldBeEmpty(); model.ObjectCount.ShouldBe(0); model.VariableCount.ShouldBe(0); } } }