lsa-planer

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

/ tests export ueberfahrzeitHerkunft.test.ts

3,0 KB Rohdatei
tests/export/ueberfahrzeitHerkunft.test.ts — 70 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { intergreenDetailCsv } from '@/services/export/csv';
3 import { buildSignalPlan } from '@/domain/plan/signalPlan';
4 import { createStandardIntersectionProject } from '@/domain/model/factory';
5 import type { Project } from '@/domain/model/project';
6
7 /**
8 * Befund 58 - zweite Aufrufstelle.
9 *
10 * Im Fachkern entscheidet `ueberfahrzeitHerkunft` seit Befund 58 an
11 * `vorgabewert` und `angesetzt`, ob eine Handeingabe uebernommen oder
12 * verworfen wurde. `conflictsView.ts` gibt beide Angaben mit, die
13 * Tabellenausgabe rief bis hierher nur mit `haltVorKnoten` und `vorgegeben`
14 * auf - und wies eine VERWORFENE Handeingabe weiter als "an dieser Beziehung
15 * von Hand eingetragen" aus, obwohl daneben die Gelbzeit stand.
16 */
17
18 const STICHTAG = new Date('2026-01-01T12:00:00Z');
19
20 /** Zeilen der Zwischenzeit-Tabellenausgabe als Spaltenfelder. */
21 function tabelle(project: Project): { kopf: string[]; zeilen: string[][] } {
22 const csv = intergreenDetailCsv(project, buildSignalPlan(project));
23 const [kopfzeile, ...rest] = csv.split('\r\n');
24 const zerlege = (zeile: string): string[] =>
25 (zeile.match(/("([^"]|"")*"|[^;]*)(;|$)/g) ?? []).map((feld) =>
26 feld.replace(/;$/, '').replace(/^"|"$/g, '').replace(/""/g, '"'),
27 );
28 return {
29 kopf: zerlege((kopfzeile ?? '').replace(/^/, '')),
30 zeilen: rest.filter((z) => z.length > 0).map(zerlege),
31 };
32 }
33
34 /** Vorlage mit einer Ueberfahrzeit-Handeingabe an der ersten Beziehung. */
35 function mitHandeingabe(wert: number): Project {
36 const basis = createStandardIntersectionProject('Handeingabe', STICHTAG);
37 return {
38 ...basis,
39 conflicts: basis.conflicts.map((c, i) => (i === 0 ? { ...c, crossingTimeOverride: wert } : c)),
40 };
41 }
42
43 /** Die Zelle "Überfahrzeit-Herkunft" der ersten Beziehung. */
44 function herkunftsZelle(project: Project): string {
45 const { kopf, zeilen } = tabelle(project);
46 const spalte = kopf.indexOf('Überfahrzeit-Herkunft');
47 expect(spalte, 'Die Spalte fehlt').toBeGreaterThanOrEqual(0);
48 const erste = project.conflicts[0]!;
49 const von = project.signalGroups.find((g) => g.id === erste.fromId)!;
50 const nach = project.signalGroups.find((g) => g.id === erste.toId)!;
51 const zeile = zeilen.find((z) => z[0] === von.name && z[1] === nach.name)!;
52 return zeile[spalte] ?? '';
53 }
54
55 describe('Die Tabellenausgabe weist eine verworfene Ueberfahrzeit als verworfen aus', () => {
56 it('nennt bei crossingTimeOverride 0 und vZul 50 km/h die Eingabe verworfen', () => {
57 // 0 s liegt unter der Gelbzeit von 3 s bei 50 km/h; resolveCrossingTime
58 // verwirft die Eingabe und rechnet mit 3 s weiter.
59 const project = mitHandeingabe(0);
60 const zelle = herkunftsZelle(project);
61 expect(zelle).toContain('verworfen');
62 expect(zelle).not.toContain('von Hand eingetragen');
63 });
64
65 it('nennt eine uebernommene Handeingabe weiterhin als Handeingabe', () => {
66 // 4 s liegt ueber der Gelbzeit von 3 s und wird angesetzt.
67 const zelle = herkunftsZelle(mitHandeingabe(4));
68 expect(zelle).toBe('an dieser Beziehung von Hand eingetragen');
69 });
70 });