import { test } from 'node:test'; import assert from 'node:assert/strict'; import { createAdaptiveResolution, renderPixelRatio } from '../src/scene/adaptiveResolution.ts'; function feed(controller: ReturnType, 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); });