// © 2026 TechnoLibre (http://www.technolibre.ca) // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) // Les outils de page du banc (§ 19.10), pour les épreuves *.banc.js que // joue vitest.banc.config.js, sous Chromium sans cadence d'images : le // contrôle du cadre, le ralentissement du processeur, la mesure des // intervalles entre images pendant un geste, les deux contrôles qui disent // si cette mesure voit ce qu'elle mesure, et l'écriture d'une sortie. // // Une horloge réelle se lit ici, et seulement pour mesurer : l'instant que // requestAnimationFrame passe à son rappel, et performance.now pour tenir // une image occupée. Ce qui s'écrit ne porte aucun instant, seulement des // durées. import { inject } from 'vitest'; import { cdp, commands } from 'vitest/browser'; import { fixerCadre } from '../../test/navigateur/entrees.js'; import { statistiques } from './statistiques.js'; /** Le p95 sous lequel un plan vide prouve que la cadence n'est pas bridée : * sous la marche de 16,7 ms d'une cadence calée à 60 images par seconde. */ export const SEUIL_CADENCE_MS = 16; /** La durée d'une image chargée exprès, que la mesure doit voir. */ export const CHARGE_MS = 50; // Le dossier des sorties, relatif à la racine du projet, où commands.writeFile // résout un chemin ; ignoré par git. Un nom de sortie n'y désigne qu'un // fichier de ce dossier. const DOSSIER_SORTIES = 'scripts/banc/sorties'; const NOM_SORTIE = /^[a-z0-9_]+$/; const uneImage = () => new Promise((resoudre) => requestAnimationFrame(resoudre)); /** * Pose le cadre du banc, que vitest.banc.config.js fournit par * inject('cadreBanc'), et vérifie qu'il est rendu tel quel : innerWidth et * innerHeight (fixerCadre), un facteur d'échelle de 1, et aucune mise à * l'échelle du cadre de l'épreuve par la page qui le porte, d'un cadre à son * parent : le rapport entre la largeur rendue de chaque