Files
quartier/tests/url.test.ts
T
Jules NényandClaude Fable 5.1 2e249f1027 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>
2026-09-27 15:21:40 +02:00

38 lines
1.5 KiB
TypeScript

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');
});