lsa-planer

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

/ tests domain haltlinieVerworfen.test.ts

3,6 KB Rohdatei
tests/domain/haltlinieVerworfen.test.ts — 108 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import { parseProject } from '@/domain/model/schema';
3
4 /*
5 * Befund 47, behoben in Fassung 5.10.0 - der offen gebliebene Nachbarfall
6 * zu Befund 34.
7 *
8 * Die Kennung wird erst NACH der Verwerfensprüfung vergeben, damit eine
9 * Haltlinie ohne Ausdehnung die Kennung einer verbliebenen nicht entwertet.
10 * Steht die entartete Haltlinie aber ZUERST, landete ihre Kennung nirgends:
11 * Eine spaetere Haltlinie mit derselben Kennung behielt sie ohne Meldung, die
12 * Fahrlinien der verworfenen galten anschliessend als zugeordnet - naemlich zu
13 * einer fremden Haltlinie an ganz anderer Stelle -, und `normalisiere` zog
14 * ihren ersten Punkt dorthin. Die Zeichnung veraenderte sich beim blossen
15 * Oeffnen, und Raeum- und Einfahrweg wurden ab einem falschen Nullpunkt
16 * gemessen. Die Verwerfensmeldung sagte dabei die Unwahrheit: Die Fahrlinien
17 * WAREN zugeordnet, nur der falschen Haltlinie.
18 */
19 const DATUM = new Date('2026-09-05T08:00:00Z');
20
21 function datei(haltlinien: readonly unknown[]): Record<string, unknown> {
22 return {
23 lageplan: {
24 haltlinien,
25 linien: [
26 {
27 id: 'pl-1',
28 name: 'Nord geradeaus',
29 mode: 'kfz',
30 movement: 'geradeaus',
31 punkte: [
32 { x: 10, y: 10 },
33 { x: 10, y: 400 },
34 ],
35 haltlinieId: 'hl-1',
36 startT: 0.5,
37 },
38 ],
39 },
40 };
41 }
42
43 const ENTARTET = {
44 id: 'hl-1',
45 name: 'Entartet',
46 art: 'zufahrt',
47 von: { x: 10, y: 10 },
48 bis: { x: 10, y: 10 },
49 };
50
51 const FREMD = {
52 id: 'hl-1',
53 name: 'Süd',
54 art: 'zufahrt',
55 von: { x: 200, y: 400 },
56 bis: { x: 260, y: 400 },
57 };
58
59 describe('Befund 47: Kennung einer verworfenen Haltlinie', () => {
60 it('meldet die zweite Beanspruchung derselben Kennung und vergibt sie neu', () => {
61 const { project, issues } = parseProject(datei([ENTARTET, FREMD]), DATUM);
62
63 expect(project.lageplan.haltlinien).toHaveLength(1);
64 expect(project.lageplan.haltlinien[0]!.id).not.toBe('hl-1');
65 expect(issues.some((i) => i.message.includes('Doppelte Haltlinienkennung "hl-1"'))).toBe(true);
66 });
67
68 it('loest den Verweis der Fahrlinie, statt ihn auf die fremde Haltlinie umzuhaengen', () => {
69 const { project, issues } = parseProject(datei([ENTARTET, FREMD]), DATUM);
70 const linie = project.lageplan.linien[0]!;
71
72 expect(linie.haltlinieId).toBeNull();
73 expect(
74 issues.some(
75 (i) =>
76 i.path === 'lageplan.linien[0].haltlinieId' &&
77 i.message.includes('mehrfach vergebene Haltlinienkennung'),
78 ),
79 ).toBe(true);
80
81 // Die Zeichnung bleibt, wie der Bearbeiter sie angelegt hat.
82 expect(linie.punkte[0]).toEqual({ x: 10, y: 10 });
83 });
84
85 it('laesst die verbliebene Haltlinie unangetastet, wenn nur die zweite entartet ist', () => {
86 // Der begruendete Fall aus Befund 34: Die gueltige Haltlinie steht zuerst,
87 // ihre Kennung darf eine spaeter verworfene nicht entwerten.
88 const gueltig = {
89 id: 'hl-1',
90 name: 'Nord',
91 art: 'zufahrt',
92 von: { x: 0, y: 0 },
93 bis: { x: 40, y: 0 },
94 };
95 const { project } = parseProject(datei([gueltig, ENTARTET]), DATUM);
96
97 expect(project.lageplan.haltlinien.map((h) => h.id)).toEqual(['hl-1']);
98 expect(project.lageplan.linien[0]!.haltlinieId).toBe('hl-1');
99 });
100
101 it('loest den Verweis auch dann, wenn die verworfene Haltlinie die einzige bleibt', () => {
102 const { project, issues } = parseProject(datei([ENTARTET]), DATUM);
103
104 expect(project.lageplan.haltlinien).toHaveLength(0);
105 expect(project.lageplan.linien[0]!.haltlinieId).toBeNull();
106 expect(issues.some((i) => i.message.includes('nicht vorhandene Haltlinie'))).toBe(true);
107 });
108 });