gestion_table_tournante_libre/src/interface/mode.test.js
Mathieu Benoit 5fbbab6477 [ADD] interface: application shell — banner, sections, theme, about
The window showed only a banner; it now holds the application. App mounts
the session, the facade and the generation, settles the working folder
and lists its events before it reports ready, re-reading the list once a
question is answered or a refused determination succeeds. The banner
carries version, mode and the event list command; an open event shows its
sections in their first form; the theme follows the system at each start
and the operator's choice lasts the session; À propos names the build.
Errors are collected for a report, and Electron removes the session's
locks at exit.
Checked: 2189 node, 193 browser, 60 node-long; the Electron start check.

--- FR ---

[ADD] interface : coquille — bandeau, sections, thème, À propos

La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application.
App monte la séance, la façade et la génération, règle le dossier de
travail et liste ses événements avant de se dire prête, et relit la liste
une fois une question répondue ou une détermination refusée réussie. Le
bandeau porte version, mode et la commande de la liste ; un événement
ouvert montre ses sections dans leur première forme ; le thème suit le
système à chaque démarrage et le choix de l'opérateur vaut pour la séance ;
À propos nomme la construction. Les erreurs se collectent pour un
signalement, et Electron efface à la sortie les verrous de la séance.
Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron.

Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00

66 lines
2.8 KiB
JavaScript

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// La clé du libellé de mode (§ 8.4, § 8.5), que lisent le bandeau et le
// cadre de mode : aucune sans événement ; le plan bloqué avant le mode, qu'il
// force en lecture ; sinon le mode de la séance. Et la clé de l'annonce de
// format du bandeau (§ 18.6), une par annonce de la séance.
import assert from 'node:assert/strict';
import { describe, test } from '../../test/lanceur.js';
import { TABLE as COQUILLE } from './libelles/coquille.js';
import { cleAnnonceFormat, cleDeMode } from './mode.js';
// Un EtatSeance réduit à ce que lit cleDeMode.
const etat = (mode, etatDuPlan, annonceFormat = null) => ({
mode,
evenement: etatDuPlan === null ? null : { base: 'bal', id: 'evt-1', nom: 'Bal', etat: etatDuPlan, revision: 1, annonceFormat },
});
describe('cleDeMode (§ 8.4)', () => {
test('null sans événement, dans les deux modes', () => {
assert.equal(cleDeMode(etat('lecture', null)), null);
assert.equal(cleDeMode(etat('ecriture', null)), null);
});
test('un plan bloqué rend coquille.mode.bloque, quel que soit le mode', () => {
assert.equal(cleDeMode(etat('lecture', 'bloque')), 'coquille.mode.bloque');
assert.equal(cleDeMode(etat('ecriture', 'bloque')), 'coquille.mode.bloque');
});
test('sinon le mode de la séance, pour chaque état non bloqué', () => {
const etats = ['brouillon', 'propose', 'retenu'];
assert.ok(etats.length > 0);
for (const etatDuPlan of etats) {
assert.equal(cleDeMode(etat('lecture', etatDuPlan)), 'coquille.mode.lecture', etatDuPlan);
assert.equal(cleDeMode(etat('ecriture', etatDuPlan)), 'coquille.mode.ecriture', etatDuPlan);
}
});
test('chaque clé rendue a son texte dans la table de la coquille', () => {
for (const cle of ['coquille.mode.lecture', 'coquille.mode.ecriture', 'coquille.mode.bloque']) {
assert.equal(typeof COQUILLE.get(cle), 'string', cle);
}
});
});
describe('cleAnnonceFormat (§ 18.6)', () => {
test('null sans événement, ou au format courant', () => {
assert.equal(cleAnnonceFormat(etat('lecture', null)), null);
assert.equal(cleAnnonceFormat(etat('lecture', 'brouillon')), null);
});
test('une clé par annonce, chacune avec son texte', () => {
const cas = [
['plusRecent', 'coquille.format.plusRecent'],
['plusAncien', 'coquille.format.plusAncien'],
];
for (const [annonce, cle] of cas) {
assert.equal(cleAnnonceFormat(etat('lecture', 'brouillon', annonce)), cle, annonce);
assert.equal(typeof COQUILLE.get(cle), 'string', cle);
}
});
test('une annonce inconnue lève RangeError', () => {
assert.throws(() => cleAnnonceFormat(etat('lecture', 'brouillon', 'plusVieux')), RangeError);
});
});