260705_2
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user