S7AddressParserTests.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using Xunit;
  2. using YZWater.Core.Services;
  3. namespace YZWater.Core.Tests.Services;
  4. /// <summary>
  5. /// S7AddressParser 单元测试
  6. /// </summary>
  7. public class S7AddressParserTests
  8. {
  9. [Theory]
  10. [InlineData("VD100", S7AddressParser.AreaType.Variable, 100, 4)]
  11. [InlineData("VD500", S7AddressParser.AreaType.Variable, 500, 4)]
  12. [InlineData("VW100", S7AddressParser.AreaType.Variable, 100, 2)]
  13. [InlineData("VB100", S7AddressParser.AreaType.Variable, 100, 1)]
  14. [InlineData("MD10", S7AddressParser.AreaType.Marker, 10, 4)]
  15. [InlineData("MW10", S7AddressParser.AreaType.Marker, 10, 2)]
  16. [InlineData("MB10", S7AddressParser.AreaType.Marker, 10, 1)]
  17. [InlineData("Q0.0", S7AddressParser.AreaType.Output, 0, 1)]
  18. [InlineData("I0.1", S7AddressParser.AreaType.Input, 0, 1)]
  19. public void Parse_ValidAddress_ShouldReturnCorrectResult(string address, S7AddressParser.AreaType expectedArea, int expectedOffset, int expectedLength)
  20. {
  21. var result = S7AddressParser.Parse(address);
  22. Assert.NotNull(result);
  23. Assert.Equal(expectedArea, result.Area);
  24. Assert.Equal(expectedOffset, result.ByteOffset);
  25. Assert.Equal(expectedLength, result.ByteLength);
  26. }
  27. [Theory]
  28. [InlineData("")]
  29. [InlineData(null)]
  30. [InlineData("INVALID")]
  31. [InlineData("X100")]
  32. public void Parse_InvalidAddress_ShouldReturnNull(string? address)
  33. {
  34. var result = S7AddressParser.Parse(address!);
  35. Assert.Null(result);
  36. }
  37. [Fact]
  38. public void GroupConsecutiveAddresses_ConsecutiveVD_ShouldGroupTogether()
  39. {
  40. var addresses = new List<(string Key, string Address)>
  41. {
  42. ("Pump1.Current", "VD50"),
  43. ("Pump2.Current", "VD54"),
  44. ("Pump3.Current", "VD58"),
  45. };
  46. var groups = S7AddressParser.GroupConsecutiveAddresses(addresses);
  47. Assert.Single(groups);
  48. Assert.Equal(3, groups[0].Items.Count);
  49. Assert.Equal(50, groups[0].StartByte);
  50. Assert.Equal(12, groups[0].TotalBytes); // 50, 54, 58 = 3 * 4 bytes
  51. }
  52. [Fact]
  53. public void GroupConsecutiveAddresses_NonConsecutive_ShouldSeparateGroups()
  54. {
  55. var addresses = new List<(string Key, string Address)>
  56. {
  57. ("Tank.Level", "VD100"),
  58. ("Pressure.Value", "VD6600"),
  59. };
  60. var groups = S7AddressParser.GroupConsecutiveAddresses(addresses);
  61. Assert.Equal(2, groups.Count);
  62. }
  63. [Fact]
  64. public void GroupConsecutiveAddresses_DifferentAreas_ShouldSeparateGroups()
  65. {
  66. var addresses = new List<(string Key, string Address)>
  67. {
  68. ("Pump.Run", "Q0.1"),
  69. ("Pump.Fault", "I0.1"),
  70. };
  71. var groups = S7AddressParser.GroupConsecutiveAddresses(addresses);
  72. Assert.Equal(2, groups.Count);
  73. }
  74. [Theory]
  75. [InlineData(S7AddressParser.AreaType.Variable, 4, "VD")]
  76. [InlineData(S7AddressParser.AreaType.Variable, 2, "VW")]
  77. [InlineData(S7AddressParser.AreaType.Variable, 1, "V")]
  78. [InlineData(S7AddressParser.AreaType.Marker, 4, "MD")]
  79. [InlineData(S7AddressParser.AreaType.Input, 1, "I")]
  80. [InlineData(S7AddressParser.AreaType.Output, 1, "Q")]
  81. public void GetAddressPrefix_ShouldReturnCorrectPrefix(S7AddressParser.AreaType area, int byteLength, string expected)
  82. {
  83. var result = S7AddressParser.GetAddressPrefix(area, byteLength);
  84. Assert.Equal(expected, result);
  85. }
  86. }