import { describe, expect, it } from 'vitest'; import { parseProject } from '@/domain/model/schema'; /* * Befund 34, behoben in Fassung 5.9.0. * * Eine doppelte Haltlinienkennung wurde stumm neu vergeben. Die Fahrlinien der * zweiten Haltlinie behielten ihren Verweis und zeigten danach auf die ERSTE * Haltlinie, die die Kennung behalten hatte; `normalisiere` zog ihren ersten * Punkt auf diese fremde Haltlinie. Die Zeichnung veraenderte sich beim blossen * Oeffnen, und die daraus abgeleiteten Raeum- und Einfahrwege stimmten nicht * mehr. */ describe('Doppelte Haltlinienkennungen beim Einlesen', () => { const lageplanMitDoppelterKennung = { haltlinien: [ { id: 'hl-doppelt', name: 'Nord', art: 'zufahrt', von: { x: 0, y: 0 }, bis: { x: 40, y: 0 } }, { id: 'hl-doppelt', name: 'Süd', art: 'zufahrt', von: { x: 0, y: 900 }, bis: { x: 40, y: 900 }, }, ], linien: [ { id: 'pl-sued', name: 'Süd geradeaus', mode: 'kfz', movement: 'geradeaus', punkte: [ { x: 20, y: 900 }, { x: 20, y: 500 }, ], haltlinieId: 'hl-doppelt', startT: 0.5, }, ], }; it('meldet die doppelte Haltlinienkennung, statt sie stumm neu zu vergeben', () => { const { project, issues } = parseProject({ lageplan: lageplanMitDoppelterKennung }); expect(project.lageplan.haltlinien).toHaveLength(2); expect(project.lageplan.haltlinien[0]!.id).not.toBe(project.lageplan.haltlinien[1]!.id); expect( issues.some((i) => i.path === 'lageplan.haltlinien[1]' && i.severity === 'warnung'), ).toBe(true); }); it('zieht die Fahrlinie nicht auf die fremde Haltlinie, sondern loest den mehrdeutigen Verweis auf', () => { const { project, issues } = parseProject({ lageplan: lageplanMitDoppelterKennung }); expect(project.lageplan.linien[0]!.punkte[0]).toEqual({ x: 20, y: 900 }); expect(project.lageplan.linien[0]!.haltlinieId).toBeNull(); expect( issues.some((i) => i.path === 'lageplan.linien[0].haltlinieId' && i.severity === 'warnung'), ).toBe(true); }); it('laesst eindeutige Haltlinienkennungen samt ihren Fahrlinien unberuehrt', () => { const { project, issues } = parseProject({ lageplan: { haltlinien: [ { id: 'hl-nord', name: 'Nord', art: 'zufahrt', von: { x: 0, y: 0 }, bis: { x: 40, y: 0 }, }, { id: 'hl-sued', name: 'Süd', art: 'zufahrt', von: { x: 0, y: 900 }, bis: { x: 40, y: 900 }, }, ], linien: [ { id: 'pl-sued', name: 'Süd geradeaus', mode: 'kfz', movement: 'geradeaus', punkte: [ { x: 20, y: 900 }, { x: 20, y: 500 }, ], haltlinieId: 'hl-sued', startT: 0.5, }, ], }, }); expect(project.lageplan.haltlinien.map((h) => h.id)).toEqual(['hl-nord', 'hl-sued']); expect(project.lageplan.linien[0]!.haltlinieId).toBe('hl-sued'); expect(project.lageplan.linien[0]!.punkte[0]).toEqual({ x: 20, y: 900 }); expect(issues.filter((i) => i.path.startsWith('lageplan'))).toEqual([]); }); it('haelt den Verweis auf die verbliebene Haltlinie, wenn die zweite ohne Ausdehnung verworfen wird', () => { const { project } = parseProject({ lageplan: { haltlinien: [ { id: 'hl-doppelt', name: 'Nord', art: 'zufahrt', von: { x: 0, y: 0 }, bis: { x: 40, y: 0 }, }, { id: 'hl-doppelt', name: 'Entartet', art: 'zufahrt', von: { x: 5, y: 900 }, bis: { x: 5, y: 900 }, }, ], linien: [ { id: 'pl-nord', name: 'Nord geradeaus', mode: 'kfz', movement: 'geradeaus', punkte: [ { x: 20, y: 0 }, { x: 20, y: 400 }, ], haltlinieId: 'hl-doppelt', startT: 0.5, }, ], }, }); expect(project.lageplan.haltlinien).toHaveLength(1); expect(project.lageplan.linien[0]!.haltlinieId).toBe('hl-doppelt'); }); });