Files
sunrise/tests/adaptive-resolution.test.ts

55 lines
2.1 KiB
TypeScript

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { createAdaptiveResolution, renderPixelRatio } from '../src/scene/adaptiveResolution.ts';
function feed(controller: ReturnType<typeof createAdaptiveResolution>, from: number, duration: number, interval: number) {
let now = from;
for (; now < from + duration; now += interval) controller.observe(now, true);
return now;
}
test('sustained slow rendering lowers resolution once and does not change simulation', () => {
const quality = createAdaptiveResolution(1.5);
const now = feed(quality, 0, 16000, 40);
assert.equal(quality.cap(), 1.25);
feed(quality, now, 8000, 40);
assert.equal(quality.cap(), 1.25);
});
test('upgrade needs longer healthy evidence; maximum stays device-profile bound', () => {
const quality = createAdaptiveResolution(1.5);
let now = feed(quality, 0, 16000, 40);
now = feed(quality, now, 18000, 16);
assert.equal(quality.cap(), 1.25);
now = feed(quality, now, 18000, 16);
assert.equal(quality.cap(), 1.5);
feed(quality, now, 60000, 16);
assert.equal(quality.cap(), 1.5);
});
test('idle and background transitions cannot supply slow-frame evidence', () => {
const quality = createAdaptiveResolution(1.5);
feed(quality, 0, 14000, 40);
quality.observe(14000, false);
quality.reset(120000);
feed(quality, 120000, 14000, 40);
assert.equal(quality.cap(), 1.5);
});
test('new benchmark restarts at maximum quality, while a transition preserves selected quality', () => {
const quality = createAdaptiveResolution(1.5);
const now = feed(quality, 0, 16000, 40);
quality.reset(now);
assert.equal(quality.cap(), 1.25);
quality.restart(now);
assert.equal(quality.cap(), 1.5);
});
test('render dimensions respect native DPR, quality cap and mobile pixel budget', () => {
assert.equal(renderPixelRatio(1, 1.5, 412, 915, true), 1);
assert.equal(renderPixelRatio(3, 1.5, 412, 915, true), 1.5);
const ratio = renderPixelRatio(3, 1.5, 2000, 1000, true);
assert.ok(2000 * 1000 * ratio * ratio <= 1500000 + 0.01);
assert.equal(renderPixelRatio(3, 2, 2000, 1000, false), 2);
});