lsa-planer

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

/ tests domain wegnachweisKappung.test.ts

5,3 KB Rohdatei
tests/domain/wegnachweisKappung.test.ts — 148 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { parseProject } from '@/domain/model/schema';
3
4 /*
5 * Befund 11, behoben in Fassung 5.9.0.
6 *
7 * parseConflicts begrenzt Raeum- und Einfahrweg auf die Grenze der Anlagenart
8 * und uebernimmt den Herkunftsnachweis danach unveraendert. Steht in der Datei
9 * "lageplan" mit Uebernahmedatum, weist der Ausdruck die vom Programm erzeugte
10 * Zahl weiterhin als "Aus dem Lageplan vermessen" aus. Genau dagegen wurde
11 * Schema 8 eingefuehrt; die Meldung ueber die Kappung erscheint einmalig beim
12 * Oeffnen, die falsche Herkunftsangabe steht dauerhaft in Datei und Ausdruck.
13 */
14 describe('Herkunftsnachweis nach der Kappung des Weges', () => {
15 const zweiGruppen = [
16 { id: 'a', name: 'K1', mode: 'kfz' },
17 { id: 'b', name: 'K2', mode: 'kfz' },
18 ];
19
20 it('entwertet den Nachweis auf "unbestimmt", wenn die Schemapruefung den Raeumweg selbst gekuerzt hat', () => {
21 const { project, issues } = parseProject({
22 anlagenart: 'fussgaengerschutzanlage',
23 signalGroups: zweiGruppen,
24 conflicts: [
25 {
26 fromId: 'a',
27 toId: 'b',
28 clearingDistance: 400,
29 enteringDistance: 10,
30 wegnachweis: { herkunft: 'lageplan', uebernommenAm: '2026-02-02T09:00:00.000Z' },
31 },
32 ],
33 });
34
35 expect(project.conflicts[0]!.clearingDistance).toBe(100);
36 expect(project.conflicts[0]!.wegnachweis).toEqual({
37 herkunft: 'unbestimmt',
38 uebernommenAm: null,
39 });
40 expect(
41 issues.some((i) => i.path === 'conflicts[0].wegnachweis' && i.severity === 'warnung'),
42 ).toBe(true);
43 });
44
45 it('entwertet den Nachweis auch, wenn nur der Einfahrweg gekuerzt wurde', () => {
46 const { project } = parseProject({
47 anlagenart: 'fussgaengerschutzanlage',
48 signalGroups: zweiGruppen,
49 conflicts: [
50 {
51 fromId: 'a',
52 toId: 'b',
53 clearingDistance: 20,
54 enteringDistance: 400,
55 wegnachweis: { herkunft: 'lageplan', uebernommenAm: '2026-02-02T09:00:00.000Z' },
56 },
57 ],
58 });
59
60 expect(project.conflicts[0]!.enteringDistance).toBe(100);
61 expect(project.conflicts[0]!.wegnachweis.herkunft).toBe('unbestimmt');
62 });
63
64 it('entwertet den Nachweis auch, wenn der eingetragene Weg unlesbar war und das Schema 0 eingesetzt hat', () => {
65 const { project, issues } = parseProject({
66 anlagenart: 'fussgaengerschutzanlage',
67 signalGroups: zweiGruppen,
68 conflicts: [
69 {
70 fromId: 'a',
71 toId: 'b',
72 clearingDistance: '40 m',
73 enteringDistance: 10,
74 wegnachweis: { herkunft: 'lageplan', uebernommenAm: '2026-02-02T09:00:00.000Z' },
75 },
76 ],
77 });
78
79 // Die 0 hat das Programm eingesetzt, nicht der Bearbeiter und kein
80 // Lageplan. Bliebe der Nachweis stehen, bescheinigte der Ausdruck "Aus dem
81 // Lageplan vermessen (02.02.2026)" ueber einem Raeumweg von 0 m.
82 expect(project.conflicts[0]!.clearingDistance).toBe(0);
83 expect(project.conflicts[0]!.wegnachweis).toEqual({
84 herkunft: 'unbestimmt',
85 uebernommenAm: null,
86 });
87 expect(
88 issues.some((i) => i.path === 'conflicts[0].wegnachweis' && i.severity === 'warnung'),
89 ).toBe(true);
90 });
91
92 it('laesst einen ungekuerzten Nachweis samt Uebernahmedatum unangetastet', () => {
93 const { project, issues } = parseProject({
94 anlagenart: 'fussgaengerschutzanlage',
95 signalGroups: zweiGruppen,
96 conflicts: [
97 {
98 fromId: 'a',
99 toId: 'b',
100 clearingDistance: 40,
101 enteringDistance: 10,
102 wegnachweis: { herkunft: 'lageplan', uebernommenAm: '2026-02-02T09:00:00.000Z' },
103 },
104 ],
105 });
106
107 expect(project.conflicts[0]!.clearingDistance).toBe(40);
108 expect(project.conflicts[0]!.wegnachweis).toEqual({
109 herkunft: 'lageplan',
110 uebernommenAm: '2026-02-02T09:00:00.000Z',
111 });
112 expect(issues.filter((i) => i.path.startsWith('conflicts'))).toEqual([]);
113 });
114
115 it('laesst den Nachweis stehen, wenn ein Wegfeld gar nicht in der Datei steht', () => {
116 // Ein FEHLENDER Eintrag ist keine Unlesbarkeit - dieselbe Regel wie bei
117 // `boolGemeldet`. Das Schema hat dort nichts geaendert, es stand nur nichts
118 // da; eine Entwertung waere eine Meldung ueber ein Feld, das niemand
119 // geschrieben hat.
120 const { project, issues } = parseProject({
121 anlagenart: 'fussgaengerschutzanlage',
122 signalGroups: zweiGruppen,
123 conflicts: [
124 {
125 fromId: 'a',
126 toId: 'b',
127 clearingDistance: 40,
128 wegnachweis: { herkunft: 'lageplan', uebernommenAm: '2026-02-02T09:00:00.000Z' },
129 },
130 ],
131 });
132
133 expect(project.conflicts[0]!.enteringDistance).toBe(0);
134 expect(project.conflicts[0]!.wegnachweis.herkunft).toBe('lageplan');
135 expect(issues.filter((i) => i.path.includes('wegnachweis'))).toEqual([]);
136 });
137
138 it('meldet bei einem gekuerzten Weg ohne Nachweis keine zweite Entwertung', () => {
139 const { project, issues } = parseProject({
140 anlagenart: 'fussgaengerschutzanlage',
141 signalGroups: zweiGruppen,
142 conflicts: [{ fromId: 'a', toId: 'b', clearingDistance: 400, enteringDistance: 10 }],
143 });
144
145 expect(project.conflicts[0]!.wegnachweis.herkunft).toBe('unbestimmt');
146 expect(issues.filter((i) => i.path.includes('wegnachweis'))).toEqual([]);
147 });
148 });