import json import tempfile import unittest from pathlib import Path import numpy as np from B04_wf1_Surface.B04_wf1_Surface_Engine_Pipeline import build_all_terrain_models from B05_wf2_Route.B05_wf2_Route_Engine import run_route_design from B05_wf2_Route.B05_wf2_Route_Router import router from config.config_system import build_surface_model_config class RouteEngineTest(unittest.TestCase): def _make_dtm(self, root: Path) -> None: models = root / "B04_wf1_Surface" / "models" coords = np.linspace(0.0, 60.0, 61) gx, gy = np.meshgrid(coords, coords) z = 5.0 + 0.03 * gx + 0.02 * gy xyz = np.column_stack([gx.ravel(), gy.ravel(), z.ravel()]).astype(np.float64) bounds = np.array([[0.0, 60.0], [0.0, 60.0], [float(z.min()), float(z.max())]]) cfg = build_surface_model_config() cfg["source_filters"] = ["grid_min_z"] cfg["precompute"] = ["dtm"] build_all_terrain_models( {"xyz": xyz, "bounds": bounds}, {"grid_min_z": np.ones(len(xyz), dtype=bool)}, models, cfg, ) def test_run_route_design(self) -> None: with tempfile.TemporaryDirectory() as directory: root = Path(directory) / "proj" self._make_dtm(root) points = { "bp": {"x": 5.0, "y": 5.0}, "ep": {"x": 55.0, "y": 55.0}, "cp": [], "ap": [], "fp": [], } design = run_route_design(root, "grid_min_z", "dtm", False, points, {}) # GeoJSON 저장 확인 self.assertEqual(design["route_data_path"], "B05_wf2_Route/route/route_main.geojson") geojson_file = root / design["route_data_path"] self.assertTrue(geojson_file.is_file()) geo = json.loads(geojson_file.read_text(encoding="utf-8")) self.assertEqual(geo["geometry"]["type"], "LineString") self.assertGreater(len(geo["geometry"]["coordinates"]), 2) # 렌더링 샘플 & 통계 self.assertTrue(design["render_points"]) self.assertEqual(design["render_points"][0]["sequence_num"], 0) self.assertIsNotNone(design["statistics"]["max_slope"]) self.assertTrue(design["solver_result"]["required_points_ok"]) class RouterRegistrationTest(unittest.TestCase): def test_routes_registered(self) -> None: paths = {r.path for r in router.routes} self.assertIn("/api/projects/{project_id}/route/solve", paths) self.assertIn("/api/projects/{project_id}/route/confirm", paths)