LOT Q0 : socle du démonstrateur Quelque part en 2035
Scaffold Vite + TypeScript + Three.js (scène vide : sol + boîte, marqueur de build), store et encodage de l'état dans l'URL (5 tests), lint de frontières entre modules, pipeline d'extraction Rhino (graine du 26/09) et première géométrie v0, deploy.sh statique (releases + lien symbolique + smoke), AGENTS.md, RUNBOOK, licences MIT + CC BY-SA 4.0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { decoderEtat, encoderEtat, lireMode, ETAT_DEFAUT } from '../src/core/url.ts';
|
||||
import { reduire } from '../src/core/state.ts';
|
||||
|
||||
test('aller-retour de l’état dans le hash', () => {
|
||||
const e = { couches: ['eau', 'vegetal'], dispositifs: ['noue', 'cuve'], temps: '2030' as const, parcours: 'pluie' };
|
||||
assert.deepEqual(decoderEtat(encoderEtat(e)), e);
|
||||
});
|
||||
|
||||
test('état par défaut → hash vide, hash vide → état par défaut', () => {
|
||||
assert.equal(encoderEtat(ETAT_DEFAUT), '');
|
||||
assert.deepEqual(decoderEtat(''), ETAT_DEFAUT);
|
||||
});
|
||||
|
||||
test('valeurs hostiles ignorées', () => {
|
||||
const e = decoderEtat('#c=eau,<script>&d=noue,,noue&t=1999&p=../x');
|
||||
assert.deepEqual(e.couches, ['eau']);
|
||||
assert.deepEqual(e.dispositifs, ['noue']);
|
||||
assert.equal(e.temps, '2035');
|
||||
assert.equal(e.parcours, null);
|
||||
});
|
||||
|
||||
test('mode : ambiance seulement si demandé', () => {
|
||||
assert.equal(lireMode(new URL('https://x/?mode=ambiance')), 'ambiance');
|
||||
assert.equal(lireMode(new URL('https://x/?mode=autre')), 'demo');
|
||||
assert.equal(lireMode(new URL('https://x/')), 'demo');
|
||||
});
|
||||
|
||||
test('réducteur : toggle et temps', () => {
|
||||
let e = reduire(ETAT_DEFAUT, { type: 'dispositif:toggle', id: 'noue' });
|
||||
assert.deepEqual(e.dispositifs, ['noue']);
|
||||
e = reduire(e, { type: 'dispositif:toggle', id: 'noue' });
|
||||
assert.deepEqual(e.dispositifs, []);
|
||||
e = reduire(e, { type: 'temps:set', cran: 'aujourdhui' });
|
||||
assert.equal(e.temps, 'aujourdhui');
|
||||
});
|
||||
Reference in New Issue
Block a user