import { describe, expect, it } from 'vitest'; import { parseProject } from '@/domain/model/schema'; /* * Befund 47, behoben in Fassung 5.10.0 - der offen gebliebene Nachbarfall * zu Befund 34. * * Die Kennung wird erst NACH der Verwerfensprüfung vergeben, damit eine * Haltlinie ohne Ausdehnung die Kennung einer verbliebenen nicht entwertet. * Steht die entartete Haltlinie aber ZUERST, landete ihre Kennung nirgends: * Eine spaetere Haltlinie mit derselben Kennung behielt sie ohne Meldung, die * Fahrlinien der verworfenen galten anschliessend als zugeordnet - naemlich zu * einer fremden Haltlinie an ganz anderer Stelle -, und `normalisiere` zog * ihren ersten Punkt dorthin. Die Zeichnung veraenderte sich beim blossen * Oeffnen, und Raeum- und Einfahrweg wurden ab einem falschen Nullpunkt * gemessen. Die Verwerfensmeldung sagte dabei die Unwahrheit: Die Fahrlinien * WAREN zugeordnet, nur der falschen Haltlinie. */ const DATUM = new Date('2026-09-05T08:00:00Z'); function datei(haltlinien: readonly unknown[]): Record { return { lageplan: { haltlinien, linien: [ { id: 'pl-1', name: 'Nord geradeaus', mode: 'kfz', movement: 'geradeaus', punkte: [ { x: 10, y: 10 }, { x: 10, y: 400 }, ], haltlinieId: 'hl-1', startT: 0.5, }, ], }, }; } const ENTARTET = { id: 'hl-1', name: 'Entartet', art: 'zufahrt', von: { x: 10, y: 10 }, bis: { x: 10, y: 10 }, }; const FREMD = { id: 'hl-1', name: 'Süd', art: 'zufahrt', von: { x: 200, y: 400 }, bis: { x: 260, y: 400 }, }; describe('Befund 47: Kennung einer verworfenen Haltlinie', () => { it('meldet die zweite Beanspruchung derselben Kennung und vergibt sie neu', () => { const { project, issues } = parseProject(datei([ENTARTET, FREMD]), DATUM); expect(project.lageplan.haltlinien).toHaveLength(1); expect(project.lageplan.haltlinien[0]!.id).not.toBe('hl-1'); expect(issues.some((i) => i.message.includes('Doppelte Haltlinienkennung "hl-1"'))).toBe(true); }); it('loest den Verweis der Fahrlinie, statt ihn auf die fremde Haltlinie umzuhaengen', () => { const { project, issues } = parseProject(datei([ENTARTET, FREMD]), DATUM); const linie = project.lageplan.linien[0]!; expect(linie.haltlinieId).toBeNull(); expect( issues.some( (i) => i.path === 'lageplan.linien[0].haltlinieId' && i.message.includes('mehrfach vergebene Haltlinienkennung'), ), ).toBe(true); // Die Zeichnung bleibt, wie der Bearbeiter sie angelegt hat. expect(linie.punkte[0]).toEqual({ x: 10, y: 10 }); }); it('laesst die verbliebene Haltlinie unangetastet, wenn nur die zweite entartet ist', () => { // Der begruendete Fall aus Befund 34: Die gueltige Haltlinie steht zuerst, // ihre Kennung darf eine spaeter verworfene nicht entwerten. const gueltig = { id: 'hl-1', name: 'Nord', art: 'zufahrt', von: { x: 0, y: 0 }, bis: { x: 40, y: 0 }, }; const { project } = parseProject(datei([gueltig, ENTARTET]), DATUM); expect(project.lageplan.haltlinien.map((h) => h.id)).toEqual(['hl-1']); expect(project.lageplan.linien[0]!.haltlinieId).toBe('hl-1'); }); it('loest den Verweis auch dann, wenn die verworfene Haltlinie die einzige bleibt', () => { const { project, issues } = parseProject(datei([ENTARTET]), DATUM); expect(project.lageplan.haltlinien).toHaveLength(0); expect(project.lageplan.linien[0]!.haltlinieId).toBeNull(); expect(issues.some((i) => i.message.includes('nicht vorhandene Haltlinie'))).toBe(true); }); });