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" )