fleeting-garden/src/game-loop/frame-performance.test.ts
2026-05-16 15:05:35 +01:00

64 lines
1.8 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { FramePerformance } from './frame-performance';
function createScenario() {
const performance = new FramePerformance();
let time = 0;
performance.update(time);
const advance = (fps: number): void => {
time += 1000 / fps;
performance.update(time);
};
return { performance, advance };
}
describe('FramePerformance refresh target', () => {
it('uses 60 FPS as the fixed adaptive budget target', () => {
const { performance, advance } = createScenario();
[123, 126, 130, 121, 60, 30].forEach(advance);
expect(performance.refreshTargetFps).toBe(60);
});
it('keeps latest and smoothed FPS separate from the fixed target', () => {
const { performance, advance } = createScenario();
advance(120);
expect(performance.latestFps).toBe(120);
expect(performance.smoothedFps).toBeGreaterThan(60);
expect(performance.refreshTargetFps).toBe(60);
});
it('reports true FPS even when the simulation delta would clamp', () => {
const { performance, advance } = createScenario();
[5, 5, 5, 5, 5].forEach(advance);
expect(performance.latestFps).toBeCloseTo(5, 5);
});
it('snaps the display refresh estimate to a stable screen frequency', () => {
const { performance, advance } = createScenario();
[123, 126, 130, 121, 124, 127, 125, 122].forEach(advance);
expect(performance.refreshTargetFps).toBe(60);
expect(performance.displayRefreshFps).toBe(120);
});
it('ignores a single startup spike before settling the display refresh estimate', () => {
const { performance, advance } = createScenario();
advance(240);
expect(performance.displayRefreshFps).toBe(60);
Array.from({ length: 8 }).forEach(() => advance(120));
expect(performance.refreshTargetFps).toBe(60);
expect(performance.displayRefreshFps).toBe(120);
});
});