"""10-A — 우리가 정한 SW 규칙을 화면에 드러내기(B05·B09 몫) · 2026-09-14 사용자 확정 · PLAN 12장. 번호는 PLAN 10장 「✅ 사용자 확정 — SW 규칙」 줄 차례. 문구 못박을 셋(①②③)은 글자 그대로 봄. """ import json from pathlib import Path ROOT = Path(__file__).resolve().parents[2] def _read(path: str) -> str: return (ROOT / path).read_text(encoding="utf-8") def test_11_일반관리비_문구_못박음() -> None: from B09_Estimation.B09_Estimation_CostSheet import FIELD_HINTS assert FIELD_HINTS["overhead_class"] == ( "임도가 어느 쪽인지 규정이 없어 (주)공사 기본 · 칸에서 바꿀 수 있음" ) def test_13_모르타르_배합_교차_참조_문구() -> None: from B09_Estimation.B09_Estimation_WorkItems_AX import MORTAR_MIX, WORK_ITEMS assert WORK_ITEMS[MORTAR_MIX]["basis"].startswith( "산림품셈에 배합 절이 없어 건설품셈 [건축] 9-1-1 을 씀(교차 참조)" ) def test_15_폐기물처리비는_법정경비_밑수에_안_넣음() -> None: from B09_Estimation.B09_Estimation_CostSheet import FIELD_HINTS assert "법정경비 밑수(직접공사비·노무비)에는 안 넣음" in FIELD_HINTS["waste_placement"] def test_17_옹벽_높이_기본값_문구와_칸_밑_근거() -> None: types = json.loads(_read("B05_Profile/B05_Profile_Structure_Types.json")) wall = next(t for t in types["types"] if t["type_id"] == "retaining_wall") height = next(o for o in wall["options"] if o["key"] == "height_m") assert height["default_basis"] == "기본값 · 소광리 도면 H=2.0 · 바꿀 수 있음" # 칸 밑 근거 한 줄 — 등록부 폼이 `default_basis` 를 칸 밑에 그림 assert "field(label, input, option.default_basis)" in _read( "B05_Profile/B05_Profile_UI_Structures_Panel.ts" ) def test_19_시설_저장은_폼에_없는_칸을_그대로_둠() -> None: assert "폼에 없는 칸(집계표·구조물도로 적은 값)은 그대로 둠" in _read( "B05_Profile/B05_Profile_UI_Drainage_Facility.ts" ) def test_20_막힌_사유는_아래_단계_것을_그대로() -> None: assert 'hint(L("B09_Sheet_Missing_Passed"))' in _read( "B09_Estimation/B09_Estimation_UI_Tab_Bill.ts" ) assert "그대로 옮김 — 여기서 새로 짓지 않음" in _read("ui_template/ui_template_locale_b3.ts")