"""판정표가 안 읽은 줄 — 자동으로 「못 붙은 줄」 목록에 (2026-09-14 브레인 · ㉰ 앞 뿌리 고침). 판정표는 적어 둔 줄만 읽음 → 나머지 줄(거푸집·철근·뚜껑·설치비·비고 …)이 사유 없이 사라지고 있었음 (12-15 · 12-04 비고 · 12-34-1 레미콘). 표를 넣을 때마다 손으로 사유를 달면 다음 표가 또 샘. ⇒ 판정표 공통 한 곳에서 「읽힌 줄 밖의 줄」 을 올림. ㉠ 넘치지 않게 — 자원 머리(첫 줄 머리 모양) · 빈 줄 · 다짐기처럼 다른 줄이 쓴 줄은 뺌 ㉡ 손 사유와 안 겹치게 — 공종 사유 한 줄(`known_gap_note`)이 이미 적은 이름은 안 올림 """ from __future__ import annotations from B09_Estimation.B09_Estimation_KnownGaps import known_gap_note from B09_Estimation.B09_Estimation_UnitPrice import cached_build def _left(build, code: str) -> str: return " / ".join(build.unattached.get(code, [])) def test_집수정_표의_거푸집_철근_뚜껑_설치비가_목록에_뜸() -> None: left = _left(cached_build(), "FP-12-15") for name in ("거 푸 집", "철근", "집수정 뚜껑", "설치비"): assert name in left, (name, left) assert "봉상후렉시블" not in left, left # 구체 갈래가 쓴 다짐기 줄은 안 올림(㉠) def test_합판거푸집_비고는_글과_함께_뜨고_손_사유에_있는_사용고재는_안_겹침() -> None: left = _left(cached_build(), "FP-12-04") assert "비고" in left and "7m" in left, left assert "사용고재" in known_gap_note("FP-12-04") and "사용고재" not in left, left # ㉡ assert "횟수별" not in left, left # 머리 줄(㉠) def test_토사면_고르기_자원_머리_줄은_안_뜸() -> None: left = _left(cached_build(), "FP-09-19-01") assert "보통인부 (인)" not in left and "공기압축기 (시간)" not in left, left def test_12_34_1_레미콘_별도계상_줄은_이름으로_뜸() -> None: left = _left(cached_build(), "FP-12-34-01") assert "콘크리트(레미콘)" in left and "자재" not in left.split(" / "), left def test_날개벽_면벽_맨홀은_자동_목록이_맡고_손_사유는_줄_목록을_안_되풀이() -> None: build = cached_build() assert "원형거푸집" in _left(build, "FP-12-16") and "기초잡석" in _left(build, "FP-12-12") assert "기초잡석" in _left(build, "FP-12-13") for code in ("FP-12-12", "FP-12-13", "FP-12-16"): assert "거푸집" not in known_gap_note(code), code assert "30%" in known_gap_note("FP-12-12") # 줄이 아닌 [주] 는 손 사유로 남음