using ZB.MOM.WW.OtOpcUa.Core.Abstractions; using ZB.MOM.WW.OtOpcUa.Runtime.Drivers; using Shouldly; using Xunit; namespace ZB.MOM.WW.OtOpcUa.Runtime.Tests.Drivers; [Trait("Category", "Unit")] public sealed class CapturingAddressSpaceBuilderTests { [Fact] public void Records_nested_path_segments_full_reference_and_metadata() { var b = new CapturingAddressSpaceBuilder(); var focas = b.Folder("FOCAS", "FOCAS"); var device = focas.Folder("10.0.0.5:8193", "cnc"); var identity = device.Folder("Identity", "Identity"); identity.Variable("SeriesNumber", "SeriesNumber", new DriverAttributeInfo( FullName: "10.0.0.5:8193/Identity/SeriesNumber", DriverDataType: DriverDataType.String, IsArray: false, ArrayDim: null, SecurityClass: SecurityClassification.ViewOnly, IsHistorized: false)); b.Nodes.Count.ShouldBe(1); var n = b.Nodes[0]; n.FolderPathSegments.ShouldBe(new[] { "FOCAS", "10.0.0.5:8193", "Identity" }); n.BrowseName.ShouldBe("SeriesNumber"); n.FullReference.ShouldBe("10.0.0.5:8193/Identity/SeriesNumber"); n.DataType.ShouldBe(DriverDataType.String); n.Writable.ShouldBeFalse(); // ViewOnly -> read-only } [Fact] public void AddProperty_is_ignored_and_alarm_marking_is_a_noop_sink() { var b = new CapturingAddressSpaceBuilder(); var f = b.Folder("FOCAS", "FOCAS"); f.AddProperty("Manufacturer", DriverDataType.String, "FANUC"); // ignored, no throw var h = f.Variable("V", "V", new DriverAttributeInfo("ref", DriverDataType.Int32, false, null, SecurityClassification.ViewOnly, false, IsAlarm: true)); var sink = h.MarkAsAlarmCondition(new AlarmConditionInfo("src", AlarmSeverity.Low, null)); sink.ShouldNotBeNull(); // no-op sink, alarms out of scope b.Nodes.Count.ShouldBe(1); } }