SmartOpsImprovementEffectivenessTests.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Admin.NET.Plugin.AiDOP.SmartOps;
  2. using Xunit;
  3. namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps;
  4. public class SmartOpsImprovementEffectivenessTests
  5. {
  6. [Fact]
  7. public void Evaluate_InsufficientData_WhenFewerThanThreeSamples()
  8. {
  9. var result = SmartOpsImprovementEffectiveness.Evaluate(
  10. new[] { 1m, 2m },
  11. new[] { 3m, 4m, 5m },
  12. 10m,
  13. "higher_is_better");
  14. Assert.Equal(SmartOpsImprovementEffectiveness.InsufficientData, result.Conclusion);
  15. Assert.Equal(2, result.BeforeSamples);
  16. }
  17. [Fact]
  18. public void Evaluate_HigherIsBetter_EffectiveWhenMeanUpAndCloserToTarget()
  19. {
  20. var before = new[] { 70m, 72m, 71m };
  21. var after = new[] { 88m, 90m, 91m };
  22. var result = SmartOpsImprovementEffectiveness.Evaluate(before, after, 100m, "higher_is_better");
  23. Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion);
  24. Assert.Equal(3, result.BeforeSamples);
  25. Assert.Equal(3, result.AfterSamples);
  26. Assert.True(result.AfterMean > result.BeforeMean);
  27. }
  28. [Fact]
  29. public void Evaluate_LowerIsBetter_EffectiveWhenMeanDownAndCloserToTarget()
  30. {
  31. var before = new[] { 12m, 11m, 13m };
  32. var after = new[] { 8m, 7m, 7.5m };
  33. var result = SmartOpsImprovementEffectiveness.Evaluate(before, after, 6m, "lower_is_better");
  34. Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion);
  35. }
  36. [Fact]
  37. public void Evaluate_IneffectiveWhenMeanWorse()
  38. {
  39. var result = SmartOpsImprovementEffectiveness.Evaluate(
  40. new[] { 90m, 91m, 92m },
  41. new[] { 70m, 68m, 69m },
  42. 100m,
  43. "higher_is_better");
  44. Assert.Equal(SmartOpsImprovementEffectiveness.AutoIneffective, result.Conclusion);
  45. }
  46. [Fact]
  47. public void Evaluate_InconclusiveWhenUnchanged()
  48. {
  49. var values = new[] { 80m, 80m, 80m };
  50. var result = SmartOpsImprovementEffectiveness.Evaluate(values, values, 100m, "higher_is_better");
  51. Assert.Equal(SmartOpsImprovementEffectiveness.AutoInconclusive, result.Conclusion);
  52. Assert.Equal(0m, result.Delta);
  53. }
  54. [Fact]
  55. public void Evaluate_ReachedTargetCountsAsEffectiveEvenIfOvershoot()
  56. {
  57. var result = SmartOpsImprovementEffectiveness.Evaluate(
  58. new[] { 80m, 81m, 79m },
  59. new[] { 120m, 121m, 119m },
  60. 100m,
  61. "higher_is_better");
  62. Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, result.Conclusion);
  63. }
  64. [Fact]
  65. public void Evaluate_InconclusiveWithoutTarget_DoesNotUseSignOnly()
  66. {
  67. var result = SmartOpsImprovementEffectiveness.Evaluate(
  68. new[] { 1m, 2m, 3m },
  69. new[] { 8m, 9m, 10m },
  70. null,
  71. "higher_is_better");
  72. Assert.Equal(SmartOpsImprovementEffectiveness.AutoInconclusive, result.Conclusion);
  73. }
  74. [Fact]
  75. public void Evaluate_IsDeterministic()
  76. {
  77. var before = new[] { 10m, 11m, 12m, 9m };
  78. var after = new[] { 6m, 5m, 5m, 4m };
  79. var a = SmartOpsImprovementEffectiveness.Evaluate(before, after, 5m, "lower_is_better");
  80. var b = SmartOpsImprovementEffectiveness.Evaluate(before, after, 5m, "lower_is_better");
  81. Assert.Equal(a, b);
  82. Assert.Equal(SmartOpsImprovementEffectiveness.AutoEffective, a.Conclusion);
  83. Assert.Equal(3, a.ConsecutiveOnTargetDays);
  84. Assert.Equal(75m, a.AchievementRate);
  85. }
  86. [Fact]
  87. public void TakeLastValid_KeepsLatestSeven()
  88. {
  89. var values = Enumerable.Range(1, 10).Select(x => (decimal?)x).Append(null);
  90. var taken = SmartOpsImprovementEffectiveness.TakeLastValid(values);
  91. Assert.Equal(new[] { 4m, 5m, 6m, 7m, 8m, 9m, 10m }, taken);
  92. }
  93. }