Files
Aislo/resources/tester/test_b06_recompute_keeps_user_values.py
T
eomsangdonandClaude Opus 5.5 3a64f9a812 feat(472-4 ② 횡단 짝 모으기): [저장] · [확정] 횡단 설계선 · 면적 · 소단 구간을 Node 입구 한 갈래로(C1 · C2 · C4 · X3 풀림)
- Router_Design enforce 셋 · 넓힘 뒤 설계 — 파이썬은 입력 조립만 · 측점 묶음을 Node 한 번(B06_Section_Engine_Design_Node · cross.design) · Node 못 부르면 파이썬 짝
- 소단 구간 셈을 화면 파일에서 common_util_berm_spans.ts 로 · 서버도 같은 TS(cross.berm_spans) · Persist 가 다시 내보냄
- 값: 고정 자료 기준값 0 차(면적 · 계획고 · 누가토량 −17,570.7) · 설계선 점 13 곳 1e-4 m(반올림 동점 · 브레인 승인) — 기준값 시험에 판정 더함
- 시험: compute_cross_design 갈아 끼우던 시험 다섯을 묶음 자리로(까닭: [저장] 다시 셈이 묶음으로 부름) · 소단 글 시험 자리 옮김
- 등록부 · 위키 계산 목록 · B06 지침 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:21:42 +09:00

115 lines
4.6 KiB
Python

"""포장 구간 재계산이 **사용자 값을 지우지 않는지**.
왜 (실사고 `b6941bd2`) — 포장 구간·세월교 측점은 저장 때 서버가 횡단을 **다시 계산해
통째로 갈아 끼운다**. 계산이 만들지 않는 값(구조물 조정·다단 구간값 등)은 그 자리에서
따로 베껴 넣어야 살아남는데, `extra_spans` 가 목록에서 빠져 조용히 사라졌다.
이 시험이 보는 것은 **베껴 넣는 그 자리**다. 지형·계획고는 시험 대상이 아니므로 가짜로
바꿔 끼운다(그 둘은 각자 시험이 있다). 목록 자체가 갈리는 것은
`test_b06_user_touched_keys.py`, 새 사용자 값이 목록에서 새는 것은
`test_b06_design_key_split.py` 가 지킨다.
"""
import sys
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parents[2]
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
from B06_Section import B06_Section_Router_Design as design_mod # noqa: E402
USER_VALUES = {
"display_half_width_m": 12.5,
"inlet_structure": "L",
"basin_adjust": {"innerWidthM": 1.5, "innerHeightM": 1.5, "lateralM": 0.5, "slopeM": 0.2},
"revet_adjust": {"outlet": {"x": 2.0, "d": 0.5, "h": None, "m": None}},
"ford_adjust": {"inlet": {"heightM": None, "lateralM": 1.0, "slopeM": 0.0}},
"box_adjust": {"left": {"lengthM": 2.0, "riseM": 0.0}},
"extra_wall_counts": {"outlet": 2, "basin": 0},
"extra_spans": {"extra0": {"length_m": 15.0, "before_m": 8.0, "after_m": 7.0}},
"revet_link_detached": True,
"revet_follow_grade": False,
}
#: 재계산 인자로 되먹여 살아남는 갈래 — 결과에 그대로 나와야 한다.
FED_BACK = {
"ground_type": "soil",
"section_mode": "right_cut",
"ditch_side": "left",
"ditch_type": "l_type",
"two_stage_slope": False,
"rock_boundary_offset_m": -1.5,
}
def _section() -> dict:
design = {
"paved": False,
"status": "ok",
"pavement_suggested": True,
**USER_VALUES,
**FED_BACK,
}
return {"chainage_m": 100.0, "samples": [], "design": design}
def _install_fakes(monkeypatch) -> dict:
"""지형·계획고·포장구간을 가짜로 — 이 시험의 대상은 「값을 베껴 넣는 자리」다."""
seen: dict = {}
def fake_compute(samples, elevation, **kwargs):
seen.update(kwargs)
# 계산이 내는 값만 담은 새 설계 — 사용자 값은 하나도 없다(실제 엔진과 같다).
return {
"paved": True,
"cut_area_m2": 1.0,
"fill_area_m2": 2.0,
**{
key: kwargs[key]
for key in (
"ground_type",
"section_mode",
"ditch_side",
"ditch_type",
"two_stage_slope",
"rock_boundary_offset_m",
)
if key in kwargs
},
}
monkeypatch.setattr(design_mod, "pavement_ranges", lambda root: [(0.0, 200.0)])
# 472-4 ② — [저장] 다시 셈은 측점 묶음(Node) 한 번 · 그 자리를 갈아 끼움
monkeypatch.setattr(
design_mod,
"compute_cross_designs",
lambda jobs, standard: [fake_compute(s, z, standard=standard, **kw) for s, z, kw in jobs],
)
monkeypatch.setattr(design_mod, "design_elevation_from_longitudinal", lambda lon, ch: 100.0)
monkeypatch.setattr(design_mod, "curve_widening_args", lambda section: {})
return seen
def test_포장_재계산_뒤에도_사용자_값이_남는다(monkeypatch):
_install_fakes(monkeypatch)
sections = [_section()]
changed = design_mod.enforce_pavement_ranges({}, sections, Path("."), None)
assert changed == 1, "재계산이 아예 안 돌았음 — 시험 전제가 깨짐"
result = sections[0]["design"]
for key, value in USER_VALUES.items():
assert result.get(key) == value, f"{key} 가 재계산에서 사라짐"
assert result["status"] == "ok"
assert result["pavement_suggested"] is True
assert result["paved"] is True, "포장 구간인데 포장으로 안 바뀜"
def test_되먹임_값이_인자로_실제로_들어간다(monkeypatch):
"""①갈래는 「인자로 넣어」 지킨다 — 안 넣으면 기본값으로 되돌아간다."""
seen = _install_fakes(monkeypatch)
sections = [_section()]
design_mod.enforce_pavement_ranges({}, sections, Path("."), None)
for key, value in FED_BACK.items():
assert seen.get(key) == value, f"{key} 가 재계산 인자로 안 들어감(넘긴 값: {seen.get(key)})"
assert seen.get("paved") is True, "포장 구간 재계산은 포장으로 켜야 함"