sharpemu/tests/SharpEmu.Libs.Tests/VideoOut/WindowPollProfileTests.cs

90 lines
3.6 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using System.Diagnostics;
using SharpEmu.Libs.VideoOut;
using Xunit;
namespace SharpEmu.Libs.Tests.VideoOut;
public sealed class WindowPollProfileTests
{
[Fact]
public void PollSamplesRequireFrameTracingInsideARenderScope()
{
Assert.False(WindowPollProfile.Enabled);
using (RenderPhaseProfile.Measure(RenderPhaseProfile.Phase.WindowLoop))
Assert.Equal(RenderPhaseProfile.FrameTraceEnabled, WindowPollProfile.Enabled);
Assert.False(WindowPollProfile.Enabled);
}
[Fact]
public void CountersKeepTheLongestPollsAndAllTotals()
{
var counters = new WindowPollProfile.Counters();
long[] durations = [2, 18, 1, 40, 3, 25];
for (var index = 0; index < durations.Length; index++)
{
var startedAt = (index + 1) * Stopwatch.Frequency;
counters.Record(startedAt, startedAt + durations[index] * Stopwatch.Frequency / 1000,
index % 2 == 0, (uint)(0x200 + index));
}
Assert.Equal(6, counters.Calls);
Assert.Equal(3, counters.ReturnedEvents);
Assert.Equal(6, counters.AtLeastOneMillisecond);
Assert.Equal(3, counters.AtLeastSixteenMilliseconds);
Assert.Equal(89 * Stopwatch.Frequency / 1000, counters.TotalTicks);
Assert.Equal(WindowPollProfile.Counters.Capacity, counters.SampleCount);
Assert.Equal(new long[] { 40, 25, 18, 3 },
counters.Longest.Select(sample => sample.ElapsedTicks * 1000 / Stopwatch.Frequency));
Assert.False(counters.Longest[0].ReturnedEvent);
Assert.Equal(0u, counters.Longest[0].EventType);
Assert.Equal(4 * Stopwatch.Frequency, counters.Longest[0].StartedAt);
Assert.Equal(0x204u, counters.Longest[3].EventType);
}
[Fact]
public void ZeroDurationPollsRemainBoundedAndDoNotCountAsStalls()
{
var counters = new WindowPollProfile.Counters();
for (var index = 0; index < 1000; index++)
counters.Record(index, index, false, uint.MaxValue);
Assert.Equal(1000, counters.Calls);
Assert.Equal(0, counters.TotalTicks);
Assert.Equal(0, counters.AtLeastOneMillisecond);
Assert.Equal(0, counters.AtLeastSixteenMilliseconds);
Assert.Equal(WindowPollProfile.Counters.Capacity, counters.SampleCount);
Assert.All(counters.Longest, sample => Assert.Equal(0u, sample.EventType));
}
[Fact]
public void NegativeDurationDoesNotReduceTotalsOrCountAsAStall()
{
var counters = new WindowPollProfile.Counters();
counters.Record(100, 99, false, uint.MaxValue);
Assert.Equal(1, counters.Calls);
Assert.Equal(0, counters.TotalTicks);
Assert.Equal(0, counters.AtLeastOneMillisecond);
Assert.Equal(0, counters.AtLeastSixteenMilliseconds);
Assert.Equal(0, counters.Longest[0].ElapsedTicks);
Assert.Equal(0u, counters.Longest[0].EventType);
}
[Fact]
public void EqualDurationsKeepTheFirstSamplesWhenFull()
{
var counters = new WindowPollProfile.Counters();
for (var index = 0; index < 10; index++)
counters.Record(index, index + Stopwatch.Frequency, true, (uint)index);
Assert.Equal(10, counters.Calls);
Assert.Equal(10, counters.ReturnedEvents);
Assert.Equal(10 * Stopwatch.Frequency, counters.TotalTicks);
Assert.Equal(WindowPollProfile.Counters.Capacity, counters.SampleCount);
Assert.Equal(new uint[] { 0, 1, 2, 3 },
counters.Longest.Select(sample => sample.EventType));
}
}