# -*- coding: utf-8 -*- import unittest from pathlib import Path import difflib from utils import check_environment_var, setup_logger import plant2dxf class TestDXFGeometry(unittest.TestCase): testordner_path = Path(check_environment_var("PROJECT_TEST")) lib_path = Path(check_environment_var("PROJECT_DATA")) config_dir = Path(check_environment_var("PROJECT_CFG")) work_dir = Path(check_environment_var("PROJECT_WORK")) default_lib_path = lib_path / "blocks.dxf" cfg_path = config_dir / "shapes.cfg" allgemein_cfg_path = config_dir / "allgemein.cfg" GEOM_CODES = { "0", "8", "10", "20", "30", "11", "21", "31", "41", "42", "43", "70", "71", "72", "73", "74", "75", } def extract_geometry_lines(self, file_path): """ Liest eine DXF-Datei ein und gibt nur die geometrischen Zeilen zurück, ignoriert Metadaten wie Timestamps, GUIDs, Layout-Blöcke etc. """ lines = [] with open(file_path, "r", encoding="utf-8") as f: while True: code = f.readline() if not code: break code = code.strip() value = f.readline() if not value: break value = value.strip() if code in self.GEOM_CODES: lines.append(f"{code}\n{value}\n") return lines def assert_dxf_geometry_equal(self, file1, file2): geom1 = self.extract_geometry_lines(file1) geom2 = self.extract_geometry_lines(file2) if geom1 != geom2: diff = "".join( difflib.unified_diff( geom1, geom2, fromfile=str(file1), tofile=str(file2) ) ) raise AssertionError(f"Geometrische Daten unterscheiden sich:\n{diff}") def test_omniflobogen_dxf_file(self): omniflo_bogen = "omniflo_bogen" omniflo_bogen_csv = self.testordner_path / f"{omniflo_bogen}.csv" omniflo_bogen_dxf = f"{omniflo_bogen}.dxf" omniflo_bogen_json = self.work_dir / f"{omniflo_bogen}.json" omniflo_bogen_output = self.work_dir / omniflo_bogen_dxf omniflo_bogen_reference = self.testordner_path / omniflo_bogen_dxf plant2dxf.main( omniflo_bogen_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, omniflo_bogen_output, omniflo_bogen_json, ) self.assert_dxf_geometry_equal(omniflo_bogen_output, omniflo_bogen_reference) def test_weiche_90_dxf_file(self): weiche_90 = "weiche_90" weiche_90_csv = self.testordner_path / f"{weiche_90}.csv" weiche_90_dxf = f"{weiche_90}.dxf" weiche_90_json = self.work_dir / f"{weiche_90}.json" weiche_90_output = self.work_dir / weiche_90_dxf weiche_90_reference = self.testordner_path / weiche_90_dxf plant2dxf.main( weiche_90_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weiche_90_output, weiche_90_json, ) self.assert_dxf_geometry_equal(weiche_90_output, weiche_90_reference) def test_weiche_45_simple_dxf_file(self): weiche_45_simple = "weiche_45_simple" weiche_45_simple_csv = self.testordner_path / f"{weiche_45_simple}.csv" weiche_45_simple_dxf = f"{weiche_45_simple}.dxf" weiche_45_simple_json = self.work_dir / f"{weiche_45_simple}.json" weiche_45_simple_output = self.work_dir / weiche_45_simple_dxf weiche_45_simple_reference = self.testordner_path / weiche_45_simple_dxf plant2dxf.main( weiche_45_simple_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weiche_45_simple_output, weiche_45_simple_json, ) self.assert_dxf_geometry_equal( weiche_45_simple_output, weiche_45_simple_reference ) def test_weiche_45_doppel_dxf_file(self): weiche_45_doppel = "weiche_45_doppel" weiche_45_doppel_csv = self.testordner_path / f"{weiche_45_doppel}.csv" weiche_45_doppel_dxf = f"{weiche_45_doppel}.dxf" weiche_45_doppel_json = self.work_dir / f"{weiche_45_doppel}.json" weiche_45_doppel_output = self.work_dir / weiche_45_doppel_dxf weiche_45_doppel_reference = self.testordner_path / weiche_45_doppel_dxf plant2dxf.main( weiche_45_doppel_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weiche_45_doppel_output, weiche_45_doppel_json, ) self.assert_dxf_geometry_equal( weiche_45_doppel_output, weiche_45_doppel_reference ) def test_weiche_45_dreiwege_dxf_file(self): weiche_45_dreiwege = "weiche_45_dreiwege" weiche_45_dreiwege_csv = self.testordner_path / f"{weiche_45_dreiwege}.csv" weiche_45_dreiwege_dxf = f"{weiche_45_dreiwege}.dxf" weiche_45_dreiwege_json = self.work_dir / f"{weiche_45_dreiwege}.json" weiche_45_dreiwege_output = self.work_dir / weiche_45_dreiwege_dxf weiche_45_dreiwege_reference = self.testordner_path / weiche_45_dreiwege_dxf plant2dxf.main( weiche_45_dreiwege_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weiche_45_dreiwege_output, weiche_45_dreiwege_json, ) self.assert_dxf_geometry_equal( weiche_45_dreiwege_output, weiche_45_dreiwege_reference ) def test_weichenkoerper_dxf_file(self): weichenkoerper = "weichenkoerper" weichenkoerper_csv = self.testordner_path / f"{weichenkoerper}.csv" weichenkoerper_dxf = f"{weichenkoerper}.dxf" weichenkoerper_json = self.work_dir / f"{weichenkoerper}.json" weichenkoerper_output = self.work_dir / weichenkoerper_dxf weichenkoerper_reference = self.testordner_path / weichenkoerper_dxf plant2dxf.main( weichenkoerper_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weichenkoerper_output, weichenkoerper_json, ) self.assert_dxf_geometry_equal(weichenkoerper_output, weichenkoerper_reference) def test_weichenkombination_dxf_file(self): weichenkombination = "weichenkombination" weichenkombination_csv = self.testordner_path / f"{weichenkombination}.csv" weichenkombination_dxf = f"{weichenkombination}.dxf" weichenkombination_json = self.work_dir / f"{weichenkombination}.json" weichenkombination_output = self.work_dir / weichenkombination_dxf weichenkombination_reference = self.testordner_path / weichenkombination_dxf plant2dxf.main( weichenkombination_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weichenkombination_output, weichenkombination_json, ) self.assert_dxf_geometry_equal( weichenkombination_output, weichenkombination_reference ) def test_gefaelle_dxf_file(self): gefaelle = "gefaelle" gefaelle_csv = self.testordner_path / f"{gefaelle}.csv" gefaelle_dxf = f"{gefaelle}.dxf" gefaelle_json = self.work_dir / f"{gefaelle}.json" weichenkombination_output = self.work_dir / gefaelle_dxf weichenkombination_reference = self.testordner_path / gefaelle_dxf plant2dxf.main( gefaelle_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, weichenkombination_output, gefaelle_json, ) self.assert_dxf_geometry_equal( weichenkombination_output, weichenkombination_reference ) def test_gefaelle_ausnahme_gleiche_orientierung_dxf_file(self): gefaelle_ausnahme_gleiche_orientierung = ( "gefaelle_ausnahme_gleiche_orientierung" ) gefaelle_ausnahme_gleiche_orientierung_csv = ( self.testordner_path / f"{gefaelle_ausnahme_gleiche_orientierung}.csv" ) gefaelle_ausnahme_gleiche_orientierung_dxf = ( f"{gefaelle_ausnahme_gleiche_orientierung}.dxf" ) gefaelle_ausnahme_gleiche_orientierung_json = ( self.work_dir / f"{gefaelle_ausnahme_gleiche_orientierung}.json" ) gefaelle_ausnahme_gleiche_orientierung_output = ( self.work_dir / gefaelle_ausnahme_gleiche_orientierung_dxf ) gefaelle_ausnahme_gleiche_orientierung_reference = ( self.testordner_path / gefaelle_ausnahme_gleiche_orientierung_dxf ) plant2dxf.main( gefaelle_ausnahme_gleiche_orientierung_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, gefaelle_ausnahme_gleiche_orientierung_output, gefaelle_ausnahme_gleiche_orientierung_json, ) self.assert_dxf_geometry_equal( gefaelle_ausnahme_gleiche_orientierung_output, gefaelle_ausnahme_gleiche_orientierung_reference, ) def test_gefaelle_ausnahme_unterschiedlich_orientierung_dxf_file(self): gefaelle_ausnahme_unterschiedlich_orientierung = ( "gefaelle_ausnahme_unterschiedlich_orientierung" ) gefaelle_ausnahme_unterschiedlich_orientierung_csv = ( self.testordner_path / f"{gefaelle_ausnahme_unterschiedlich_orientierung}.csv" ) gefaelle_ausnahme_unterschiedlich_orientierung_dxf = ( f"{gefaelle_ausnahme_unterschiedlich_orientierung}.dxf" ) gefaelle_ausnahme_unterschiedlich_orientierung_json = ( self.work_dir / f"{gefaelle_ausnahme_unterschiedlich_orientierung}.json" ) gefaelle_ausnahme_unterschiedlich_orientierung_output = ( self.work_dir / gefaelle_ausnahme_unterschiedlich_orientierung_dxf ) gefaelle_ausnahme_unterschiedlich_orientierung_reference = ( self.testordner_path / gefaelle_ausnahme_unterschiedlich_orientierung_dxf ) plant2dxf.main( gefaelle_ausnahme_unterschiedlich_orientierung_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, gefaelle_ausnahme_unterschiedlich_orientierung_output, gefaelle_ausnahme_unterschiedlich_orientierung_json, ) self.assert_dxf_geometry_equal( gefaelle_ausnahme_unterschiedlich_orientierung_output, gefaelle_ausnahme_unterschiedlich_orientierung_reference, ) def test_gefaelle_einzeln_verbunden_dxf_file(self): gefaelle_einzeln_verbunden = "gefaelle_einzeln_verbunden" gefaelle_einzeln_verbunden_csv = ( self.testordner_path / f"{gefaelle_einzeln_verbunden}.csv" ) gefaelle_einzeln_verbunden_dxf = f"{gefaelle_einzeln_verbunden}.dxf" gefaelle_einzeln_verbunden_json = ( self.work_dir / f"{gefaelle_einzeln_verbunden}.json" ) gefaelle_einzeln_verbunden_output = ( self.work_dir / gefaelle_einzeln_verbunden_dxf ) gefaelle_einzeln_verbunden_reference = ( self.testordner_path / gefaelle_einzeln_verbunden_dxf ) plant2dxf.main( gefaelle_einzeln_verbunden_csv, self.default_lib_path, self.cfg_path, self.allgemein_cfg_path, gefaelle_einzeln_verbunden_output, gefaelle_einzeln_verbunden_json, ) self.assert_dxf_geometry_equal( gefaelle_einzeln_verbunden_output, gefaelle_einzeln_verbunden_reference ) if __name__ == "__main__": unittest.main()