using AcDream.App.Diagnostics; using Xunit; namespace AcDream.App.Tests; public class FrameProfilerReportTests { [Fact] public void FormatReport_IsInvariantAndComplete() { var cpu = new FrameStatsBuffer(16); var gpu = new FrameStatsBuffer(16); var alloc = new FrameStatsBuffer(16); var stages = new[] { new FrameStatsBuffer(16), new FrameStatsBuffer(16), new FrameStatsBuffer(16) }; for (long i = 1; i <= 10; i++) { cpu.Push(i * 1000); // 1..10 ms in µs gpu.Push(i * 100); alloc.Push(i * 1024); // bytes stages[0].Push(i * 200); stages[1].Push(i * 50); stages[2].Push(i * 10); } string line = FrameProfiler.FormatReport( frameCount: 10, cpu: cpu, gpu: gpu, gpuActive: true, alloc: alloc, gc0: 3, gc1: 1, gc2: 0, stages: stages); Assert.StartsWith("[frame-prof]", line); Assert.Contains("n=10", line); Assert.Contains("cpu_ms p50=5.0 p95=10.0 p99=10.0 max=10.0", line); Assert.Contains("gpu_ms p50=0.5", line); Assert.Contains("alloc_kb p50=5.0 max=10.0", line); Assert.Contains("gc=3/1/0", line); Assert.Contains("upd p50=1.0", line); // stage 0: 200µs·5 = 1.0 ms } [Fact] public void FormatReport_GpuInactive_SaysWhy() { var empty = new FrameStatsBuffer(4); string line = FrameProfiler.FormatReport( frameCount: 0, cpu: empty, gpu: empty, gpuActive: false, alloc: empty, gc0: 0, gc1: 0, gc2: 0, stages: new[] { empty, empty, empty }); Assert.Contains("gpu=off(wbdiag)", line); } }