Run just the e2e steps you name

GM_STEPS=20, 1-12 or 6,20 takes a subset of the suite, which is seconds
instead of two minutes while one step is being written. Steps live off
what the earlier ones leave behind, so a subset that skips a prerequisite
fails on purpose. The filter had been written as a throwaway script three
times; it belongs in the runner.

The README stops calling a remote browser the way this suite is meant to
be run: with the GPU in use a local run costs ~124 s and about 0.8 of the
four cores here, so GM_REMOTE is a convenience, not a requirement.
This commit is contained in:
root committed 2026-09-10 06:06:29 +02:00
1 parent 338ff4389f
commit 6ac6b69388
3 files changed
+43 -12

No files matched your search

+23 -1
View File
@@ -6,6 +6,9 @@
*
* Runs against the fixture project written by tools/seed-e2e.mjs and mutates it heavily; the
* steps in tools/e2e/ run in order and build on each other's scene state.
*
* `GM_STEPS=1-12` or `GM_STEPS=6,20` runs a subset while working on one step. Since later steps
* rely on what earlier ones leave behind, a subset that skips a prerequisite fails on purpose.
*/
import { STEPS } from './e2e/index.mjs';
import { runChecks } from './lib/harness.mjs';
@@ -13,8 +16,27 @@ import { PROJECTS, cliArgs } from './lib/projects.mjs';
const { projectId, baseUrl } = cliArgs('e2e.mjs', PROJECTS.fixture);
function selectSteps(spec) {
if (!spec) return STEPS;
const wanted = new Set();
for (const part of spec.split(',')) {
const [from, to] = part.trim().split('-').map(Number);
if (!Number.isInteger(from) || from < 1) {
console.error(`GM_STEPS: cannot read "${part}" – use 20, 1-12 or 6,20`);
process.exit(2);
}
for (let i = from; i <= (Number.isInteger(to) ? to : from); i++) wanted.add(i);
}
return STEPS.filter((_, i) => wanted.has(i + 1));
}
const steps = selectSteps(process.env.GM_STEPS);
if (steps.length !== STEPS.length) {
console.log(`running ${steps.length}/${STEPS.length} steps: ${steps.map((s) => s.name).join(', ')}`);
}
await runChecks({ projectId, baseUrl, port: 9333, shotPrefix: 'gm-e2e' }, async (t) => {
await t.navigate();
await t.shot('01-loaded');
for (const step of STEPS) await step(t);
for (const step of steps) await step(t);
});