lsa-planer

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

/ tests ui paarzaehlung.test.ts

3,8 KB Rohdatei
tests/ui/paarzaehlung.test.ts — 96 Zeilen
1 import { afterEach, describe, expect, it } from 'vitest';
2 import { ProjectStore } from '@/app/store';
3 import * as actions from '@/app/actions';
4 import { createConflict, createEmptyProject } from '@/domain/model/factory';
5 import type { Project } from '@/domain/model/project';
6 import type { ViewContext } from '@/ui/shell';
7 import { compatibilityView, zaehleFeindlichePaare } from '@/ui/views/compatibilityView';
8
9 /**
10 * Befund 74 zur Fassung 5.10.0.
11 *
12 * `zaehleFeindlichePaare` bildete den ungerichteten Paarschluessel als
13 * `[fromId, toId].sort().join('|')`. Fuer die Kennungen "a|b", "c", "a" und
14 * "b|c" ergibt das zweimal denselben Schluessel "a|b|c": Zwei verschiedene
15 * Paare fallen zusammen, und die Zahl ist zu klein.
16 *
17 * Sie steht an zwei sichtbaren Stellen - in der Ueberschrift der Ansicht und
18 * in der Rueckfrage vor "Alle aufheben", die sagt, wie viele Konflikte
19 * entfernt werden. Beide widersprechen dann der Matrix daneben.
20 *
21 * Dieselbe Bauart hat Befund 61 (Fassung 5.9.0) in `signalPlan.ts` und in
22 * `parseConflicts` bereits beseitigt; eine Signalgruppenkennung kommt
23 * ungeprueft aus der Projektdatei - `parseSignalGroups` beanstandet nur leere
24 * und doppelt vergebene Kennungen, kein Zeichenrepertoire.
25 */
26
27 const FESTES_DATUM = new Date('2026-01-01T00:00:00Z');
28
29 afterEach(() => {
30 document.body.replaceChildren();
31 });
32
33 /**
34 * Vier Signalgruppen mit Kennungen, die den verbindenden Strich enthalten, und
35 * zwei feindliche Paare: "a|b" gegen "c" und "a" gegen "b|c".
36 */
37 function projektMitTrennzeichen(): Project {
38 const leer = createEmptyProject('Kennungen', FESTES_DATUM);
39 let projekt = leer;
40 for (let i = 0; i < 4; i += 1) projekt = actions.addSignalGroup(projekt, 'kfz');
41 const kennungen = ['a|b', 'c', 'a', 'b|c'];
42 const signalGroups = projekt.signalGroups.map((g, i) => ({ ...g, id: kennungen[i]! }));
43 return {
44 ...projekt,
45 signalGroups,
46 conflicts: [
47 createConflict('a|b', 'c'),
48 createConflict('c', 'a|b'),
49 createConflict('a', 'b|c'),
50 createConflict('b|c', 'a'),
51 ],
52 };
53 }
54
55 describe('Befund 74 - Zaehlung der feindlichen Paare bleibt bei "|" in der Kennung eindeutig', () => {
56 it('zaehlt zwei Paare, die denselben zusammengeklebten Schluessel ergaeben', () => {
57 // ['a|b','c'].sort().join('|') === 'a|b|c' === ['a','b|c'].sort().join('|')
58 expect(zaehleFeindlichePaare(projektMitTrennzeichen())).toBe(2);
59 });
60
61 it('zaehlt gewoehnliche Kennungen unveraendert', () => {
62 let projekt = createEmptyProject('Regelfall', FESTES_DATUM);
63 projekt = actions.addSignalGroup(actions.addSignalGroup(projekt, 'kfz'), 'kfz');
64 const [a, b] = projekt.signalGroups;
65 expect(zaehleFeindlichePaare(projekt)).toBe(0);
66 projekt = actions.toggleConflictPair(projekt, a!.id, b!.id);
67 expect(zaehleFeindlichePaare(projekt)).toBe(1);
68 });
69
70 it('nennt in der Ueberschrift dieselbe Zahl, die die Matrix zeigt', () => {
71 const wurzel = document.createElement('div');
72 document.body.append(wurzel);
73 const context: ViewContext = {
74 store: new ProjectStore(projektMitTrennzeichen()),
75 refresh: () => {},
76 navigate: () => {},
77 target: null,
78 };
79 const abmelden = compatibilityView.render(wurzel, context);
80 try {
81 const feindlicheZellen = [...wurzel.querySelectorAll('button')].filter((b) =>
82 (b.textContent ?? '').trim().startsWith('feindlich'),
83 );
84 expect(feindlicheZellen).toHaveLength(2);
85
86 const titel = [...wurzel.querySelectorAll('.abschnitt-titel')]
87 .map((t) => t.textContent ?? '')
88 .find((t) => t.includes('feindlich'));
89 expect(titel, 'Keine Überschrift zur Matrix').toBeDefined();
90 expect(titel, 'Die Überschrift widerspricht der Matrix daneben').toContain('2 von');
91 } finally {
92 abmelden();
93 wurzel.remove();
94 }
95 });
96 });