import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; import { createEmptyProject, createSignalGroup } from '@/domain/model/factory'; import type { Project } from '@/domain/model/project'; import { einstreifigBefunde } from '@/domain/validation/rules'; /* * Fassung 5.10.0 - eine Zusage im Docblock, die nicht mehr * gilt. * * Der Abschnitt "SO WEIT UND NICHT WEITER" im Docblock von * `erfassteVerkehrsstaerke` (domain/plan/signalPlan.ts) zaehlt auf, wer die * Lesart "volume <= 0 heisst: keine Angabe" NICHT teilt. Er nannte dafuer drei * Stellen: die Anordnungskriterien der RSA 21, die Planunterlage und die * Tabellenausgabe. Die beiden Ausgaben sind seit der Fassung 5.10.0 * nachgezogen - der Ausdruck setzt einen Gedankenstrich, die Tabellenausgabe * laesst die Zelle leer. Ein Kommentar, der eine behobene Lage als bestehend * beschreibt, schickt den naechsten Leser auf die Suche nach einem Mangel, den * es nicht mehr gibt. * * Diese Datei bindet den Abschnitt an das, was gilt: Was er noch behauptet, * wird nachgerechnet; was er nicht mehr behaupten darf, steht nicht darin. Was * die Ausgaben wirklich drucken, bewacht * tests/export/verkehrsstaerkeNull.test.ts - hier wird es nicht ein * zweites Mal geprueft. */ const QUELLE = readFileSync('src/domain/plan/signalPlan.ts', 'utf8'); /** Der Docblock von `erfassteVerkehrsstaerke`, ohne den Rest der Datei. */ const DOCBLOCK = QUELLE.slice( QUELLE.indexOf('Die erfasste Verkehrsstaerke eines Stroms'), QUELLE.indexOf('function erfassteVerkehrsstaerke'), ); const DATUM = new Date('2026-01-01T00:00:00Z'); /** Eine einstreifige Verkehrsfuehrung mit einem Datensatz ueber 0 Kfz/h. */ function mitDatensatzOhneZaehlung(): Project { const basis = createEmptyProject('Engstelle', DATUM, 'einstreifig'); const gruppe = createSignalGroup({ name: 'K1', mode: 'kfz', index: 0 }); return { ...basis, signalGroups: [gruppe], demands: [{ signalGroupId: gruppe.id, volume: 0, heavyVehicleShare: 0.05 }], }; } describe('Der Vorbehalt im Docblock nennt nur noch, was wirklich abweicht', () => { it('findet den Abschnitt', () => { expect(DOCBLOCK, 'Fundstelle des Docblocks').not.toBe(''); expect(DOCBLOCK).toContain('SO WEIT UND NICHT WEITER'); }); it('behauptet nicht mehr, die Ausgaben druckten "0 Fz/h"', () => { const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER')); // Der Satz in der Gegenwartsform - er sagte, die Ausgaben taeten es noch. expect(vorbehalt).not.toMatch(/geben die\s+\*?\s*Spalte Verkehrsstaerke unveraendert/); // Und die Klammer, die beide Ausgaben zusammen als offene Stelle fuehrte. expect(vorbehalt).not.toContain('Beides liegt ausserhalb dieser Behebung'); }); it('sagt stattdessen, dass die Ausgaben nachgezogen sind', () => { // Beide Stellen namentlich: Wer den Vorbehalt liest, soll nachsehen // koennen, statt der Behauptung glauben zu muessen. const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER')); expect(vorbehalt).toContain('NACHGEZOGEN'); expect(vorbehalt).toContain('services/export/pdf.ts'); expect(vorbehalt).toContain('services/export/csv.ts'); }); it('nennt die Anordnungskriterien weiter - und die halten es wirklich so', () => { const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER')); expect(vorbehalt).toContain('einstreifigBefunde'); expect(vorbehalt).toContain('zusammen 0 Kfz/h'); const befunde = einstreifigBefunde(mitDatensatzOhneZaehlung()); const kriterien = befunde.find((b) => b.rule === 'einstreifig.rsa-anordnungskriterien'); expect(kriterien, 'Vorbedingung: die Anordnungskriterien werden gemeldet').toBeDefined(); expect( kriterien?.message, 'Der Datensatz mit volume 0 zaehlt dort weiter als erfasste Verkehrsstaerke', ).toContain('zusammen 0 Kfz/h'); expect(kriterien?.message).not.toContain('Verkehrsstärken sind nicht erfasst'); }); });