AlarmManagementTests.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Xunit;
  2. using YZWater.Core.Models;
  3. using YZWater.Core.Services;
  4. namespace YZWater.Core.Tests.Services;
  5. /// <summary>
  6. /// ISA-18.2 报警管理 + 数据缺口 单元测试(搁置状态、配置默认值、缺口时长计算)
  7. /// </summary>
  8. public class AlarmManagementTests
  9. {
  10. [Fact]
  11. public void Shelve_ShouldMarkConditionAsShelved()
  12. {
  13. var service = AlarmService.Instance;
  14. service.Shelve("TestTank_High", 30, "Tester");
  15. Assert.True(service.IsShelved("TestTank_High"));
  16. Assert.Contains(service.GetShelvedAlarms(), s => s.ConditionId == "TestTank_High");
  17. service.Unshelve("TestTank_High", "Tester");
  18. Assert.False(service.IsShelved("TestTank_High"));
  19. }
  20. [Fact]
  21. public void Shelve_InvalidArgs_ShouldBeIgnored()
  22. {
  23. var service = AlarmService.Instance;
  24. service.Shelve("TestTank_Invalid", 0);
  25. Assert.False(service.IsShelved("TestTank_Invalid"));
  26. }
  27. [Fact]
  28. public void IsShelved_UnknownCondition_ShouldBeFalse()
  29. {
  30. Assert.False(AlarmService.Instance.IsShelved("NoSuchCondition"));
  31. }
  32. [Fact]
  33. public void AlarmManagementConfig_Defaults()
  34. {
  35. var config = new AlarmManagementConfig();
  36. Assert.True(config.EnableFloodSuppression);
  37. Assert.Equal(6, config.FloodRaiseThreshold);
  38. Assert.Equal(60, config.FloodWindowSeconds);
  39. Assert.True(config.EnableFirstOut);
  40. Assert.Equal(5, config.FirstOutWindowSeconds);
  41. Assert.Equal(30, config.DefaultShelveMinutes);
  42. }
  43. [Fact]
  44. public void SystemConfig_ShouldExposeAlarmSection()
  45. {
  46. var config = new SystemConfig();
  47. Assert.NotNull(config.Alarm);
  48. Assert.Equal(6, config.Alarm.FloodRaiseThreshold);
  49. }
  50. [Fact]
  51. public void DataGapRecord_OpenGap_DurationTextUsesNow()
  52. {
  53. var gap = new DataGapRecord { StartTime = DateTime.Now.AddMinutes(-5) };
  54. Assert.True(gap.IsOpen);
  55. Assert.Contains("m", gap.DurationText);
  56. }
  57. [Fact]
  58. public void DataGapRecord_ClosedGap_DurationTextUsesRange()
  59. {
  60. var start = new DateTime(2026, 9, 25, 10, 0, 0);
  61. var gap = new DataGapRecord { StartTime = start, EndTime = start.AddMinutes(30) };
  62. Assert.False(gap.IsOpen);
  63. Assert.Equal("30m 0s", gap.DurationText);
  64. }
  65. }