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 { /// Verifies that Parse returns null for null input. [Fact] public void Parse_NullInput_ReturnsNull() { NodeIdParser.Parse(null).ShouldBeNull(); } /// Verifies that Parse returns null for empty string input. [Fact] public void Parse_EmptyString_ReturnsNull() { NodeIdParser.Parse("").ShouldBeNull(); } /// Verifies that Parse returns null for whitespace-only input. [Fact] public void Parse_WhitespaceOnly_ReturnsNull() { NodeIdParser.Parse(" ").ShouldBeNull(); } /// Verifies that Parse correctly parses standard NodeId format (ns=2;s=MyNode). [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"); } /// Verifies that Parse correctly parses numeric NodeId format (i=85). [Fact] public void Parse_NumericFormat_ReturnsNodeId() { var result = NodeIdParser.Parse("i=85"); result.ShouldNotBeNull(); result.IdType.ShouldBe(IdType.Numeric); } /// Verifies that Parse treats bare numeric input as namespace 0 numeric NodeId. [Fact] public void Parse_BareNumeric_ReturnsNamespace0NumericNodeId() { var result = NodeIdParser.Parse("85"); result.ShouldNotBeNull(); result.NamespaceIndex.ShouldBe((ushort)0); result.Identifier.ShouldBe((uint)85); } /// Verifies that Parse trims whitespace padding from input. [Fact] public void Parse_WithWhitespacePadding_Trims() { var result = NodeIdParser.Parse(" ns=2;s=MyNode "); result.ShouldNotBeNull(); result.Identifier.ShouldBe("MyNode"); } /// Verifies that Parse throws FormatException for invalid input. [Fact] public void Parse_InvalidFormat_ThrowsFormatException() { Should.Throw(() => NodeIdParser.Parse("not-a-node-id")); } /// Verifies that ParseRequired throws ArgumentException for null input. [Fact] public void ParseRequired_NullInput_ThrowsArgumentException() { Should.Throw(() => NodeIdParser.ParseRequired(null)); } /// Verifies that ParseRequired throws ArgumentException for empty input. [Fact] public void ParseRequired_EmptyInput_ThrowsArgumentException() { Should.Throw(() => NodeIdParser.ParseRequired("")); } /// Verifies that ParseRequired returns a NodeId for valid input. [Fact] public void ParseRequired_ValidInput_ReturnsNodeId() { var result = NodeIdParser.ParseRequired("ns=2;s=TestNode"); result.ShouldNotBeNull(); result.Identifier.ShouldBe("TestNode"); } }