Files
Aislo/resources/tester/test_512_6_drainage_saved_old.py
T

73 lines
3.2 KiB
Python

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