Strukturtests auf alle Kanten und alle Elemente ausweiten (#16)

- test_referenzmodelle.py: kreuzungen() prüft alle Sequenz- und
  Nachrichtenflüsse gegen Aufgaben, Ereignisse (Kreis), Gateways (Raute)
  und Datenelemente und liefert alle Funde. Neuer Test je Modell unter
  beispiele/ (auch Syntaxbeispiele): keine unbekannte Kreuzung.
- Bekannte Fälle je Kreuzung in BEKANNTE_KREUZUNGEN, jeder mit eigenem
  xfail(strict=True)-Test: #12 (Rücksprung durch S5 in beispiel_lanes),
  #13 (Nachrichtenfluss durch S5 in beispiel_lanes und durch S24 im
  Referenzmodell).
- test_keine_kante_fuehrt_durchs_innere_eines_gateways entfällt: Die neue
  Prüfung deckt Gateways mit derselben Rautengeometrie ab und meldet mehr.
  Gegenprobe am Stand vor #8: alle sieben Kreuzungen auf einmal gefunden.
- Selbsttest der Prüfung und test_ausweichabstand_liegt_in_beiden_layouts
  _im_freien_gang (bindet AUSWEICHABSTAND an DEFAULT_SIZE und Abstände).
- AGENTS.md: xfail-Ausnahme gilt für alle Modelle unter beispiele/, je
  Fehler einzeln. Anleitung, Fallstricke, STATUS nachgezogen.
- Tests: python -m pytest -q -> 97 bestanden, 3 xfail (#12, #13).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-25 13:01:23 +02:00
co-authored by Claude Opus 5.5
parent 45baa3d4a2
commit 97413265f2
6 changed files with 126 additions and 25 deletions
+13
View File
@@ -387,6 +387,19 @@ def test_ausweichweg_zwischen_gateways_meidet_die_spalte_dazwischen():
assert not (x < px < x + w and y < py < y + h), f"Kante läuft bei ({px:g}, {py:g}) durch die Aufgabe"
def test_ausweichabstand_liegt_in_beiden_layouts_im_freien_gang():
"""Prüft, dass AUSWEICHABSTAND zu den Layout-Maßen passt: Die Ausweichachse liegt jenseits der halben Breite bzw.
Höhe des größten Elements und diesseits des Nachbarelements, in Spalten wie in Zeilen, mit und ohne Lanes (#8, #16).
Schlägt der Test fehl, wurden Elementgrößen oder Abstände geändert – dann AUSWEICHABSTAND neu bestimmen."""
groessen = [wh for typ, wh in m.DEFAULT_SIZE.items() if typ not in m.UNCONNECTED_TYPES]
breite = max(w for w, _ in groessen)
hoehe = max(h for _, h in groessen)
for spalte in (m.COLUMN_WIDTH, m.LANE_COLUMN_WIDTH):
assert breite / 2 < m.AUSWEICHABSTAND < spalte - breite / 2, f"Spaltenabstand {spalte}"
for zeile in (m.ROW_HEIGHT, m.LANE_ROW_HEIGHT):
assert hoehe / 2 < m.AUSWEICHABSTAND < zeile - hoehe / 2, f"Zeilenabstand {zeile}"
def test_kante_zwischen_gateways_zum_westpunkt_eines_linken_ziels_umgeht_die_raute():
"""Prüft den waagrechten Spiegelfall: vom Ostpunkt eines Gateways zum Westpunkt eines weiter links
liegenden Gateways führt die Kante ober- oder unterhalb an der Ziel-Raute vorbei."""