diff --git a/server/pruef-werdegang.mjs b/server/pruef-werdegang.mjs index b897fb5b..3c3a3acb 100644 --- a/server/pruef-werdegang.mjs +++ b/server/pruef-werdegang.mjs @@ -501,12 +501,52 @@ melde("=== 10. Die Liste ==="); ok(!l.liste.some((p) => p.name === "Tili"), "ein Creator steht nicht darin"); ok(!l.liste.some((p) => p.name === "Filipe"), "DogFather auch nicht"); - /* NACH NAMEN SORTIERT, NICHT NACH AKTIVITÄT. Eine Liste, die die mit - der meisten Bewegung nach oben stellt, ist eine Rangliste mit einem - anderen Namen. */ - const namen = l.liste.map((p) => p.name); - ok(namen.join(",") === [...namen].sort((a, b) => a.localeCompare(b, "de")).join(","), - `alphabetisch (${namen.join(", ")})`); + /* NACH ROLLE, DANN NACH NAMEN -- UND NICHT NACH AKTIVITAET + (nachgezogen 21.09.2026). + + Hier stand "alphabetisch", und die Zeile war rot: Die Liste kam + als "Rieke, Diene" zurueck, also nicht alphabetisch. Nachgesehen + war das kein Mangel, sondern eine Entscheidung vom 19.09.2026. + + Filipe damals: "die reihenfolge der listen soll immer angepasst + sein hatten wir doch schon. die rechte hand rolle immer zuerst + und dan die modis." + + Der Server sortiert seitdem nach `ROLLEN_SORTIERUNG`, dann nach + Namen. Die Pruefung ist zwei Tage lang rot gewesen, weil sie die + alte Regel weiter verlangt hat -- und eine rote Zeile, die rot + bleibt, bringt Menschen dazu, Rot zu ueberlesen. + + WAS BLEIBT, IST DIE EIGENTLICHE AUSSAGE: Sortiert wird nach etwas, + das nichts ueber die Person sagt. Eine Liste, die die mit der + meisten Bewegung nach oben stellt, waere eine Rangliste mit einem + anderen Namen. Eine Sortierung nach ROLLE ist das nicht -- sie + sagt nur, welche Aufgabe jemand hat. + + ABGELEITET, NICHT ABGESCHRIEBEN: Die Reihenfolge kommt aus + derselben Konstante, die der Server benutzt. Wer dort eine Rolle + verschiebt, verschiebt sie hier mit -- und diese Zeile wird nicht + wieder rot, ohne dass etwas kaputt ist. */ + const { ROLLEN_REIHE } = await import("./workspace.js"); + const platz = (r) => { + const i = ROLLEN_REIHE.indexOf(r); + return i === -1 ? ROLLEN_REIHE.length : i; + }; + const soll = [...l.liste].sort((a, b) => + platz(a.rolle) - platz(b.rolle) || a.name.localeCompare(b.name, "de")); + const ist = l.liste.map((p) => `${p.rolle}:${p.name}`).join(", "); + ok(ist === soll.map((p) => `${p.rolle}:${p.name}`).join(", "), + `nach Rolle, dann nach Namen (${ist})`); + + /* GEGENPROBE: Dass die Liste ueberhaupt MEHRERE Rollen enthaelt -- + sonst waere "nach Rolle sortiert" bei einer einzigen Rolle + trivial wahr, und die Zeile darueber pruefte nur noch die + Namenssortierung. */ + ok(new Set(l.liste.map((p) => p.rolle)).size >= 2, + `und es sind wirklich mehrere Rollen darin ` + + `(${[...new Set(l.liste.map((p) => p.rolle))].join(", ")})`); + + ok(/kein vergleich/i.test(l.hinweis || ""), "und die Seite sagt selbst, dass sie niemanden vergleicht"); @@ -596,18 +636,84 @@ melde("=== 11. Im Browser ==="); name: document.getElementById('karte-name')?.textContent || '', balken: document.querySelectorAll('.w-bewegung__balken').length, zellen: document.querySelectorAll('.w-streifen__zelle').length, + /* GETRENNT NACH GESETZT UND LEER (21.09.2026). Vorher wurde + verlangt, dass JEDE Zelle Text traegt -- auch die leeren. Seit + dem 19.09. sind die aber absichtlich leer. */ + zellenMitStufe: [...document.querySelectorAll('.w-streifen__zelle')] + .filter((z) => z.dataset.stufe && z.dataset.stufe !== 'leer').length, zeichenInZellen: [...document.querySelectorAll('.w-streifen__zelle')] + .filter((z) => z.dataset.stufe && z.dataset.stufe !== 'leer') .every((z) => (z.textContent || '').trim().length > 0), + leereMitZeichen: [...document.querySelectorAll('.w-streifen__zelle')] + .filter((z) => z.dataset.stufe === 'leer' + && (z.textContent || '').trim().length > 0).length, legende: document.querySelectorAll('.w-legende__punkt').length, + legendeStreifen: [...document.querySelectorAll( + '.w-legende--streifen .w-legende__zeichen')].map((z) => z.dataset.stufe), texte: document.querySelectorAll('.w-text').length, breiter: document.documentElement.scrollWidth > document.documentElement.clientWidth, })); ok(/Diene|Rieke/.test(karte.name), `eine Karte öffnet sich (${karte.name})`); ok(karte.zellen > 0, `der Streifen ist gezeichnet (${karte.zellen} Zellen)`); - /* DIE FARBE IST NIE DIE AUSKUNFT. Jede Zelle trägt ihr Zeichen als - Text -- wer Farben schlecht unterscheidet, liest dasselbe. */ - ok(karte.zeichenInZellen, "jede Zelle trägt ihr Zeichen, nicht nur ihre Farbe"); - ok(karte.legende === 2, `unter dem Diagramm steht eine Legende (${karte.legende} Einträge)`); + /* DIE FARBE IST NIE DIE AUSKUNFT. Jede Zelle MIT EINER STUFE traegt + ihr Zeichen als Text -- wer Farben schlecht unterscheidet, liest + dasselbe. + + BIS ZUM 21.09.2026 STAND HIER "jede Zelle", ohne Unterschied. + Seit dem 19.09. sind leere Zellen aber absichtlich leer; im + Quelltext steht woertlich: "Leer ist jetzt WIRKLICH leer -- kein + Zeichen, dafuer ein gestrichelter Rahmen. Man sieht das Fehlen, + statt es zu lesen." Die Pruefung verlangte also das Gegenteil + einer Entscheidung und war deshalb rot. + + Beide Haelften werden jetzt gemessen, und die zweite ist die + wichtigere: Stuende in einer leeren Zelle doch ein Zeichen, waere + "noch nichts gesetzt" nicht mehr von "gesetzt" zu unterscheiden -- + und das faellt beim Hinsehen nicht auf, weil es nach Inhalt + aussieht. */ + ok(karte.zellenMitStufe > 0, + `${karte.zellenMitStufe} Zellen tragen eine Stufe`); + ok(karte.zeichenInZellen, + "und jede davon ihr Zeichen, nicht nur ihre Farbe"); + ok(karte.leereMitZeichen === 0, + `die leeren bleiben leer (${karte.leereMitZeichen} mit Zeichen)`); + + /* DIE LEGENDE WIRD ABGELEITET, NICHT GEZAEHLT (21.09.2026). + + Hier stand `karte.legende === 2`. Die Zahl stimmte, solange es + zwei Eintraege gab; inzwischen sind es sieben -- zwei fuer die + Bewegungsrichtung und fuenf fuer den Streifen (vier Stufen plus + "noch nichts gesetzt"). Wieder eine Rechnung von gestern. + + Gefragt wird jetzt, was die Legende leisten muss: Zu JEDER Stufe, + die der Server kennt, gehoert ein Eintrag -- und einer fuer den + leeren Zustand. Kommt eine Stufe dazu, waechst die Erwartung von + selbst mit. Die Stufen kommen aus derselben Auskunft, aus der die + Seite sie baut; abgeschrieben waere sie die naechste Zahl von + gestern. */ + /* DIE STUFEN WERDEN HIER NEU GEHOLT und nicht aus Abschnitt 10 + mitgenommen: Jener Block hat seinen eigenen Geltungsbereich, und + eine Variable von dort waere hier schlicht nicht da. Beim ersten + Versuch war genau das der Fall -- die Pruefung brach mitten im + Browserteil ab, ohne Ergebnis. */ + /* DIE STUFEN STEHEN AN DER EINZELNEN KARTE, nicht an der Liste -- + nachgesehen in workspace-werdegang.js, nicht angenommen. Der + erste Versuch fragte die Liste und bekam null Stufen; gefangen + hat das die Zeile darunter, die die Zahl in der Bedingung hat. */ + const wenListe = json(await ruf("/workspace/api/werdegang/liste", CREW, "GET", { cookie: kDogi })); + const wessen = wenListe.liste?.[0]?.id; + const fuerLegende = json(await ruf( + `/workspace/api/werdegang/person/${wessen}`, CREW, "GET", { cookie: kDogi })); + const stufenSoll = (fuerLegende.stufen || []).map((x) => x.schluessel); + ok(stufenSoll.length > 0, + `der Server kennt ${stufenSoll.length} Stufen (${stufenSoll.join(", ")})`); + const legendeSoll = [...stufenSoll, "leer"].join(","); + ok((karte.legendeStreifen || []).join(",") === legendeSoll, + `die Legende nennt jede davon und den leeren Zustand ` + + `(${(karte.legendeStreifen || []).join(", ") || "KEINE"})`); + ok(karte.legende === stufenSoll.length + 1 + 2, + `insgesamt ${karte.legende} Eintraege -- ${stufenSoll.length} Stufen, ` + + "der leere Zustand und zwei fuer die Bewegungsrichtung"); ok(karte.texte > 0, `und die Texte dazu (${karte.texte})`); ok(!karte.breiter, "nichts steht über den rechten Rand hinaus");