HardYards/web/world/js/tests/b.test.js
m3ultra 1049dece24 Add selftest harness with one suite per lane
selftest.html only imports; each lane owns js/tests/<letter>.test.js. Five lanes
sharing one selftest.html would be the single guaranteed merge conflict in the
repo, so the stubs are pre-created with each lane's PLAN3D asserts written into
the header.

No rAF anywhere: it's throttled in a hidden tab, so a rAF-driven selftest would
pass only while you watch it. fixedLoop() drives time instead.

Lane A's suite covers the §5-A acceptance criteria, including "camera never
clips through house" — stated as the underlying invariant (no solid between the
player's head and the camera) so it survives Lane E swapping the house GLB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 21:33:42 +10:00

27 lines
1.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Lane B selftests — cloth, corner loads, failure cascade.
*
* Lane B owns this file. Lane A pre-created it so that adding your suite never
* means editing selftest.html — if all five lanes shared that file it would be
* the one guaranteed merge conflict in the repo.
*
* The asserts PLAN3D §5-B asks for, once sail.js lands:
* 1. hypar sheds load — twisted rig's peak corner load < flat rig's peak,
* same storm, same hardware. This is the thesis of the whole game; if it
* doesn't hold, the wind force is being applied per-node instead of
* per-face.
* 2. cascade — break one corner at a fixed t, a neighbour's load spikes ≥2×.
* 3. determinism — two runs, same inputs, byte-equal load traces.
*
* Useful imports when you get there:
* import { FIXED_DT, STORM_LEN, HARDWARE, createStubWind } from '../contracts.js';
* import { assert, assertLess, fixedLoop } from '../testkit.js';
* Drive time with fixedLoop(), never rAF. Use createStubWind({seed}) until
* Lane C's weather.js lands — but don't tune against it, it's uniform in space.
*/
/** @param {import('../testkit.js').Suite} t */
export default function run(t) {
t.skip('sail.js not landed yet — Lane B');
}