acdream/tests/AcDream.Core.Net.Tests/Transport/RetailPacketLossAveragerTests.cs
Erik f7aa8e0eb7
All checks were successful
CI / linux-portable (push) Successful in 3m41s
CI / windows-gate (push) Successful in 6m49s
CI / release (push) Successful in 3m22s
fix: complete retail parity stability pass
2026-08-28 20:01:39 +02:00

77 lines
2.1 KiB
C#

using AcDream.Core.Net.Transport;
namespace AcDream.Core.Net.Tests.Transport;
public sealed class RetailPacketLossAveragerTests
{
[Fact]
public void Sweep_BeforeRetailHeartbeat_DoesNotPublishPartialSample()
{
long now = 0;
var clock = new TransportClock(() => now, frequency: 10);
var stats = new TransportStats { PacketsSent = 5, NakIdsSent = 1 };
var sut = new RetailPacketLossAverager(clock, stats);
stats.PacketsSent += 10;
stats.NakIdsSent += 2;
now = 19;
sut.Sweep(now, stats);
Assert.Equal(0d, sut.Percentage);
}
[Fact]
public void Sweep_UsesRetailNakPlusRetransmitOverReceivedPlusSentFormula()
{
long now = 0;
var clock = new TransportClock(() => now, frequency: 10);
var stats = new TransportStats();
var sut = new RetailPacketLossAverager(clock, stats);
stats.PacketsSent = 60;
stats.PacketsReceived = 40;
stats.NakIdsSent = 2;
stats.ResendsSent = 3;
now = 20;
sut.Sweep(now, stats);
Assert.Equal(5d, sut.Percentage);
}
[Fact]
public void Sweep_EvictsTheOldestSampleAfterFortyHeartbeats()
{
long now = 0;
var clock = new TransportClock(() => now, frequency: 10);
var stats = new TransportStats();
var sut = new RetailPacketLossAverager(clock, stats);
stats.PacketsSent = 10;
stats.NakIdsSent = 10;
now = 20;
sut.Sweep(now, stats);
for (int i = 0; i < RetailPacketLossAverager.WindowSize; i++)
{
stats.PacketsSent += 10;
now += 20;
sut.Sweep(now, stats);
}
Assert.Equal(0d, sut.Percentage);
}
[Fact]
public void Sweep_ZeroTrafficReportsZero()
{
long now = 0;
var clock = new TransportClock(() => now, frequency: 10);
var stats = new TransportStats();
var sut = new RetailPacketLossAverager(clock, stats);
now = 20;
sut.Sweep(now, stats);
Assert.Equal(0d, sut.Percentage);
}
}