Files
gods-eye-view/src/renderGovernor.test.mjs
T

101 lines
3.8 KiB
JavaScript

import { test, beforeEach } from 'node:test';
import assert from 'node:assert/strict';
import {
installRenderGovernor,
holdContinuousRender,
releaseContinuousRender,
governorRequestRender,
getRenderGovernorDiagnostics,
_resetRenderGovernorForTest,
} from './renderGovernor.js';
function makeViewer() {
const calls = { requestRender: 0 };
const scene = {
requestRenderMode: false,
maximumRenderTimeChange: 0,
requestRender() { calls.requestRender += 1; },
};
return { viewer: { scene }, scene, calls };
}
beforeEach(() => _resetRenderGovernorForTest());
test('install with zero holds enters idle mode and pins maximumRenderTimeChange', () => {
const { viewer, scene } = makeViewer();
installRenderGovernor(viewer);
assert.equal(scene.requestRenderMode, true);
assert.equal(scene.maximumRenderTimeChange, Infinity);
assert.equal(getRenderGovernorDiagnostics().mode, 'idle');
});
test('a hold flips to continuous; releasing the last hold returns to idle with a settling frame', () => {
const { viewer, scene, calls } = makeViewer();
installRenderGovernor(viewer);
const settleBaseline = calls.requestRender;
holdContinuousRender('flights');
assert.equal(scene.requestRenderMode, false);
assert.equal(getRenderGovernorDiagnostics().mode, 'continuous');
releaseContinuousRender('flights');
assert.equal(scene.requestRenderMode, true);
// Entering idle renders one settling frame.
assert.equal(calls.requestRender, settleBaseline + 1);
});
test('holds are identity-keyed: double-hold cannot leak, double-release cannot corrupt', () => {
const { viewer, scene } = makeViewer();
installRenderGovernor(viewer);
holdContinuousRender('traffic');
holdContinuousRender('traffic');
releaseContinuousRender('traffic');
assert.equal(scene.requestRenderMode, true, 'single release clears an idempotent double-hold');
releaseContinuousRender('traffic');
releaseContinuousRender('never-held');
assert.equal(scene.requestRenderMode, true);
});
test('mode stays continuous until the LAST holder releases', () => {
const { viewer, scene } = makeViewer();
installRenderGovernor(viewer);
holdContinuousRender('flights');
holdContinuousRender('satellites');
releaseContinuousRender('flights');
assert.equal(scene.requestRenderMode, false);
assert.deepEqual(getRenderGovernorDiagnostics().holds, ['satellites']);
releaseContinuousRender('satellites');
assert.equal(scene.requestRenderMode, true);
});
test('governorRequestRender forwards to the scene and records reasons only in idle mode', () => {
const { viewer, calls } = makeViewer();
installRenderGovernor(viewer);
const baseline = calls.requestRender;
governorRequestRender('layer-tick:earthquakes');
assert.equal(calls.requestRender, baseline + 1);
assert.equal(getRenderGovernorDiagnostics().recentRequests.at(-1).reason, 'layer-tick:earthquakes');
holdContinuousRender('flights');
const idleRequests = getRenderGovernorDiagnostics().recentRequests.length;
governorRequestRender('slider');
assert.equal(
getRenderGovernorDiagnostics().recentRequests.length,
idleRequests,
'continuous-mode requests are not recorded as idle diagnostics',
);
});
test('hold/release/request are safe no-ops before install (test environments without a viewer)', () => {
holdContinuousRender('flights');
releaseContinuousRender('flights');
governorRequestRender('noop');
assert.equal(getRenderGovernorDiagnostics().installed, false);
});
test('holds registered before install apply at install time', () => {
holdContinuousRender('flights');
const { viewer, scene } = makeViewer();
installRenderGovernor(viewer);
assert.equal(scene.requestRenderMode, false, 'pre-install hold keeps continuous mode');
releaseContinuousRender('flights');
assert.equal(scene.requestRenderMode, true);
});