55 lines
2.1 KiB
TypeScript
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);
|
|
});
|