[TEST] Veraltete Test-Erwartungen an aktuelle Daten angepasst (Foerderer/Mubea/Omniflo-Strecke)
17 vorbestehende Failures behoben - alles veraltete Tests, kein Produktivcode: test_foerderer.py (3): CSV-Spalten header-basiert statt per festem Index ansprechen. Die Export-CSV hat inzwischen 17 statt 11 Spalten (Insertpoint, K1-K4, Warnungen kamen dazu, siehe lib/export_csv.py) - die Tests hingen an row[10] fuer Merkmale. Neu: self.col-Lookup + _cell(row, spaltenname), robust gegen weitere Spalten. test_mubea.py (2): _is_gefaelle zaehlte einen zweiten GF_*-Eintrag (block 'S-LP', ein Separator mit assigned_to GF_Mubea) faelschlich als Gefaellestrecke mit -> erwartete 40 statt 20. Jetzt: GF_* UND nicht _is_separator. test_omniflo_strecke.py (12): Test und seine Testdaten-Datei waren auf zwei verschiedene Datenmodelle geschrieben (Test: 12 Elemente, gerade_start/ kurve_180/gerade_ende, Felder drehung_ende/x_mitte; Datei: 7 Elemente, gerade_unten/gerade_oben/bogen/weiche ohne diese Felder). Test komplett auf das tatsaechliche 7-Element-Modell umgeschrieben (Struktur/Katalog/Geraden- Geometrie); Boegen gegen omniflo_boegen.json, Weiche gegen omniflo_weichen.json. Nicht angefasst (bewusst): 3x hundm05 (funktioniert noch nicht) und test_omniflo.py::test_zeilen_matches_reference (inkonsistente Export-CSV + veraltete Referenz - Analyse: export_csv.py ist konsistent 17-spaltig, die Output-Datei stammt aus einem gemischten Lauf; Referenz per --set-as-reference neu abnehmen, kein Code-Fix noetig). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+31
-15
@@ -199,16 +199,28 @@ class TestFoerdererExportCSV:
|
||||
self.header = next(reader)
|
||||
for row in reader:
|
||||
self.rows.append(row)
|
||||
# Spalten header-basiert ansprechen (die CSV-Struktur waechst - Insertpoint,
|
||||
# K1-K4, Warnungen kamen spaeter dazu, siehe lib/export_csv.py) statt ueber
|
||||
# feste Indizes. So bleiben die Tests robust gegen Spalten-Erweiterungen.
|
||||
self.col = {name: i for i, name in enumerate(self.header)}
|
||||
|
||||
def _cell(self, row, spalte):
|
||||
"""Zellwert einer Zeile ueber den Spaltennamen (oder None, falls fehlt)."""
|
||||
i = self.col.get(spalte)
|
||||
if i is None or i >= len(row):
|
||||
return None
|
||||
return row[i]
|
||||
|
||||
def test_header_felder(self):
|
||||
"""CSV-Header muss korrekte Spaltenbezeichnungen haben."""
|
||||
"""CSV-Header muss die erwarteten Spalten enthalten (Reihenfolge/Zusatz-
|
||||
spalten wie Insertpoint/K1-K4/Warnungen egal - per Name geprueft)."""
|
||||
expected = ["Elementnummer", "TeileArt", "TeileId", "Bezeichnung",
|
||||
"Planquadrat", "Anzahl", "Position", "Boundingbox", "Nachbarn",
|
||||
"Fehler", "Merkmale"]
|
||||
for i, name in enumerate(expected):
|
||||
assert self.header[i] == name, (
|
||||
f"Header[{i}]: erwartet '{name}', ist '{self.header[i]}'"
|
||||
)
|
||||
fehlend = [name for name in expected if name not in self.col]
|
||||
assert not fehlend, (
|
||||
f"Fehlende Spalten im CSV-Header: {fehlend}\nHeader ist: {self.header}"
|
||||
)
|
||||
|
||||
def test_hat_eintraege(self):
|
||||
"""CSV muss mindestens einen Dateneintrag enthalten."""
|
||||
@@ -218,28 +230,31 @@ class TestFoerdererExportCSV:
|
||||
"""Alle Eintraege muessen TeileArt 'ILS 2.0 Strecke' haben (VarioFoerderer
|
||||
ist ein Streckentyp, siehe export_csv.py:process_blocks)."""
|
||||
for i, row in enumerate(self.rows):
|
||||
if len(row) < 2:
|
||||
teileart = self._cell(row, "TeileArt")
|
||||
if teileart is None:
|
||||
continue
|
||||
assert row[1].strip('"') == "ILS 2.0 Strecke", (
|
||||
f"Zeile {i + 2}: TeileArt='{row[1]}', erwartet 'ILS 2.0 Strecke'"
|
||||
assert teileart.strip('"') == "ILS 2.0 Strecke", (
|
||||
f"Zeile {i + 2}: TeileArt='{teileart}', erwartet 'ILS 2.0 Strecke'"
|
||||
)
|
||||
|
||||
def test_anzahl_spalte_ist_eins(self):
|
||||
"""Anzahl-Spalte muss fuer alle Zeilen '1' sein."""
|
||||
for i, row in enumerate(self.rows):
|
||||
if len(row) < 6:
|
||||
anzahl = self._cell(row, "Anzahl")
|
||||
if anzahl is None:
|
||||
continue
|
||||
assert row[5] == "1", (
|
||||
f"Zeile {i + 2}: Anzahl={row[5]}, erwartet 1"
|
||||
assert anzahl == "1", (
|
||||
f"Zeile {i + 2}: Anzahl={anzahl}, erwartet 1"
|
||||
)
|
||||
|
||||
def test_merkmale_sind_valides_json(self):
|
||||
"""Merkmale-Spalte muss valides JSON enthalten."""
|
||||
for i, row in enumerate(self.rows):
|
||||
if len(row) < 11:
|
||||
merkmale = self._cell(row, "Merkmale")
|
||||
if merkmale is None:
|
||||
continue
|
||||
try:
|
||||
json.loads(row[10])
|
||||
json.loads(merkmale)
|
||||
except json.JSONDecodeError as e:
|
||||
pytest.fail(f"Zeile {i + 2}: Merkmale ist kein valides JSON: {e}")
|
||||
|
||||
@@ -248,9 +263,10 @@ class TestFoerdererExportCSV:
|
||||
required = {"Typ", "Winkel", "DeltaH_mm", "DeltaL_mm",
|
||||
"L_VF_m", "Hoehe_Von_mm", "Hoehe_Bis_mm"}
|
||||
for i, row in enumerate(self.rows):
|
||||
if len(row) < 11:
|
||||
zelle = self._cell(row, "Merkmale")
|
||||
if zelle is None:
|
||||
continue
|
||||
merkmale = json.loads(row[10])
|
||||
merkmale = json.loads(zelle)
|
||||
missing = required - set(merkmale.keys())
|
||||
assert not missing, (
|
||||
f"Zeile {i + 2}: Fehlende Merkmale-Felder: {missing}"
|
||||
|
||||
Reference in New Issue
Block a user