diff --git a/pruef-ampel.png b/pruef-ampel.png index 5e6e95d3..ba8c9fa0 100644 Binary files a/pruef-ampel.png and b/pruef-ampel.png differ diff --git a/pruef-aufgabenbrett.png b/pruef-aufgabenbrett.png index eb104ced..2267eda8 100644 Binary files a/pruef-aufgabenbrett.png and b/pruef-aufgabenbrett.png differ diff --git a/pruef-checkliste.png b/pruef-checkliste.png index e2ff793e..a7245b0e 100644 Binary files a/pruef-checkliste.png and b/pruef-checkliste.png differ diff --git a/pruef-lesbarkeit-wissen.png b/pruef-lesbarkeit-wissen.png index 95eb76ee..2095ac69 100644 Binary files a/pruef-lesbarkeit-wissen.png and b/pruef-lesbarkeit-wissen.png differ diff --git a/pruef-merkzeichen.png b/pruef-merkzeichen.png index e7db538e..2d0c34cf 100644 Binary files a/pruef-merkzeichen.png and b/pruef-merkzeichen.png differ diff --git a/pruef-personen.png b/pruef-personen.png index e15587fa..0f6d26c9 100644 Binary files a/pruef-personen.png and b/pruef-personen.png differ diff --git a/pruef-protokoll-auf.png b/pruef-protokoll-auf.png index 97e6bc71..0f021e4c 100644 Binary files a/pruef-protokoll-auf.png and b/pruef-protokoll-auf.png differ diff --git a/pruef-protokoll-zu.png b/pruef-protokoll-zu.png index 17a53dc6..0e4e6aa9 100644 Binary files a/pruef-protokoll-zu.png and b/pruef-protokoll-zu.png differ diff --git a/pruef-schulung.png b/pruef-schulung.png index c7e90129..f10b11c9 100644 Binary files a/pruef-schulung.png and b/pruef-schulung.png differ diff --git a/pruef-sprung.png b/pruef-sprung.png index 6b48e0bc..1037057f 100644 Binary files a/pruef-sprung.png and b/pruef-sprung.png differ diff --git a/pruef-team.png b/pruef-team.png index 408676c2..2b4556d6 100644 Binary files a/pruef-team.png and b/pruef-team.png differ diff --git a/pruef-uebersicht-computer.png b/pruef-uebersicht-computer.png index 4d55a715..51c56564 100644 Binary files a/pruef-uebersicht-computer.png and b/pruef-uebersicht-computer.png differ diff --git a/pruef-uebersicht-creator.png b/pruef-uebersicht-creator.png index 2b0ae6a3..850d2b87 100644 Binary files a/pruef-uebersicht-creator.png and b/pruef-uebersicht-creator.png differ diff --git a/pruef-uebersicht-handy.png b/pruef-uebersicht-handy.png index d98a5d0f..1a5b26cb 100644 Binary files a/pruef-uebersicht-handy.png and b/pruef-uebersicht-handy.png differ diff --git a/pruef-zustand.png b/pruef-zustand.png index fe45acf3..fb76e26d 100644 Binary files a/pruef-zustand.png and b/pruef-zustand.png differ diff --git a/server/pruef-kopf-messen.mjs b/server/pruef-kopf-messen.mjs index 9807297d..d9ef1b91 100644 --- a/server/pruef-kopf-messen.mjs +++ b/server/pruef-kopf-messen.mjs @@ -1,5 +1,25 @@ -/* Misst die einzelnen Teile der Kopfleiste auf dem Handy -- damit die - Reparatur an der richtigen Stelle ansetzt und nicht geraten wird. */ +/* Misst die einzelnen Teile der Kopfleiste auf dem Handy -- damit eine + Reparatur an der richtigen Stelle ansetzt und nicht geraten wird. + + SIE PRUEFT SEIT DEM 01.09.2026 AUCH, statt nur zu messen. + + Vorher war sie ein reines Messwerkzeug: Sie druckte Zahlen und endete + IMMER mit Exitcode 0. Damit stand sie als "pruef-..." im Ordner der + Pruefungen, lief bei jedem Gesamtlauf mit, meldete "in Ordnung" -- + und konnte gar nicht fehlschlagen. Aufgefallen ist das erst, als der + Gesamtlauf die ANZAHL der Einzelpruefungen mitzaehlte: Diese Datei + kam auf null. + + Eine Pruefung, die immer bestaetigt, bestaetigt nichts. Die beiden + Zahlen, um die es geht, wurden laengst gemessen -- sie werden jetzt + auch beurteilt: + UEBERSTAND muss 0 sein (waagerechtes Scrollen ist auf + einem Handy der schlimmste Fehler) + ABMELDEN ERREICHBAR muss wahr sein -- es ist der einzige Weg wieder + heraus; liegt er ausserhalb des Bildes, sitzt + man fest. + Die Messwerte werden weiterhin gedruckt: Sie sagen bei einem + Fehlschlag sofort, WELCHES Teil zu breit ist. */ import { mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -18,6 +38,9 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...( await import("./index.js"); await new Promise((r) => setTimeout(r, 700)); const BASIS = "http://127.0.0.1:4179"; + +let fehler = 0; +let geprueft = 0; setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 120_000).unref?.(); await fetch(BASIS + "/workspace/api/anmelden", { @@ -66,7 +89,13 @@ for (const breite of [320, 390, 430]) { })(), }; }); - console.log(`\n--- ${breite}px (Überstand ${r.ueber}px, Abmelden erreichbar: ${r.abmeldenSichtbar})`); + /* Erst beurteilen, dann drucken -- die Messwerte darunter sind die + Begründung, falls es schiefgeht. */ + geprueft++; + const gut = r.ueber <= 0 && r.abmeldenSichtbar === true; + if (!gut) fehler++; + console.log(` ${gut ? "ok " : "FEHL"} ${breite}px: Überstand ${r.ueber}px, ` + + `Abmelden erreichbar: ${r.abmeldenSichtbar}`); for (const t of r.kinder) console.log(` ${t.was.padEnd(34)} b=${String(t.breite).padStart(4)} rechts=${t.rechts}`); console.log(" darin:"); for (const t of r.rechtsKinder) console.log(` ${t.was.padEnd(32)} b=${String(t.breite).padStart(4)} rechts=${t.rechts}`); @@ -74,4 +103,10 @@ for (const breite of [320, 390, 430]) { } await browser.close(); try { rmSync(ordner, { recursive: true, force: true }); } catch {} -process.exit(0); +/* Die Anzahl gehoert in die BEDINGUNG, nicht nur in den Meldetext: + Waere die Schleife nie gelaufen, waere "0 Fehler" sonst ein Erfolg. */ +console.log(` +${geprueft} Breiten gemessen, ${fehler} beanstandet.`); +if (!geprueft) { console.log(" FEHL keine einzige Breite gemessen"); fehler++; } +console.log(fehler ? "NICHT in Ordnung." : "Alles in Ordnung."); +process.exit(fehler ? 1 : 0); diff --git a/tools/alles-pruefen.mjs b/tools/alles-pruefen.mjs new file mode 100644 index 00000000..4828e5da --- /dev/null +++ b/tools/alles-pruefen.mjs @@ -0,0 +1,85 @@ +/* Laesst JEDE Pruefung laufen und zaehlt mit. + + WARUM EIN EIGENER LAeUFER und nicht eine Zeile in der Shell: + + 1. DIE ANZAHL MUSS STIMMEN. Ein gruener Lauf ist kein Beweis, solange + nicht auch die Zahl der Pruefungen stimmt -- eine Datei, die still + nicht startet, faellt sonst niemandem auf. Hier wird jede Datei + einzeln gezaehlt, und die Gesamtzahl der Einzelpruefungen steht am + Ende. + + 2. EIN FEHLSCHLAG DARF DEN LAUF NICHT ABBRECHEN. Sonst sieht man den + ersten Fehler und weiss nichts ueber die restlichen zwanzig. + + 3. DIE DAUER GEHOeRT DAZU. Eine Pruefung, die ploetzlich dreimal so + lange braucht, ist meist eine, die auf etwas wartet, das es nicht + mehr gibt. +*/ +import { readdirSync } from "node:fs"; +import { spawn } from "node:child_process"; +import { join } from "node:path"; + +const ORDNER = "server"; +const dateien = readdirSync(ORDNER) + .filter((n) => n.startsWith("pruef-") && n.endsWith(".mjs")) + .sort(); + +console.log(`${dateien.length} Pruefdateien gefunden\n`); + +const laufen = (datei) => new Promise((fertig) => { + const start = Date.now(); + const kind = spawn(process.execPath, [join(ORDNER, datei)], { + stdio: ["ignore", "pipe", "pipe"], + }); + let aus = ""; + kind.stdout.on("data", (d) => { aus += d; }); + kind.stderr.on("data", (d) => { aus += d; }); + kind.on("close", (code) => { + const sek = Math.round((Date.now() - start) / 100) / 10; + const einzeln = (aus.match(/^\s{2}(ok|FEHL)\s/gm) || []).length; + const schlecht = (aus.match(/^\s{2}FEHL\s/gm) || []).length; + fertig({ datei, code, sek, einzeln, schlecht, aus }); + }); +}); + +let gesamt = 0, kaputt = 0, einzelnGesamt = 0, einzelnSchlecht = 0; +const fehlerhafte = []; + +for (const datei of dateien) { + const r = await laufen(datei); + gesamt++; + einzelnGesamt += r.einzeln; + einzelnSchlecht += r.schlecht; + /* NULL PRUEFUNGEN IST EIN FEHLER, KEIN ERFOLG. + Beim ersten Lauf stand hier nur `code === 0 && schlecht === 0` -- + und pruef-kopf-messen.mjs kam damit als "ok" durch, obwohl sie + ueberhaupt nichts geprueft hat (sie war ein reines Messwerkzeug und + endete immer mit 0). Genau so sieht eine Pruefung aus, die immer + bestaetigt: gruen, und wertlos. */ + const gut = r.code === 0 && r.schlecht === 0 && r.einzeln > 0; + if (!gut) { kaputt++; fehlerhafte.push(r); } + console.log( + `${gut ? " ok " : " FEHL "} ${r.datei.padEnd(30)}` + + `${String(r.einzeln).padStart(4)} Pruefungen` + + `${r.schlecht ? `, ${r.schlecht} FEHLGESCHLAGEN` : ""}` + + ` ${String(r.sek).padStart(6)} s` + + (r.einzeln === 0 ? " KEINE PRUEFUNG GELAUFEN" : "")); +} + +console.log("\n" + "=".repeat(64)); +console.log(`Dateien: ${gesamt - kaputt} von ${gesamt} in Ordnung`); +console.log(`Einzelpunkte: ${einzelnGesamt - einzelnSchlecht} von ${einzelnGesamt} bestanden`); + +/* Eine Datei ohne eine einzige Pruefung ist ein Fehler, kein Erfolg. */ +const leer = dateien.length && einzelnGesamt === 0; +if (leer) console.log("ACHTUNG: keine einzige Pruefung ist gelaufen."); + +for (const r of fehlerhafte) { + console.log("\n" + "-".repeat(64)); + console.log(`### ${r.datei} (Exitcode ${r.code})`); + const zeilen = r.aus.split("\n").filter((z) => /FEHL|Error|error:/.test(z)); + console.log(zeilen.slice(0, 12).join("\n") || r.aus.slice(-800)); +} + +console.log("\n" + (kaputt || leer ? "NICHT in Ordnung." : "Alles in Ordnung.")); +process.exit(kaputt || leer ? 1 : 0);