lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests ui ortseingabe.test.ts
| 1 | import { describe, expect, it } from 'vitest'; |
| 2 | import { leseKoordinate } from '@/domain/geometrie/projektion'; |
| 3 | import { ORTSEINGABE_HINWEIS } from '@/ui/lageplan/luftbild'; |
| 4 | |
| 5 | /* |
| 6 | * Der Hinweis am Ortsfeld des Luftbilddialogs gegen das, was leseKoordinate |
| 7 | * tatsaechlich erkennt. |
| 8 | * |
| 9 | * Der Text sagte zuvor "die Adresse aus einem Kartendienst hier einfuegen" und |
| 10 | * meinte die Internetadresse. In einem Verkehrsplanungsprogramm liest das |
| 11 | * jeder als Hausanschrift - und sucht dann vergeblich nach einer Ortssuche, |
| 12 | * die es nicht gibt. Zugleich verbarg die Formulierung den bequemsten Weg: |
| 13 | * Verweis aus der Adresszeile kopieren, einfuegen, fertig. |
| 14 | * |
| 15 | * Ein Hinweis, der etwas verspricht, was der Leser nicht erkennt, ist |
| 16 | * schlimmer als keiner. Deshalb wird hier nicht der Wortlaut festgenagelt, |
| 17 | * sondern jede Zusage des Textes am Verhalten geprueft. |
| 18 | */ |
| 19 | |
| 20 | /** Ein Verweis aus jedem Dienst, den der Hinweis namentlich nennt. */ |
| 21 | const VERWEISE: readonly [string, string][] = [ |
| 22 | ['OpenStreetMap', 'https://www.openstreetmap.org/#map=19/50.9412784/6.9582814'], |
| 23 | ['Google Maps', 'https://www.google.com/maps/@50.9412784,6.9582814,110m/data=!3m1!1e3'], |
| 24 | ['Apple Karten', 'https://maps.apple.com/?ll=50.9412784,6.9582814'], |
| 25 | ['Bing', 'https://www.bing.com/maps?cp=50.9412784~6.9582814&lvl=19'], |
| 26 | ]; |
| 27 | |
| 28 | describe('Hinweis am Ortsfeld deckt sich mit dem, was gelesen wird', () => { |
| 29 | it('erkennt jeden Dienst, den der Hinweis namentlich nennt', () => { |
| 30 | for (const [name, verweis] of VERWEISE) { |
| 31 | expect(ORTSEINGABE_HINWEIS, `${name} muss im Hinweis stehen`).toContain(name); |
| 32 | expect(leseKoordinate(verweis), `${name} muss gelesen werden`).not.toBeNull(); |
| 33 | } |
| 34 | }); |
| 35 | |
| 36 | it('nennt keinen Dienst, den es nicht liest', () => { |
| 37 | // Die Gegenrichtung. Sonst wandert beim naechsten Wortwechsel ein Name in |
| 38 | // den Text, den der Leser gar nicht kennt - genau der Fall, der den |
| 39 | // Anwender vor ein scheinbar kaputtes Feld setzte. |
| 40 | const bekannt = VERWEISE.map(([name]) => name); |
| 41 | for (const name of ['Here', 'Waze', 'Mapy', 'TomTom', 'Komoot']) { |
| 42 | expect(bekannt, name).not.toContain(name); |
| 43 | expect( |
| 44 | ORTSEINGABE_HINWEIS, |
| 45 | `${name} steht im Hinweis, wird aber nicht geprüft`, |
| 46 | ).not.toContain(name); |
| 47 | } |
| 48 | }); |
| 49 | |
| 50 | it('sagt die zwei Zahlen zu und liest sie', () => { |
| 51 | expect(ORTSEINGABE_HINWEIS).toMatch(/zwei Zahlen/); |
| 52 | expect(leseKoordinate('50,941278 6,958281')).not.toBeNull(); |
| 53 | }); |
| 54 | |
| 55 | it('schliesst die Hausanschrift aus und begruendet es', () => { |
| 56 | expect(leseKoordinate('Bahnhofstraße 12, 12345 Musterstadt')).toBeNull(); |
| 57 | expect(ORTSEINGABE_HINWEIS).toContain('Hausanschrift'); |
| 58 | // Nicht nur "geht nicht", sondern warum: Eine Ortssuche liesse die |
| 59 | // Anschrift den Rechner verlassen. Das ist die Entscheidung, die dahinter |
| 60 | // steht, und sie gehoert an die Stelle, an der sie auffaellt. |
| 61 | expect(ORTSEINGABE_HINWEIS).toMatch(/verließe|verlässt|den Rechner/); |
| 62 | }); |
| 63 | |
| 64 | it('verwechselt Internetadresse und Hausanschrift nicht mehr', () => { |
| 65 | // "Adresszeile" ist eindeutig, "Adresse" allein war es nicht. |
| 66 | expect(ORTSEINGABE_HINWEIS).toContain('Adresszeile'); |
| 67 | expect(ORTSEINGABE_HINWEIS).toContain('Verweis'); |
| 68 | expect(ORTSEINGABE_HINWEIS).not.toMatch(/\bdie Adresse aus einem\b/); |
| 69 | }); |
| 70 | }); |