Files
Aislo/tests/test_b05_route_engine.py
T
2026-07-05 21:27:23 +09:00

65 lines
2.6 KiB
Python

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)