65 lines
2.6 KiB
Python
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)
|