using Xunit; using YZWater.Core.Services; namespace YZWater.Core.Tests.Services; /// /// S7AddressParser 单元测试 /// public class S7AddressParserTests { [Theory] [InlineData("VD100", S7AddressParser.AreaType.Variable, 100, 4)] [InlineData("VD500", S7AddressParser.AreaType.Variable, 500, 4)] [InlineData("VW100", S7AddressParser.AreaType.Variable, 100, 2)] [InlineData("VB100", S7AddressParser.AreaType.Variable, 100, 1)] [InlineData("MD10", S7AddressParser.AreaType.Marker, 10, 4)] [InlineData("MW10", S7AddressParser.AreaType.Marker, 10, 2)] [InlineData("MB10", S7AddressParser.AreaType.Marker, 10, 1)] [InlineData("Q0.0", S7AddressParser.AreaType.Output, 0, 1)] [InlineData("I0.1", S7AddressParser.AreaType.Input, 0, 1)] public void Parse_ValidAddress_ShouldReturnCorrectResult(string address, S7AddressParser.AreaType expectedArea, int expectedOffset, int expectedLength) { var result = S7AddressParser.Parse(address); Assert.NotNull(result); Assert.Equal(expectedArea, result.Area); Assert.Equal(expectedOffset, result.ByteOffset); Assert.Equal(expectedLength, result.ByteLength); } [Theory] [InlineData("")] [InlineData(null)] [InlineData("INVALID")] [InlineData("X100")] public void Parse_InvalidAddress_ShouldReturnNull(string? address) { var result = S7AddressParser.Parse(address!); Assert.Null(result); } [Fact] public void GroupConsecutiveAddresses_ConsecutiveVD_ShouldGroupTogether() { var addresses = new List<(string Key, string Address)> { ("Pump1.Current", "VD50"), ("Pump2.Current", "VD54"), ("Pump3.Current", "VD58"), }; var groups = S7AddressParser.GroupConsecutiveAddresses(addresses); Assert.Single(groups); Assert.Equal(3, groups[0].Items.Count); Assert.Equal(50, groups[0].StartByte); Assert.Equal(12, groups[0].TotalBytes); // 50, 54, 58 = 3 * 4 bytes } [Fact] public void GroupConsecutiveAddresses_NonConsecutive_ShouldSeparateGroups() { var addresses = new List<(string Key, string Address)> { ("Tank.Level", "VD100"), ("Pressure.Value", "VD6600"), }; var groups = S7AddressParser.GroupConsecutiveAddresses(addresses); Assert.Equal(2, groups.Count); } [Fact] public void GroupConsecutiveAddresses_DifferentAreas_ShouldSeparateGroups() { var addresses = new List<(string Key, string Address)> { ("Pump.Run", "Q0.1"), ("Pump.Fault", "I0.1"), }; var groups = S7AddressParser.GroupConsecutiveAddresses(addresses); Assert.Equal(2, groups.Count); } [Theory] [InlineData(S7AddressParser.AreaType.Variable, 4, "VD")] [InlineData(S7AddressParser.AreaType.Variable, 2, "VW")] [InlineData(S7AddressParser.AreaType.Variable, 1, "V")] [InlineData(S7AddressParser.AreaType.Marker, 4, "MD")] [InlineData(S7AddressParser.AreaType.Input, 1, "I")] [InlineData(S7AddressParser.AreaType.Output, 1, "Q")] public void GetAddressPrefix_ShouldReturnCorrectPrefix(S7AddressParser.AreaType area, int byteLength, string expected) { var result = S7AddressParser.GetAddressPrefix(area, byteLength); Assert.Equal(expected, result); } }