explodorama / files / test / perf.test.ts
perf.test.ts
9ed991c9 2026-11-03 Pavel Safronov | 1 | import { expect, it } from 'vitest' |
| 2 | import { generateScene, SCENE_KINDS } from '../src/sim/demo' | |
| 3 | ||
| 4 | /** | |
| 5 | * Perf budget for demo generation. Scenes are found by random play, so a scene kind whose moment | |
| 6 | * is a rare chain gets slow without anything failing (CI went red on the Decoy tests' default | |
| 7 | * 5 s timeout, 2026-11-01). Each seed of each kind is timed; the slowest are printed, and any seed | |
| 8 | * over the budget fails here, naming the kind. The budget is several times the slowest seen | |
| 9 | * (Freeze, ~1.1 s on a laptop) to leave room for a slow CI runner. | |
| 10 | */ | |
| 11 | const SEEDS = [1, 2, 3] | |
| 12 | const BUDGET_MS = 4000 | |
| 13 | ||
| 14 | it(`every demo scene is found within ${BUDGET_MS} ms a seed`, () => { | |
| 15 | const times: { kind: string; seed: number; ms: number }[] = [] | |
| 16 | for (const kind of SCENE_KINDS) { | |
| 17 | for (const seed of SEEDS) { | |
| 18 | const t = performance.now() | |
| 19 | generateScene(kind, seed) | |
| 20 | times.push({ kind, seed, ms: Math.round(performance.now() - t) }) | |
| 21 | } | |
| 22 | } | |
| 23 | times.sort((a, b) => b.ms - a.ms) | |
| 24 | console.log('slowest demo scenes:\n' + times.slice(0, 5).map((t) => ` ${t.kind} seed ${t.seed}: ${t.ms} ms`).join('\n')) | |
| 25 | const slow = times.filter((t) => t.ms > BUDGET_MS) | |
| 26 | expect(slow, `over ${BUDGET_MS} ms: ${slow.map((t) => `${t.kind}#${t.seed} ${t.ms} ms`).join(', ')}`).toEqual([]) | |
| 27 | // Every kind runs three times, so this test as a whole is slow (~9 s here): its own timeout. | |
| 28 | }, 120_000) |