using System; using System.Collections.Generic; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class NetworkLatencyJitterGateTests { [Fact] public void Gate365_NetworkLatencyJitter_EvaluatesExcellentHealth_OnLowLatency() { var samples = new List { new(15.0, true), new(18.0, true), new(16.0, true), new(17.0, true), new(15.0, true) }; var report = NetworkLatencyJitterProber.AnalyzeSamples(samples); Assert.Equal(NetworkHealthRating.Excellent, report.Rating); Assert.InRange(report.AverageRttMs, 16.0, 16.5); Assert.True(report.JitterMs < 5.0); Assert.Equal(0.0, report.PacketLossPercent); Assert.Contains("초고속", report.Recommendation); } [Fact] public void Gate366_NetworkLatencyJitter_DetectsPacketLoss_AndDegradesRating() { var samples = new List { new(30.0, true), new(0.0, false), // Lost new(35.0, true), new(40.0, true), new(0.0, false) // Lost }; // 2 out of 5 lost = 40% loss var report = NetworkLatencyJitterProber.AnalyzeSamples(samples); Assert.True(report.Rating == NetworkHealthRating.Degraded || report.Rating == NetworkHealthRating.Poor); Assert.Equal(40.0, report.PacketLossPercent); Assert.Contains("패킷 손실", report.Recommendation); } [Fact] public void Gate367_NetworkLatencyJitter_EvaluatesPoor_OnHighJitterAndLatency() { var samples = new List { new(450.0, true), new(200.0, true), new(550.0, true), new(180.0, true) }; var report = NetworkLatencyJitterProber.AnalyzeSamples(samples); Assert.Equal(NetworkHealthRating.Poor, report.Rating); Assert.True(report.AverageRttMs > 300.0); Assert.True(report.JitterMs > 100.0); } [Fact] public void Gate368_NetworkLatencyJitter_HandlesEmptyOrTotalLossGracefully() { var empty = NetworkLatencyJitterProber.AnalyzeSamples(new List()); Assert.Equal(NetworkHealthRating.Poor, empty.Rating); Assert.Equal(100.0, empty.PacketLossPercent); var totalLoss = NetworkLatencyJitterProber.AnalyzeSamples(new List { new(0.0, false), new(0.0, false) }); Assert.Equal(NetworkHealthRating.Poor, totalLoss.Rating); Assert.Equal(100.0, totalLoss.PacketLossPercent); } }