#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ conftest.py - pytest Fixtures fuer SSG_LIB Tests. Stellt gemeinsame Fixtures bereit: - Pfade zu testdata/, output/, reference/ - Laden von JSON-Testdefinitionen und -Ergebnissen - Laden von DXF-Dateien mit ezdxf """ import json import os import pytest import ezdxf def _tests_dir(): return os.getenv("DXFM_TESTS", os.path.dirname(os.path.abspath(__file__))) def _testdata_dir(): return os.getenv("DXFM_TESTDATA", os.path.join(_tests_dir(), "testdata")) def _output_dir(): return os.getenv("DXFM_TESTOUT", os.path.join(_tests_dir(), "output")) def _reference_dir(): return os.getenv("DXFM_TESTREF", os.path.join(_tests_dir(), "reference")) def _load_json(path): """Laedt JSON, tolerant gegenueber BricsCAD-Ausgaben. AutoLISP schreibt Dateien (write-line) im ANSI-Codepage des Systems, nicht in UTF-8 - Sonderzeichen (z.B. Grad-Zeichen in Beschreibungen) koennen daher nicht als UTF-8 dekodierbar sein. Fallback auf cp1252. """ try: with open(path, "r", encoding="utf-8") as f: return json.load(f) except UnicodeDecodeError: with open(path, "r", encoding="cp1252") as f: return json.load(f) # --- Foerderer Fixtures --- @pytest.fixture def foerderer_testdata(): """Laedt die Foerderer-Testdefinitionen aus testdata/foerderer_tests.json.""" path = os.path.join(_testdata_dir(), "foerderer_tests.json") data = _load_json(path) return [t for t in data if "test_id" in t] @pytest.fixture def foerderer_results(): """Laedt die Foerderer-Ergebnisse aus output/foerderer_results.json.""" path = os.path.join(_output_dir(), "foerderer_results.json") if not os.path.exists(path): pytest.skip("foerderer_results.json nicht vorhanden - TEST_FOERDERER in BricsCAD ausfuehren") data = _load_json(path) if not data: pytest.skip("foerderer_results.json ist leer") return data # --- Omniflo Fixtures --- @pytest.fixture def omniflo_testdata(): """Laedt die Omniflo-Testdefinitionen aus testdata/omniflo_tests.json.""" path = os.path.join(_testdata_dir(), "omniflo_tests.json") return _load_json(path) @pytest.fixture def omniflo_results(): """Laedt die Omniflo-Ergebnisse aus output/omniflo_results.json.""" path = os.path.join(_output_dir(), "omniflo_results.json") if not os.path.exists(path): pytest.skip("omniflo_results.json nicht vorhanden - TEST_OMNIFLO in BricsCAD ausfuehren") data = _load_json(path) if not data: pytest.skip("omniflo_results.json ist leer") return data # --- Kreisel Fixtures --- @pytest.fixture def kreisel_testdata(): """Laedt die Kreisel-Testdefinitionen aus testdata/kreisel_tests.json.""" path = os.path.join(_testdata_dir(), "kreisel_tests.json") return _load_json(path) @pytest.fixture def kreisel_results(): """Laedt die Kreisel-Ergebnisse aus output/kreisel_results.json.""" path = os.path.join(_output_dir(), "kreisel_results.json") if not os.path.exists(path): pytest.skip("kreisel_results.json nicht vorhanden - TEST_KREISEL in BricsCAD ausfuehren") data = _load_json(path) if not data: pytest.skip("kreisel_results.json ist leer - TEST_KREISEL in BricsCAD ausfuehren") return data @pytest.fixture def kreisel_dxf(): """Laedt die erzeugte Kreisel-DXF aus output/kreisel_tests.dxf.""" path = os.path.join(_output_dir(), "kreisel_tests.dxf") if not os.path.exists(path): pytest.skip("kreisel_tests.dxf nicht vorhanden - TESTRUN in BricsCAD ausfuehren") return ezdxf.readfile(path) @pytest.fixture def kreisel_ref_dxf(): """Laedt die Referenz-DXF aus reference/kreisel_ref.dxf.""" path = os.path.join(_reference_dir(), "kreisel_ref.dxf") if not os.path.exists(path): pytest.skip("kreisel_ref.dxf nicht vorhanden - Referenz noch nicht erstellt") return ezdxf.readfile(path) # --- Gefaellestrecke Fixtures --- @pytest.fixture def gefaellestrecke_testdata(): """Laedt die Gefaellestrecke-Testdefinitionen aus testdata/gefaellestrecke_tests.json.""" path = os.path.join(_testdata_dir(), "gefaellestrecke_tests.json") data = _load_json(path) return [t for t in data if "test_id" in t] @pytest.fixture def gefaellestrecke_results(): """Laedt die Gefaellestrecke-Ergebnisse aus output/gefaellestrecke_results.json.""" path = os.path.join(_output_dir(), "gefaellestrecke_results.json") if not os.path.exists(path): pytest.skip("gefaellestrecke_results.json nicht vorhanden - TEST_GEFAELLESTRECKE in BricsCAD ausfuehren") data = _load_json(path) if not data: pytest.skip("gefaellestrecke_results.json ist leer") return data @pytest.fixture def gefaellestrecke_dxf(): """Laedt die erzeugte Gefaellestrecke-DXF aus output/gefaellestrecke_tests.dxf.""" path = os.path.join(_output_dir(), "gefaellestrecke_tests.dxf") if not os.path.exists(path): pytest.skip("gefaellestrecke_tests.dxf nicht vorhanden - TESTRUN in BricsCAD ausfuehren") return ezdxf.readfile(path)