using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using Stardust.Server.Services;
using Xunit;
namespace ServerTest.Services;
/// <summary>å‘Šè¦æœåŠ¡å•元测试</summary>
public class AlarmServiceTests
{
private sealed record Sample(Double Rate);
[Fact]
[DisplayName("环比统计å–ä¸Šä¸€ä¸ªå®Œæ•´å°æ—¶ï¼Œé¿å…整点未写满误报")]
public void GetStatHour_UsesPreviousCompleteHour()
{
var method = typeof(AlarmService).GetMethod("GetStatHour", BindingFlags.NonPublic | BindingFlags.Static);
Assert.NotNull(method);
var hour = (DateTime)method.Invoke(null, [new DateTime(2026, 10, 29, 1, 5, 0)]);
Assert.Equal(new DateTime(2026, 10, 29, 0, 0, 0), hour);
// 跨天时回到å‰ä¸€å¤© 23:00
hour = (DateTime)method.Invoke(null, [new DateTime(2026, 10, 29, 0, 30, 0)]);
Assert.Equal(new DateTime(2026, 10, 28, 23, 0, 0), hour);
}
[Fact]
[DisplayName("环比阈值判æ–:高调用与调用é‡ä¸‹æ»‘分别命ä¸")]
public void IsRingRateAlarm_ChecksBothBounds()
{
var method = typeof(AlarmService).GetMethod("IsRingRateAlarm", BindingFlags.NonPublic | BindingFlags.Static);
Assert.NotNull(method);
Assert.Equal(true, method.Invoke(null, [3.0, 3.0, 0.1]));
Assert.Equal(false, method.Invoke(null, [2.9, 3.0, 0.1]));
Assert.Equal(true, method.Invoke(null, [0.09, 3.0, 0.1]));
Assert.Equal(true, method.Invoke(null, [0.1, 3.0, 0.1]));
Assert.Equal(false, method.Invoke(null, [0.11, 3.0, 0.1]));
// 未é…置阈值时ä¸å‘Šè¦
Assert.Equal(false, method.Invoke(null, [1.0, 0.0, 0.0]));
}
[Fact]
[DisplayName("连ç»ç¡®è®¤ï¼šæ¬¡æ•°ä¸è¶³æˆ–ä¸é—´å‡ºçŽ°æœªè¶…é™é‡‡æ ·éƒ½ä¸å‘Šè¦")]
public void IsSustained_RequiresConsecutiveSamples()
{
var samples = new List<Sample>
{
new(0.95),
new(0.92),
new(0.91),
};
Assert.True(AlarmService.IsSustained(samples, 3, e => e.Rate >= 0.9));
// 次数ä¸è¶³
Assert.False(AlarmService.IsSustained(samples, 4, e => e.Rate >= 0.9));
Assert.False(AlarmService.IsSustained(new List<Sample>(), 1, e => e.Rate >= 0.9));
// ä¸é—´å‡ºçŽ°ä¸€æ¬¡å›žè½ï¼Œè§†ä¸ºæŠ–动
samples[2] = new Sample(0.5);
Assert.False(AlarmService.IsSustained(samples, 3, e => e.Rate >= 0.9));
// åªç¡®è®¤æœ€è¿‘一次时ä»ç„¶æˆç«‹
Assert.True(AlarmService.IsSustained(samples, 1, e => e.Rate >= 0.9));
}
[Fact]
[DisplayName("é‡å¤é€šçŸ¥å‘¨æœŸé»˜è®¤30分钟,æŒä¹…æ•…éšœä¸ä¼šæ¯5分钟推é€")]
public void RenotifyPeriod_DefaultsToThirtyMinutes() => Assert.Equal(1800, AlarmService.DefaultRenotifyPeriod);
}
|