"""512-6(요구 326-6) 노선 [저장] 뒤 새로 연 B05 = 저장된 옛 유역 그림 + 낡음. - 낡은 분석(노선 지문 다름)이면 마지막 [저장]의 세부 유역 저장본(`04_detail_cache.pkl`)으로 옛 유역 · 옛 노선선을 돌려줌 · 관 자리만 지금 노선 위 · 저장본 없으면 관 자리만(옛 꼴). - 화면은 열 때 그림이 없으니 그 답을 그대로 그림 + 낡음 점([업데이트] 로만 바꿈 · test_512_2). """ import pickle from pathlib import Path from uuid import uuid4 from pyproj import Transformer from B04_PreProcess import B04_PreProcess_Router_Basins as basins from common_util.common_util_drainage_context import DrainageContext from common_util.common_util_drainage_detail import DrainageDetail, WatershedBasin from common_util.common_util_route_geometry import RouteVertex CRS = "EPSG:5186" TO = Transformer.from_crs(CRS, "EPSG:4326", always_xy=True) def _context(tmp_path: Path, monkeypatch, shift: float) -> DrainageContext: monkeypatch.setattr(basins, "drainage_dir", lambda _stored: tmp_path) vertices = [ RouteVertex(200000.0 + shift, 500000.0, 100.0, 0.0), RouteVertex(200300.0 + shift, 500000.0, 90.0, 300.0), ] return DrainageContext( stored_path="x", project_root=tmp_path, vertices=vertices, crs=CRS, to_lonlat=lambda x, y: TO.transform(x, y), ) def test_저장본_있으면_옛_그림과_옛_노선(tmp_path, monkeypatch): old = DrainageDetail( route_lonlat=[ list(TO.transform(200000.0, 500000.0)), list(TO.transform(200300.0, 500000.0)), ], basins=[WatershedBasin(index=1, chainage_m=120.0, outlet_x=200120.0, outlet_y=500000.0)], ) with (tmp_path / basins.DETAIL_CACHE_FILENAME).open("wb") as file: pickle.dump({"key": "옛", "value": (old, [])}, file) context = _context(tmp_path, monkeypatch, shift=17.0) # 노선 17 m 옮김 points = [basins.PipePoint(chainage_m=150.0, source="user")] detail = basins._build_stale(context, points) assert [basin.chainage_m for basin in detail.basins] == [120.0] assert detail.pipe_candidates == [] assert abs(detail.pipes[0].x - 200167.0) < 1e-6 # 관 = 지금 노선 위 payload = basins._payload(uuid4(), context, detail, points, True, stale=True) assert payload["stale"] and len(payload["basins"]) == 1 xy = payload["route_xy"] assert abs(xy[0][0] - 200000.0) < 0.01 and abs(xy[1][0] - 200300.0) < 0.01 # 옛 노선 def test_저장본_없으면_관_자리만(tmp_path, monkeypatch): context = _context(tmp_path, monkeypatch, shift=17.0) points = [basins.PipePoint(chainage_m=150.0, source="user")] detail = basins._build_stale(context, points) assert detail.basins == [] payload = basins._payload(uuid4(), context, detail, points, True, stale=True) assert abs(payload["route_xy"][0][0] - 200017.0) < 0.01 # 지금 노선 def test_깨진_저장본은_없음과_같음(tmp_path, monkeypatch): (tmp_path / basins.DETAIL_CACHE_FILENAME).write_bytes(b"broken") monkeypatch.setattr(basins, "drainage_dir", lambda _stored: tmp_path) assert basins._read_cache_file("x") is None