der Lisp Omniflo Test verwendet jetzt wirklich alle existierenden Omniflo Teile die da sind.
This commit is contained in:
+79
-1
@@ -22,7 +22,7 @@ sys.path.insert(0, _LIB_DIR)
|
||||
|
||||
from export_csv import (
|
||||
build_lookup, process_blocks, build_bogen_merkmale,
|
||||
build_weiche_merkmale, load_json
|
||||
build_weiche_merkmale, load_json, format_csv_line
|
||||
)
|
||||
|
||||
|
||||
@@ -100,6 +100,16 @@ class TestOmnifloExportUnit:
|
||||
))
|
||||
self.items = process_blocks(self.blocks, self.lookup)
|
||||
|
||||
# CSV in output speichern
|
||||
out_dir = _output_dir()
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
csv_path = os.path.join(out_dir, "omniflo_export.csv")
|
||||
header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale"
|
||||
with open(csv_path, "w", encoding="utf-8") as f:
|
||||
f.write(header + "\n")
|
||||
for item in self.items:
|
||||
f.write(format_csv_line(item) + "\n")
|
||||
|
||||
def test_item_count_matches_testcases(self):
|
||||
"""Anzahl exportierter Elemente muss Anzahl Testfaelle entsprechen."""
|
||||
assert len(self.items) == len(self.tests), (
|
||||
@@ -348,3 +358,71 @@ class TestOmnifloExportCSV:
|
||||
assert not missing, (
|
||||
f"Zeile {i + 2}: Fehlende Weichen-Felder: {missing}"
|
||||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Referenz-Tests: CSV gegen Referenzdatei vergleichen
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _reference_dir():
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "reference")
|
||||
|
||||
|
||||
def _normalize_row(line):
|
||||
"""Splittet eine CSV-Zeile und ersetzt die TeileId (UUID) durch Platzhalter."""
|
||||
cols = line.strip().split(";", 5)
|
||||
if len(cols) >= 3:
|
||||
cols[2] = "<ID>"
|
||||
return cols
|
||||
|
||||
|
||||
class TestOmnifloReferenceCSV:
|
||||
"""Vergleicht den erzeugten Unit-Test-CSV-Export mit einer Referenzdatei."""
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup(self):
|
||||
self.out_csv = os.path.join(_output_dir(), "omniflo_export.csv")
|
||||
self.ref_csv = os.path.join(_reference_dir(), "omniflo_export_reference.csv")
|
||||
if not os.path.exists(self.out_csv):
|
||||
pytest.skip(
|
||||
"omniflo_export.csv nicht vorhanden - "
|
||||
"zuerst TestOmnifloExportUnit ausfuehren"
|
||||
)
|
||||
if not os.path.exists(self.ref_csv):
|
||||
pytest.skip("Referenzdatei nicht vorhanden: " + self.ref_csv)
|
||||
with open(self.out_csv, "r", encoding="utf-8") as f:
|
||||
self.out_lines = f.readlines()
|
||||
with open(self.ref_csv, "r", encoding="utf-8") as f:
|
||||
self.ref_lines = f.readlines()
|
||||
|
||||
def test_header_matches_reference(self):
|
||||
"""Header muss mit Referenz uebereinstimmen."""
|
||||
assert self.out_lines[0].strip() == self.ref_lines[0].strip(), (
|
||||
f"Header abweichend:\n Ist: {self.out_lines[0].strip()}\n"
|
||||
f" Soll: {self.ref_lines[0].strip()}"
|
||||
)
|
||||
|
||||
def test_zeilenanzahl_matches_reference(self):
|
||||
"""Zeilenanzahl muss mit Referenz uebereinstimmen."""
|
||||
assert len(self.out_lines) == len(self.ref_lines), (
|
||||
f"Zeilenanzahl abweichend: Ist={len(self.out_lines)}, "
|
||||
f"Soll={len(self.ref_lines)}"
|
||||
)
|
||||
|
||||
def test_zeilen_matches_reference(self):
|
||||
"""Alle Zeilen muessen mit Referenz uebereinstimmen (TeileId wird ignoriert)."""
|
||||
min_lines = min(len(self.out_lines), len(self.ref_lines))
|
||||
diffs = []
|
||||
for i in range(1, min_lines):
|
||||
out_cols = _normalize_row(self.out_lines[i])
|
||||
ref_cols = _normalize_row(self.ref_lines[i])
|
||||
if out_cols != ref_cols:
|
||||
diffs.append(
|
||||
f"Zeile {i + 1}:\n"
|
||||
f" Ist: {self.out_lines[i].strip()[:120]}\n"
|
||||
f" Soll: {self.ref_lines[i].strip()[:120]}"
|
||||
)
|
||||
assert not diffs, (
|
||||
f"{len(diffs)} abweichende Zeile(n) (erste 5):\n" +
|
||||
"\n".join(diffs[:5])
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user