lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ tests domain verkehrsstaerkezusage.test.ts

3,9 KB Rohdatei
tests/domain/verkehrsstaerkezusage.test.ts — 89 Zeilen
1 import { readFileSync } from 'node:fs';
2 import { describe, expect, it } from 'vitest';
3 import { createEmptyProject, createSignalGroup } from '@/domain/model/factory';
4 import type { Project } from '@/domain/model/project';
5 import { einstreifigBefunde } from '@/domain/validation/rules';
6
7 /*
8 * Fassung 5.10.0 - eine Zusage im Docblock, die nicht mehr
9 * gilt.
10 *
11 * Der Abschnitt "SO WEIT UND NICHT WEITER" im Docblock von
12 * `erfassteVerkehrsstaerke` (domain/plan/signalPlan.ts) zaehlt auf, wer die
13 * Lesart "volume <= 0 heisst: keine Angabe" NICHT teilt. Er nannte dafuer drei
14 * Stellen: die Anordnungskriterien der RSA 21, die Planunterlage und die
15 * Tabellenausgabe. Die beiden Ausgaben sind seit der Fassung 5.10.0
16 * nachgezogen - der Ausdruck setzt einen Gedankenstrich, die Tabellenausgabe
17 * laesst die Zelle leer. Ein Kommentar, der eine behobene Lage als bestehend
18 * beschreibt, schickt den naechsten Leser auf die Suche nach einem Mangel, den
19 * es nicht mehr gibt.
20 *
21 * Diese Datei bindet den Abschnitt an das, was gilt: Was er noch behauptet,
22 * wird nachgerechnet; was er nicht mehr behaupten darf, steht nicht darin. Was
23 * die Ausgaben wirklich drucken, bewacht
24 * tests/export/verkehrsstaerkeNull.test.ts - hier wird es nicht ein
25 * zweites Mal geprueft.
26 */
27
28 const QUELLE = readFileSync('src/domain/plan/signalPlan.ts', 'utf8');
29
30 /** Der Docblock von `erfassteVerkehrsstaerke`, ohne den Rest der Datei. */
31 const DOCBLOCK = QUELLE.slice(
32 QUELLE.indexOf('Die erfasste Verkehrsstaerke eines Stroms'),
33 QUELLE.indexOf('function erfassteVerkehrsstaerke'),
34 );
35
36 const DATUM = new Date('2026-01-01T00:00:00Z');
37
38 /** Eine einstreifige Verkehrsfuehrung mit einem Datensatz ueber 0 Kfz/h. */
39 function mitDatensatzOhneZaehlung(): Project {
40 const basis = createEmptyProject('Engstelle', DATUM, 'einstreifig');
41 const gruppe = createSignalGroup({ name: 'K1', mode: 'kfz', index: 0 });
42 return {
43 ...basis,
44 signalGroups: [gruppe],
45 demands: [{ signalGroupId: gruppe.id, volume: 0, heavyVehicleShare: 0.05 }],
46 };
47 }
48
49 describe('Der Vorbehalt im Docblock nennt nur noch, was wirklich abweicht', () => {
50 it('findet den Abschnitt', () => {
51 expect(DOCBLOCK, 'Fundstelle des Docblocks').not.toBe('');
52 expect(DOCBLOCK).toContain('SO WEIT UND NICHT WEITER');
53 });
54
55 it('behauptet nicht mehr, die Ausgaben druckten "0 Fz/h"', () => {
56 const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER'));
57
58 // Der Satz in der Gegenwartsform - er sagte, die Ausgaben taeten es noch.
59 expect(vorbehalt).not.toMatch(/geben die\s+\*?\s*Spalte Verkehrsstaerke unveraendert/);
60 // Und die Klammer, die beide Ausgaben zusammen als offene Stelle fuehrte.
61 expect(vorbehalt).not.toContain('Beides liegt ausserhalb dieser Behebung');
62 });
63
64 it('sagt stattdessen, dass die Ausgaben nachgezogen sind', () => {
65 // Beide Stellen namentlich: Wer den Vorbehalt liest, soll nachsehen
66 // koennen, statt der Behauptung glauben zu muessen.
67 const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER'));
68
69 expect(vorbehalt).toContain('NACHGEZOGEN');
70 expect(vorbehalt).toContain('services/export/pdf.ts');
71 expect(vorbehalt).toContain('services/export/csv.ts');
72 });
73
74 it('nennt die Anordnungskriterien weiter - und die halten es wirklich so', () => {
75 const vorbehalt = DOCBLOCK.slice(DOCBLOCK.indexOf('SO WEIT UND NICHT WEITER'));
76 expect(vorbehalt).toContain('einstreifigBefunde');
77 expect(vorbehalt).toContain('zusammen 0 Kfz/h');
78
79 const befunde = einstreifigBefunde(mitDatensatzOhneZaehlung());
80 const kriterien = befunde.find((b) => b.rule === 'einstreifig.rsa-anordnungskriterien');
81
82 expect(kriterien, 'Vorbedingung: die Anordnungskriterien werden gemeldet').toBeDefined();
83 expect(
84 kriterien?.message,
85 'Der Datensatz mit volume 0 zaehlt dort weiter als erfasste Verkehrsstaerke',
86 ).toContain('zusammen 0 Kfz/h');
87 expect(kriterien?.message).not.toContain('Verkehrsstärken sind nicht erfasst');
88 });
89 });