using Admin.NET.Plugin.AiDOP.SmartOps; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps; public class SmartOpsImprovementEffectivenessTests { [Fact] public void Evaluate_InsufficientData_WhenFewerThanThreeSamples() { var result = SmartOpsImprovementEffectiveness.Evaluate( new[] { 1m, 2m }, new[] { 3m, 4m, 5m }, 10m, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.InsufficientData, result.Conclusion); Assert.Equal(2, result.BeforeSamples); } [Fact] public void Evaluate_HigherIsBetter_EffectiveWhenMeanUpAndCloserToTarget() { var before = new[] { 70m, 72m, 71m }; var after = new[] { 88m, 90m, 91m }; var result = SmartOpsImprovementEffectiveness.Evaluate(before, after, 100m, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion); Assert.Equal(3, result.BeforeSamples); Assert.Equal(3, result.AfterSamples); Assert.True(result.AfterMean > result.BeforeMean); } [Fact] public void Evaluate_LowerIsBetter_EffectiveWhenMeanDownAndCloserToTarget() { var before = new[] { 12m, 11m, 13m }; var after = new[] { 8m, 7m, 7.5m }; var result = SmartOpsImprovementEffectiveness.Evaluate(before, after, 6m, "lower_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion); } [Fact] public void Evaluate_IneffectiveWhenMeanWorse() { var result = SmartOpsImprovementEffectiveness.Evaluate( new[] { 90m, 91m, 92m }, new[] { 70m, 68m, 69m }, 100m, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoIneffective, result.Conclusion); } [Fact] public void Evaluate_InconclusiveWhenUnchanged() { var values = new[] { 80m, 80m, 80m }; var result = SmartOpsImprovementEffectiveness.Evaluate(values, values, 100m, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoInconclusive, result.Conclusion); Assert.Equal(0m, result.Delta); } [Fact] public void Evaluate_ReachedTargetCountsAsEffectiveEvenIfOvershoot() { var result = SmartOpsImprovementEffectiveness.Evaluate( new[] { 80m, 81m, 79m }, new[] { 120m, 121m, 119m }, 100m, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion); } [Fact] public void Evaluate_InconclusiveWithoutTarget_DoesNotUseSignOnly() { var result = SmartOpsImprovementEffectiveness.Evaluate( new[] { 1m, 2m, 3m }, new[] { 8m, 9m, 10m }, null, "higher_is_better"); Assert.Equal(SmartOpsImprovementEffectiveness.AutoInconclusive, result.Conclusion); } [Fact] public void Evaluate_IsDeterministic() { var before = new[] { 10m, 11m, 12m, 9m }; var after = new[] { 6m, 5m, 5m, 4m }; var a = SmartOpsImprovementEffectiveness.Evaluate(before, after, 5m, "lower_is_better"); var b = SmartOpsImprovementEffectiveness.Evaluate(before, after, 5m, "lower_is_better"); Assert.Equal(a, b); Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, a.Conclusion); Assert.Equal(3, a.ConsecutiveOnTargetDays); Assert.Equal(75m, a.AchievementRate); } [Fact] public void TakeLastValid_KeepsLatestSeven() { var values = Enumerable.Range(1, 10).Select(x => (decimal?)x).Append(null); var taken = SmartOpsImprovementEffectiveness.TakeLastValid(values); Assert.Equal(new[] { 4m, 5m, 6m, 7m, 8m, 9m, 10m }, taken); } }