using System.Linq; using StellaOps.Bench.Notify.Baseline; using StellaOps.Bench.Notify.Reporting; using Xunit; namespace StellaOps.Bench.Notify.Tests; public sealed class BenchmarkScenarioReportTests { [Fact] public void RegressionDetection_FlagsLatencies() { var result = new ScenarioResult( Id: "scenario", Label: "Scenario", Iterations: 3, TotalEvents: 1000, TotalRules: 100, ActionsPerRule: 2, AverageMatchesPerEvent: 10, MinMatchesPerEvent: 8, MaxMatchesPerEvent: 12, AverageDeliveriesPerEvent: 20, TotalDeliveries: 20000, MeanMs: 200, P95Ms: 250, MaxMs: 300, MeanThroughputPerSecond: 50000, MinThroughputPerSecond: 40000, MaxAllocatedMb: 100, ThresholdMs: null, MinThroughputThresholdPerSecond: null, MaxAllocatedThresholdMb: null); var baseline = new BaselineEntry( ScenarioId: "scenario", Iterations: 3, EventCount: 1000, DeliveryCount: 20000, MeanMs: 150, P95Ms: 180, MaxMs: 200, MeanThroughputPerSecond: 60000, MinThroughputPerSecond: 50000, MaxAllocatedMb: 90); var report = new BenchmarkScenarioReport(result, baseline, regressionLimit: 1.1); Assert.True(report.DurationRegressionBreached); Assert.True(report.ThroughputRegressionBreached); Assert.Contains(report.BuildRegressionFailureMessages(), message => message.Contains("max duration")); } [Fact] public void RegressionDetection_NoBaseline_NoBreaches() { var result = new ScenarioResult( Id: "scenario", Label: "Scenario", Iterations: 3, TotalEvents: 1000, TotalRules: 100, ActionsPerRule: 2, AverageMatchesPerEvent: 10, MinMatchesPerEvent: 8, MaxMatchesPerEvent: 12, AverageDeliveriesPerEvent: 20, TotalDeliveries: 20000, MeanMs: 200, P95Ms: 250, MaxMs: 300, MeanThroughputPerSecond: 50000, MinThroughputPerSecond: 40000, MaxAllocatedMb: 100, ThresholdMs: null, MinThroughputThresholdPerSecond: null, MaxAllocatedThresholdMb: null); var report = new BenchmarkScenarioReport(result, baseline: null, regressionLimit: null); Assert.False(report.DurationRegressionBreached); Assert.False(report.ThroughputRegressionBreached); Assert.Empty(report.BuildRegressionFailureMessages()); } }