using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Driver.S7.Cli.Commands; namespace ZB.MOM.WW.OtOpcUa.Driver.S7.Cli.Tests; /// /// Covers across every S7 atomic type. /// [Trait("Category", "Unit")] public sealed class WriteCommandParseValueTests { [Theory] [InlineData("true", true)] [InlineData("0", false)] [InlineData("yes", true)] [InlineData("OFF", false)] public void ParseValue_Bool_accepts_common_aliases(string raw, bool expected) { WriteCommand.ParseValue(raw, S7DataType.Bool).ShouldBe(expected); } [Fact] public void ParseValue_Bool_rejects_garbage() { Should.Throw( () => WriteCommand.ParseValue("maybe", S7DataType.Bool)); } [Fact] public void ParseValue_Byte_ranges() { WriteCommand.ParseValue("0", S7DataType.Byte).ShouldBe((byte)0); WriteCommand.ParseValue("255", S7DataType.Byte).ShouldBe((byte)255); } [Fact] public void ParseValue_Int16_signed_range() { WriteCommand.ParseValue("-32768", S7DataType.Int16).ShouldBe((short)-32768); } [Fact] public void ParseValue_UInt16_unsigned_max() { WriteCommand.ParseValue("65535", S7DataType.UInt16).ShouldBe((ushort)65535); } [Fact] public void ParseValue_Int32_parses_negative() { WriteCommand.ParseValue("-2147483648", S7DataType.Int32).ShouldBe(int.MinValue); } [Fact] public void ParseValue_UInt32_parses_max() { WriteCommand.ParseValue("4294967295", S7DataType.UInt32).ShouldBe(uint.MaxValue); } [Fact] public void ParseValue_Int64_parses_min() { WriteCommand.ParseValue("-9223372036854775808", S7DataType.Int64).ShouldBe(long.MinValue); } [Fact] public void ParseValue_UInt64_parses_max() { WriteCommand.ParseValue("18446744073709551615", S7DataType.UInt64).ShouldBe(ulong.MaxValue); } [Fact] public void ParseValue_Float32_invariant_culture() { WriteCommand.ParseValue("3.14", S7DataType.Float32).ShouldBe(3.14f); } [Fact] public void ParseValue_Float64_higher_precision() { WriteCommand.ParseValue("2.718281828", S7DataType.Float64).ShouldBeOfType(); } [Fact] public void ParseValue_String_passthrough() { WriteCommand.ParseValue("hallo siemens", S7DataType.String).ShouldBe("hallo siemens"); } [Fact] public void ParseValue_DateTime_parses_roundtrip_form() { var result = WriteCommand.ParseValue("2026-04-21T12:34:56Z", S7DataType.DateTime); result.ShouldBeOfType(); ((DateTime)result).Year.ShouldBe(2026); } [Fact] public void ParseValue_non_numeric_for_numeric_types_throws() { Should.Throw( () => WriteCommand.ParseValue("xyz", S7DataType.Int16)); } [Theory] [InlineData("DB1.DBW0", S7DataType.Int16, "DB1.DBW0:Int16")] [InlineData("M0.0", S7DataType.Bool, "M0.0:Bool")] [InlineData("IW4", S7DataType.UInt16, "IW4:UInt16")] [InlineData("QD8", S7DataType.UInt32, "QD8:UInt32")] [InlineData("DB10.STRING[0]", S7DataType.String, "DB10.STRING[0]:String")] public void SynthesiseTagName_preserves_S7_address_verbatim( string address, S7DataType type, string expected) { ReadCommand.SynthesiseTagName(address, type).ShouldBe(expected); } }