Files
EVCS/tests/arbitrage/run.mjs

52 lines
5.0 KiB
JavaScript

#!/usr/bin/env node
// Tests de l'arbitre encadre (tools/arbitrage.mjs, 08/10/2026).
import { detecterSituation, lireChoix } from '../../tools/arbitrage.mjs';
let f = 0;
const ok = (l, c, d = '') => { if (c) console.log(`✅ ${l}`); else { f++; console.log(`❌ ${l} ${d}`); } };
// Releve reel du 08/10 01:30 : VW bloquee, EDF ferme, session HC.
const nuit0810 = { fenetre: 'nuit', finFenetre: '07:24', contacteurOn: true, voitureBranchee: true, borneW: 0,
sourceMode: 'Bloqué', etat: 'night_no_grid_hc_lock', raison: 'Nuit sans autorisation HC réseau | Nuit EVCS: target=38.8%', vehicule: 'VW', modeNuit: 'sans_edf' };
const s = detecterSituation(nuit0810);
ok('nuit-0810-question', s && s.cas === 'voiture_bloquee_edf_ferme' && /VW est branchee/.test(s.question) && /Nuit sans autorisation HC réseau/.test(s.question), JSON.stringify(s));
ok('nuit-0810-choix-ferme', s && s.choix.length === 2 && s.choix[0].ordre.ordre === 'mode_nuit' && s.choix[0].ordre.valeur === 'complete' && s.choix[1].ordre === null);
const m = detecterSituation({ ...nuit0810, fenetre: 'midi', finFenetre: '14:24' });
ok('midi-force-grid', m && m.choix[0].ordre.ordre === 'strategie' && m.choix[0].ordre.valeur === 'force_grid_now' && /14:24/.test(m.choix[0].libelle));
ok('deja-complete-pas-de-question', detecterSituation({ ...nuit0810, modeNuit: 'complete' }) === null);
ok('hors-hc-rien', detecterSituation({ ...nuit0810, fenetre: null }) === null);
ok('edf-ouvert-rien', detecterSituation({ ...nuit0810, contacteurOn: false }) === null);
ok('voiture-pleine-rien', detecterSituation({ ...nuit0810, etat: 'night_recovery_done_idle' }) === null);
ok('voiture-en-charge-rien', detecterSituation({ ...nuit0810, borneW: 1400, sourceMode: 'Réseau forcé' }) === null);
ok('pas-de-voiture-rien', detecterSituation({ ...nuit0810, voitureBranchee: false }) === null);
// Elargissement du 10/10 : releve du 09/10 13:59, JEEP en « Reseau HC autorise », attente.
const midi0910 = { ...nuit0810, fenetre: 'midi', finFenetre: '14:24', sourceMode: 'Réseau HC autorisé', etat: 'idle_wait_conditions', vehicule: 'JEEP' };
const m2 = detecterSituation(midi0910);
ok('midi-0910-jeep-attend-question', m2 && m2.cas === 'voiture_bloquee_edf_ferme' && m2.choix[0].ordre.valeur === 'force_grid_now', JSON.stringify(m2));
const n2 = detecterSituation({ ...nuit0810, sourceMode: 'Réseau forcé', etat: 'idle_wait_conditions', modeNuit: 'complete' });
ok('nuit-hors-sans-edf-force-grid', n2 && n2.choix[0].ordre.ordre === 'strategie', JSON.stringify(n2));
// Cas 2 : releve du 09/10 13:59, 32 A pour 140 A, 12,9 kWh a reprendre.
const rech = { fenetre: 'midi', finFenetre: '14:24', contacteurOn: true, voitureBranchee: false, borneW: 0, sourceMode: 'Réseau HC autorisé', etat: 'x',
sessionEngagee: true, manqueKwh: 12.9, soc: 57, batterieA: 32, dvccA: 140 };
const a2 = detecterSituation(rech);
ok('recharge-bridee-alerte', a2 && a2.cas === 'recharge_bridee' && a2.choix.length === 0 && /32 A pour 140 A/.test(a2.question) && /12.9 kWh/.test(a2.question), JSON.stringify(a2));
ok('recharge-normale-rien', detecterSituation({ ...rech, batterieA: 121 }) === null);
ok('cible-atteinte-hold-rien', detecterSituation({ ...rech, manqueKwh: 0, batterieA: 2 }) === null);
ok('hors-session-rien', detecterSituation({ ...rech, sessionEngagee: false }) === null);
ok('choix-1', lireChoix('1', s.choix)?.cle === '1');
ok('choix-texte', lireChoix('je prends le 2', s.choix)?.cle === '2');
ok('choix-inconnu', lireChoix('5', s.choix) === null && lireChoix('oui', s.choix) === null);
// Cas 0 : releve reel du 13/10 05:54 — session de nuit engagee, contacteur qui retombe,
// tension d'entree 0 V, reseau 0 W, SOC 26 %.
const nuit1310 = { fenetre: 'nuit', finFenetre: '07:24', contacteurOn: false, contacteurEtat: 'off', voitureBranchee: false, borneW: 0,
sourceMode: 'Bloqué', etat: 'vehicle_not_connected', sessionEngagee: true, verrouHysteresis: true,
tensionEntreeV: 0, reseauW: 0, soc: 26, batterieA: -18.2, manqueKwh: 2.74, dvccA: 30 };
const z = detecterSituation(nuit1310);
ok('edf-ne-ferme-pas-1310', z && z.cas === 'edf_ne_ferme_pas' && z.choix.length === 0 && /0 V/.test(z.question) && /26 %/.test(z.question) && /levier/.test(z.question), JSON.stringify(z));
ok('edf-ne-ferme-pas-contacteur-affiche-on', detecterSituation({ ...nuit1310, contacteurOn: true, contacteurEtat: 'on' })?.cas === 'edf_ne_ferme_pas');
ok('edf-arrive-pas-d-alerte-edf', detecterSituation({ ...nuit1310, contacteurOn: true, tensionEntreeV: 229, reseauW: 2300, batterieA: 21.8 }) === null);
ok('tension-figee-mais-reseau-mesure', detecterSituation({ ...nuit1310, contacteurOn: true, tensionEntreeV: 0, reseauW: 1500, batterieA: 21.8 }) === null);
ok('edf-pas-demande-rien', detecterSituation({ ...nuit1310, sessionEngagee: false, verrouHysteresis: false }) === null);
ok('hysteresis-hors-hc-alerte', detecterSituation({ ...nuit1310, fenetre: null, sessionEngagee: false })?.cas === 'edf_ne_ferme_pas');
ok('tension-illisible-pas-d-alerte', detecterSituation({ ...nuit1310, tensionEntreeV: NaN }) === null);
console.log(f ? `\n${f} ECHEC(S)` : '\nARBITRAGE OK');
process.exit(f ? 1 : 0);