mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-15 15:52:21 +00:00
Tests that made their own engine object now use createFakeEngine() with its scripting hooks or an override of the one member under test, so they follow the contract when it changes. 125 such literals in 74 test files go down to two that are not globe engines on purpose; report-qa-harness counts them, and the baseline keeps the number from growing.
180 lines
5.9 KiB
JavaScript
180 lines
5.9 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {
|
|
QA_HARNESS_METRICS,
|
|
engineLiteralLines,
|
|
harnessGrowth,
|
|
measureQaHarness,
|
|
readBaseline,
|
|
readQaSources,
|
|
readTestSources,
|
|
} from './report-qa-harness.mjs';
|
|
|
|
test('QA harness duplication does not grow past the baseline', () => {
|
|
assert.deepEqual(
|
|
harnessGrowth(measureQaHarness(), readBaseline().metrics),
|
|
[],
|
|
'QA duplication grew; use the shared browser harness and src/globe/testing/fakeEngine.js for test engines.',
|
|
);
|
|
});
|
|
|
|
test('the baseline names every metric', () => {
|
|
assert.deepEqual(
|
|
Object.keys(readBaseline().metrics).sort(),
|
|
QA_HARNESS_METRICS.map(({ id }) => id).sort(),
|
|
);
|
|
});
|
|
|
|
test('a metric that grows is reported, one that falls is not', () => {
|
|
const baseline = Object.fromEntries(
|
|
QA_HARNESS_METRICS.map(({ id }) => [id, 10]),
|
|
);
|
|
assert.deepEqual(
|
|
harnessGrowth({ ...baseline, ownLaunch: 11, fixedSleeps: 3 }, baseline).map(
|
|
({ id }) => id,
|
|
),
|
|
['ownLaunch'],
|
|
);
|
|
assert.equal(harnessGrowth(baseline, {}).length, QA_HARNESS_METRICS.length);
|
|
});
|
|
|
|
test('QA sources include the harness and exclude tests and other reports', () => {
|
|
const names = readQaSources().map(({ file }) => file);
|
|
assert.ok(names.includes('scripts/qa-strict-harness.mjs'));
|
|
assert.ok(!names.some((name) => name.endsWith('.test.mjs')));
|
|
assert.ok(!names.includes('scripts/report-qa-harness.mjs'));
|
|
});
|
|
|
|
test('test sources include nested tests and exclude runtime files', () => {
|
|
const names = readTestSources().map(({ file }) => file);
|
|
assert.ok(names.includes('src/globe/testing/fakeEngine.test.mjs'));
|
|
assert.ok(names.includes('scripts/qaHarness.test.mjs'));
|
|
assert.ok(names.every((name) => name.endsWith('.test.mjs')));
|
|
});
|
|
|
|
test('engine literals include assignments, inline options and factory returns', () => {
|
|
for (const source of [
|
|
'const engine = {};',
|
|
'let engine; engine = { camera: {} };',
|
|
'scene.engine = { host: {} };',
|
|
"scene['engine'] = {};",
|
|
'init({ engine: {} });',
|
|
'const state = { _engine: {} };',
|
|
'const engineB = {}, trafficEngine = {};',
|
|
"function createEngine() { return { kind: 'cesium' }; }",
|
|
'const engine = () => ({ camera: {} });',
|
|
'const fakeEngine = () => { return { host: {} }; };',
|
|
'const factory = { createEngine() { return { render: {} }; } };',
|
|
'inspect({ host: { size() {} }, camera: {} });',
|
|
"const navara = { kind: 'navara', render: {} };",
|
|
])
|
|
assert.ok(engineLiteralLines(source).length > 0, source);
|
|
assert.deepEqual(
|
|
engineLiteralLines('const engine = {};\ninit({ engine: {} });'),
|
|
[1, 2],
|
|
);
|
|
});
|
|
|
|
test('engine literal counting ignores source text, options and harness observations', () => {
|
|
for (const source of [
|
|
'// const engine = {};',
|
|
"const source = 'const engine = {};';",
|
|
'const source = `init({ engine: {} });`;',
|
|
'const engine = createFakeEngine();',
|
|
'init({ engine: createFakeEngine() });',
|
|
'const options = { engineOptions: {} };',
|
|
'const engineOptions = { canvas: {}, width: 800 };',
|
|
"const headers = { host: 'localhost' };",
|
|
'const overlay = { host: { setEntries() {} } };',
|
|
'result[engine] = { camera: {} };',
|
|
'function observedEngine() { return { engine, camera }; }',
|
|
'function observedEngine() { return { snapshots: [] }; }',
|
|
'function observedEngine() { return records.map(() => ({ camera: {} })); }',
|
|
])
|
|
assert.deepEqual(engineLiteralLines(source), [], source);
|
|
});
|
|
|
|
test('engine literal metric counts test files once and rejects baseline growth', () => {
|
|
const metric = QA_HARNESS_METRICS.find(
|
|
({ id }) => id === 'testEngineLiterals',
|
|
);
|
|
const measured = metric.measure([
|
|
{
|
|
file: 'src/one.test.mjs',
|
|
text: 'const engine = {}; init({ engine: {} });',
|
|
},
|
|
{
|
|
file: 'scripts/two.test.mjs',
|
|
text: 'const engine = () => ({ host: {} });',
|
|
},
|
|
{ file: 'src/three.test.mjs', text: 'const engine = createFakeEngine();' },
|
|
{ file: 'src/runtime.js', text: 'const engine = {};' },
|
|
]);
|
|
assert.equal(measured, 2);
|
|
const baseline = Object.fromEntries(
|
|
QA_HARNESS_METRICS.map(({ id }) => [id, 0]),
|
|
);
|
|
assert.deepEqual(
|
|
harnessGrowth({ ...baseline, testEngineLiterals: measured }, baseline).map(
|
|
({ id }) => id,
|
|
),
|
|
['testEngineLiterals'],
|
|
);
|
|
});
|
|
|
|
test('metrics count scripts once and distinguish helpers from their callers', () => {
|
|
const measure = (id, ...sources) =>
|
|
QA_HARNESS_METRICS.find((metric) => metric.id === id).measure(
|
|
sources.map((text) => ({ text })),
|
|
);
|
|
assert.equal(
|
|
measure(
|
|
'ownLaunch',
|
|
'puppeteer.launch({}); puppeteer.launch({});',
|
|
'launchBrowser();',
|
|
),
|
|
1,
|
|
);
|
|
assert.equal(
|
|
measure(
|
|
'fixedSleeps',
|
|
'const sleep = (ms) => new Promise((r) => setTimeout(r, ms));',
|
|
'await new Promise((resolve) => { setTimeout(resolve, 1000); });',
|
|
'await new Promise((resolve) => setTimeout(resolve));',
|
|
'new Promise((resolve) => requestAnimationFrame(resolve));',
|
|
'setTimeout(() => reject(new Error()), 1000);',
|
|
),
|
|
3,
|
|
);
|
|
assert.equal(
|
|
measure(
|
|
'loadingScreenReadiness',
|
|
"page.waitForSelector('#loading-screen');",
|
|
"page.waitForSelector('#loading-screen'); await waitForEngine(page);",
|
|
"document.querySelector('#loading-screen');",
|
|
),
|
|
1,
|
|
);
|
|
assert.equal(
|
|
measure(
|
|
'cesiumOnlyReads',
|
|
'window.__godsEyeView?.viewer; window.__godsEyeView.tileset;',
|
|
'const { scene } = window.__godsEyeView;',
|
|
'const app = window.__godsEyeView; app.viewer;',
|
|
'window.__godsEyeView.sceneDirector;',
|
|
'window.__godsEyeView.engine;',
|
|
),
|
|
3,
|
|
);
|
|
assert.equal(
|
|
measure(
|
|
'ownWaitHelpers',
|
|
'async function waitForReady() {}',
|
|
'const waitForReady = async (page) => page.ready();',
|
|
'await waitForEngine(page);',
|
|
"import { waitForEngine } from './qa-strict-harness.mjs';",
|
|
),
|
|
2,
|
|
);
|
|
});
|