MemoForge se teste avec le runner intégré de Node (node:test) — zéro dépendance,
fidèle au choix « vanilla, sans build ».
npm test # tous les tests + rapport de couverture (échoue si engine < 90%)
npm run test:watchtests/
helpers.mjs fabrique de programmes + vérification de cible
engine/memory.test.mjs unités : Memory (adresses, tas, erreurs)
engine/interpreter.test.mjs unités : Interpreter (eval/exec, erreurs)
game/levels.test.mjs intégration : les 16 cas de gameplay
- Unités moteur : couvrent chaque méthode de
memory.js/interpreter.js, y compris les chemins d'erreur (NULL, adresse invalide, double free…). - Intégration niveaux : rejoue chaque solution de niveau et vérifie la cible + les
pièges (mauvais ordre → crash, oubli de
free→ fuite…).
npm test applique des seuils scopés à src/engine (le cœur) :
| Métrique | Seuil |
|---|---|
| lignes | ≥ 90 % |
| branches | ≥ 90 % |
| fonctions | ≥ 90 % |
Implémenté via les drapeaux natifs --experimental-test-coverage
--test-coverage-include/--test-coverage-lines|branches|functions. En dessous du seuil,
npm test sort en erreur (code ≠ 0) → la CI passe au rouge.
- Créer
tests/<module>/<sujet>.test.mjs. import { test, describe } from 'node:test'etassertdenode:assert/strict.- Pour du gameplay, réutiliser
helpers.mjs(runProgram,goalMet,solved).
Le fichier est découvert automatiquement (motif *.test.mjs).
npm run test:visual — harnais Puppeteer (tests/visual/run.mjs) qui capture et vérifie
les écrans clés : carte, salle 1-1, salle rec-1 avec la pile d'appels au plus
profond de fact(3), styleguide.
- Capture : toujours écrite dans
tests/visual/out/(gitignoré ; artefact CI 14 j). - Invariants structurels : chaque écran doit rendre ce qu'il prétend (salles sur la
carte, mission + palette, frames
fact(3)…fact(1)réelles) — violation = échec. - Références pixel :
tests/visual/baseline/<plateforme>/(le rendu des polices varie selon l'OS). Référence absente = créée (seed) ; dérive > 0,5 % de pixels = échec, avec un<écran>.diff.pngdansout/.npm run test:visual -- --updaterégénère. - Chrome :
PUPPETEER_EXECUTABLE_PATH> cache Puppeteer > emplacements standards (Chrome/Edge Windows, google-chrome/chromium Linux). Préinstallé sur le runner CI. - Déterminisme : écrans pilotés via
window.__memoforge(exposé parsrc/main.js), animations neutralisées, viewport fixe 1280×900. - Layout mobile (E9-2) : un écran
mobile-sallecapturé à 375 px vérifie que le mur de casiers et le programme s'empilent (flex column) — verrouillé contre les régressions. - Budget de perf (E5-3) : le harnais applique aussi
docs/PERF.md— poids de l'app, rendu salle/carte mesurés dans Chrome ; dépassement = échec.