using Opc.Ua; using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Client.CLI.Helpers; namespace ZB.MOM.WW.OtOpcUa.Client.CLI.Tests; public class NodeIdParserTests { [Fact] public void Parse_NullInput_ReturnsNull() { NodeIdParser.Parse(null).ShouldBeNull(); } [Fact] public void Parse_EmptyString_ReturnsNull() { NodeIdParser.Parse("").ShouldBeNull(); } [Fact] public void Parse_WhitespaceOnly_ReturnsNull() { NodeIdParser.Parse(" ").ShouldBeNull(); } [Fact] public void Parse_StandardStringFormat_ReturnsNodeId() { var result = NodeIdParser.Parse("ns=2;s=MyNode"); result.ShouldNotBeNull(); result.NamespaceIndex.ShouldBe((ushort)2); result.Identifier.ShouldBe("MyNode"); } [Fact] public void Parse_NumericFormat_ReturnsNodeId() { var result = NodeIdParser.Parse("i=85"); result.ShouldNotBeNull(); result.IdType.ShouldBe(IdType.Numeric); } [Fact] public void Parse_BareNumeric_ReturnsNamespace0NumericNodeId() { var result = NodeIdParser.Parse("85"); result.ShouldNotBeNull(); result.NamespaceIndex.ShouldBe((ushort)0); result.Identifier.ShouldBe((uint)85); } [Fact] public void Parse_WithWhitespacePadding_Trims() { var result = NodeIdParser.Parse(" ns=2;s=MyNode "); result.ShouldNotBeNull(); result.Identifier.ShouldBe("MyNode"); } [Fact] public void Parse_InvalidFormat_ThrowsFormatException() { Should.Throw(() => NodeIdParser.Parse("not-a-node-id")); } [Fact] public void ParseRequired_NullInput_ThrowsArgumentException() { Should.Throw(() => NodeIdParser.ParseRequired(null)); } [Fact] public void ParseRequired_EmptyInput_ThrowsArgumentException() { Should.Throw(() => NodeIdParser.ParseRequired("")); } [Fact] public void ParseRequired_ValidInput_ReturnsNodeId() { var result = NodeIdParser.ParseRequired("ns=2;s=TestNode"); result.ShouldNotBeNull(); result.Identifier.ShouldBe("TestNode"); } }