GameOverlay.Capture/tests/GameOverlay.Capture.Tests/FrameTimeTrackerTests.cs
2026-07-29 20:03:02 -05:00

67 lines
1.9 KiB
C#

using GameOverlay.Capture;
using Xunit;
namespace GameOverlay.Capture.Tests;
public class FrameTimeTrackerTests
{
[Fact]
public void FirstPresent_EstablishesBaseline_NoSample()
{
var tracker = new FrameTimeTracker();
Assert.Null(tracker.AddPresent(1000.0));
Assert.Equal(0, tracker.Count);
}
[Fact]
public void SubsequentPresents_ProduceFrameTimeSamples()
{
var tracker = new FrameTimeTracker();
tracker.AddPresent(0.0);
var s1 = tracker.AddPresent(16.0);
var s2 = tracker.AddPresent(32.0);
Assert.NotNull(s1);
Assert.Equal(16.0, s1!.Value.FrameTimeMs, 6);
Assert.Equal(1000.0 / 16.0, s1.Value.Fps, 6);
Assert.NotNull(s2);
Assert.Equal(2, tracker.Count);
}
[Fact]
public void OutOfOrderOrDuplicateTimestamps_AreIgnored()
{
var tracker = new FrameTimeTracker();
tracker.AddPresent(100.0);
Assert.Null(tracker.AddPresent(100.0)); // duplicate
Assert.Null(tracker.AddPresent(90.0)); // out of order
Assert.Equal(0, tracker.Count);
}
[Fact]
public void Summary_ReflectsSteadyRate()
{
var tracker = new FrameTimeTracker();
double t = 0;
for (int i = 0; i < 101; i++) // 101 presents => 100 frame times of 10ms
{
tracker.AddPresent(t);
t += 10.0;
}
var summary = tracker.ComputeSummary();
Assert.Equal(100, summary.FrameCount);
Assert.Equal(100.0, summary.AverageFps, 6);
}
[Fact]
public void Reset_ClearsCountAndBaseline()
{
var tracker = new FrameTimeTracker();
tracker.AddPresent(0);
tracker.AddPresent(10);
tracker.Reset();
Assert.Equal(0, tracker.Count);
Assert.Null(tracker.AddPresent(5)); // first after reset is a baseline again
}
}