Files
Aislo/resources/tester/test_b05_drainage_recommend.py
T
eomsangdonandClaude Opus 5.5 77a7697768 fix(B04): 새 관 기본값 — 유입 집수정이면 유입 흙막이 칸 안 채움 · 동물이동형 유 · 관경 수 (PLAN 623 · 요구 530 E1)
- `_apply_new_defaults` — 집수정 갈래면 `inlet_revet_*` 기본값 · 높이 안 채움 · `inlet_basin_animal` "true" · 등록부 관경 글 "1000" → 수
- 새 자동 관이 폼을 처음 거쳐도 파일이 안 바뀜(620 증상) · 옛 프로젝트 이주 없음
- 시험 — 새 `test_623_inlet_defaults`(폼 왕복 차 0 · `helper_623_inlet_defaults.cjs`) · 기대값 고침 `test_b05_new_structure_defaults` · `test_211_1`(기슭막이 관으로) · `test_b05_drainage_recommend`(관경 수)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 20:16:48 +09:00

116 lines
4.9 KiB
Python

"""배수 추천 구조물·관경 (PLAN 2026-08-17 「4」) — 제안만 · 자동 지정 없음(342-3 · 10-16 사용자 지시).
추천 근거는 **유량(유효직경)뿐**이다 — 계곡 횡단경사·하천 차수는 지형 계산이 필요해
이번 범위에서 뺐고 화면이 "현장 확인"으로 안내한다(사용자 확정).
D ≤ 1,500㎜ 배관 (레지스트리 선택지로 스냅, 하한 800㎜)
1,500 < D ≤ 2,000 BOX암거 후보
D > 2,000㎜ 세월교·물넘이 검토
"""
from pathlib import Path
from types import SimpleNamespace
import pytest
from B04_PreProcess import B04_PreProcess_Router_Basins as basins
from B05_Profile.B05_Profile_Structures_Schema import load_structure_types
from common_util.common_util_drainage_detail import (
DrainageDetail,
WatershedBasin,
recommend_structure,
)
from common_util.common_util_drainage_pipes import (
PIPE_FACILITY_BOX,
PIPE_FACILITY_FORD_BRIDGE,
PIPE_FACILITY_PIPE,
PIPE_SOURCE_STREAM,
PipePoint,
)
from common_util.common_util_route_geometry import StructureCandidate
from config.config_system import DRAINAGE_RECOMMEND_DIAMETERS_MM
# ── 추천 판정 ──────────────────────────────────────────────────────────────
@pytest.mark.parametrize(
"diameter_mm, expected",
[
(None, (PIPE_FACILITY_PIPE, None)), # 강우량표 없음 — 관경 미정
(300.0, (PIPE_FACILITY_PIPE, 800)), # 하한 800㎜ 아래로는 안 내린다
(800.0, (PIPE_FACILITY_PIPE, 800)),
(800.1, (PIPE_FACILITY_PIPE, 1000)), # 규격을 넘으면 바로 위 규격
(1000.0, (PIPE_FACILITY_PIPE, 1000)),
(1100.0, (PIPE_FACILITY_PIPE, 1200)),
(1500.0, (PIPE_FACILITY_PIPE, 1500)), # 경계값은 아직 배관
(1500.1, (PIPE_FACILITY_BOX, None)), # 초과 → BOX암거 후보
(2000.0, (PIPE_FACILITY_BOX, None)), # 경계값은 아직 BOX암거
(2000.1, (PIPE_FACILITY_FORD_BRIDGE, None)), # 관 최대 규격 초과
],
)
def test_recommend_structure_thresholds(diameter_mm, expected):
assert recommend_structure(diameter_mm) == expected
def test_recommended_sizes_match_registry_choices():
"""추천 관경은 폼에서 고를 수 있어야 한다 — 레지스트리 선택지와 같은 목록."""
by_id = {item.type_id: item for item in load_structure_types()}
options = {option.key: option for option in by_id["pipe"].options}
choices = [int(value) for value in options["pipe_diameter_mm"].choices]
assert list(DRAINAGE_RECOMMEND_DIAMETERS_MM) == choices
# ── 자동 지정 끔 — 제안은 응답에만 ─────────────────────────────────────────────
def _basin(chainage: float, facility: str, diameter: int | None) -> WatershedBasin:
return WatershedBasin(
index=1,
chainage_m=chainage,
outlet_x=0.0,
outlet_y=0.0,
recommended_facility=facility,
recommended_diameter_mm=diameter,
)
def _run_build(monkeypatch, basin: WatershedBasin, points: list[PipePoint] | None):
detail = DrainageDetail(
pipes=[StructureCandidate(chainage_m=100.0, x=0.0, y=0.0, reason=PIPE_SOURCE_STREAM)],
basins=[basin],
)
monkeypatch.setattr(basins, "build_detail", lambda *args: detail)
monkeypatch.setattr(basins, "drainage_dir", lambda path: Path("."))
_, carried = basins._build("x", SimpleNamespace(vertices=[]), points)
return carried
def _master_pipe_diameter():
pipe = {item.type_id: item for item in load_structure_types()}["pipe"]
return {option.key: option for option in pipe.options}["pipe_diameter_mm"].default
@pytest.mark.parametrize(
"facility, diameter",
[(PIPE_FACILITY_PIPE, 1500), (PIPE_FACILITY_BOX, None), (PIPE_FACILITY_FORD_BRIDGE, None)],
)
def test_new_pipe_gets_master_default_not_recommendation(monkeypatch, facility, diameter):
"""새로 놓인 관 = 배관 · 마스터 기본 관경 — 추천(관경 · BOX암거 · 세월교)은 안 얹는다."""
carried = _run_build(monkeypatch, _basin(100.0, facility, diameter), None)
assert carried[0].facility == PIPE_FACILITY_PIPE
# 등록부 글 "1000" → 수로 적힘(623 · 폼 왕복과 같음)
assert carried[0].options["pipe_diameter_mm"] == int(_master_pipe_diameter())
def test_existing_auto_pipe_is_untouched(monkeypatch):
"""이미 놓인 자동 관의 빈 관경 · 시설은 추천으로 안 채운다(옛 값 그대로)."""
points = [PipePoint(chainage_m=100.0, source=PIPE_SOURCE_STREAM)]
carried = _run_build(monkeypatch, _basin(100.0, PIPE_FACILITY_BOX, None), points)
assert carried[0].facility == PIPE_FACILITY_PIPE
assert carried[0].options is None
def test_master_pipe_default_is_1000():
assert float(_master_pipe_diameter()) == 1000