62 lines
2.9 KiB
Python
62 lines
2.9 KiB
Python
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 config.config_system import build_surface_model_config
|
|
|
|
|
|
class BuildAllTerrainModelsTest(unittest.TestCase):
|
|
def _synthetic_slope(self) -> tuple[dict[str, np.ndarray], dict[str, np.ndarray]]:
|
|
coords = np.linspace(0.0, 40.0, 41)
|
|
gx, gy = np.meshgrid(coords, coords)
|
|
z = 5.0 + 0.05 * gx + 0.03 * gy
|
|
xyz = np.column_stack([gx.ravel(), gy.ravel(), z.ravel()]).astype(np.float64)
|
|
bounds = np.array([[0.0, 40.0], [0.0, 40.0], [float(z.min()), float(z.max())]])
|
|
mask = np.ones(len(xyz), dtype=bool)
|
|
return {"xyz": xyz, "bounds": bounds}, {"grid_min_z": mask}
|
|
|
|
def test_builds_all_representations(self) -> None:
|
|
structured, masks = self._synthetic_slope()
|
|
config = build_surface_model_config()
|
|
config["source_filters"] = ["grid_min_z"]
|
|
progress: list[tuple[int, str]] = []
|
|
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
output_dir = Path(directory) / "proj" / "models"
|
|
manifest = build_all_terrain_models(
|
|
structured, masks, output_dir, config, progress=lambda p, m: progress.append((p, m))
|
|
)
|
|
|
|
self.assertEqual(manifest["status"], "completed")
|
|
self.assertEqual(manifest["failure_count"], 0)
|
|
methods = manifest["source_filters"]["grid_min_z"]["methods"]
|
|
self.assertEqual(set(methods), {"tin", "dtm", "nurbs", "implicit", "meshfree"})
|
|
for meta in methods.values():
|
|
self.assertEqual(meta["status"], "completed")
|
|
# DTM/TIN은 스무딩까지 완료
|
|
self.assertEqual(methods["dtm"]["smooth"]["status"], "completed")
|
|
self.assertEqual(methods["tin"]["smooth"]["status"], "completed")
|
|
# 등고선 캐시와 manifest 생성 확인
|
|
files = list(output_dir.iterdir())
|
|
self.assertTrue(any("contour_" in f.name for f in files))
|
|
self.assertTrue((output_dir / "manifest.json").is_file())
|
|
self.assertEqual(progress[-1][0], 100)
|
|
|
|
def test_cache_reuse_on_second_call(self) -> None:
|
|
structured, masks = self._synthetic_slope()
|
|
config = build_surface_model_config()
|
|
config["source_filters"] = ["grid_min_z"]
|
|
config["precompute"] = ["dtm"]
|
|
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
output_dir = Path(directory) / "proj" / "models"
|
|
build_all_terrain_models(structured, masks, output_dir, config)
|
|
second = build_all_terrain_models(structured, masks, output_dir, config)
|
|
self.assertEqual(second["status"], "completed")
|
|
self.assertEqual(
|
|
second["source_filters"]["grid_min_z"]["methods"]["dtm"]["status"], "completed"
|
|
)
|