Files
Aislo/resources/tester/test_b08_ancillary.py
T
eomsangdonandClaude Opus 5 d7cb14f416 test(B08): tmp/tests 중 tester 에 없던 47 개를 resources/tester 로 옮김
tmp/ 가 창끼리 안 건너가는 것이 확정돼(랩탑이 시간 두고 두 번 확인) 시험·예외가
저절로 건너가도록 git 안으로 옮김. 사용자 확정.

- 내용은 하나도 안 고침 — 자리만 옮김. tmp/tests 는 남겨 둠.
- 같은 이름이 이미 있던 64 개는 랩탑 것을 그대로 두고 건너뜀.
- helper_b05_*.js 둘은 랩탑이 .cjs 로 이미 올린 것과 **줄바꿈만 다른 같은 내용**이라
  복사본을 도로 뺌(시험이 .cjs 를 부름).
- resources/tester/ 에서 전체 1176 통과 · 29 건너뜀 · 실패 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 17:15:57 +09:00

86 lines
3.6 KiB
Python

"""부대시설 다섯 줄 — 법이 요구하는데 안 내던 것 (2026-09-09 사용자 확정 ⑬).
⚠ 겨누는 것 여섯
① 다섯 줄이 **개소를 안 넣어도 선다** — 빠진 것이 화면에 보이게
② 개소를 **지어내지 않는다** — `연장÷500` 같은 산식을 쓰지 않음
③ ⚠ 사유를 **갈라 적는다** — 「품셈에 공종이 없음」과 「개소 미입력」은 할 일이 다름
④ 법정 의무인 줄은 **그 사실이 사유에 적힌다**
⑤ 공종이 있는 하나(가설창고)는 **값이 서고 코드가 붙는다**
⑥ 인계에도 **실려 나간다** — 빼면 받는 쪽이 빠진 줄을 못 봄
"""
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT))
from B08_Quantity.B08_Quantity_Engine_Handoff import build_handoff # noqa: E402
from B08_Quantity.B08_Quantity_Engine_Preparation import ( # noqa: E402
STATUS_READY,
ancillary_rows,
build_table,
)
def (counts: dict | None = None) -> dict:
return {row["item"]: row for row in ancillary_rows(counts)}
def test_다섯_줄이_개소_없이도_선다() -> None:
rows = ()
assert set(rows) == {
"국가지점번호판",
"임도 안내판",
"차단기",
"가설창고(컨테이너)",
"수방대책 자재",
}
assert all(row["amount"] is None for row in rows.values())
def test_개소를_지어내지_않는다() -> None:
"""⚠ 임도규정이 「필요시 거리를 조정」이라 `연장÷500` 은 확정 산식이 아니다."""
for row in ().values():
assert row["amount"] is None
assert "개소가 아직 입력되지 않았습니다" in row["reason"]
def test_사유를_갈라_적는다() -> None:
"""⚠ 「품셈에 공종이 없음」과 「개소 미입력」은 **다음에 할 일이 다르다**."""
rows = ({"national_point_sign": 3})
sign = rows["국가지점번호판"]
assert sign["amount"] == 3.0
# 개소는 채워졌으니 그 사유는 사라지고, 공종이 없다는 사유만 남는다.
assert "개소가 아직 입력되지 않았습니다" not in sign["reason"]
assert "품셈에 그 이름의 공종이 없음" in sign["reason"]
def test_법정_의무가_사유에_적힌다() -> None:
rows = ()
assert "법정 의무" in rows["국가지점번호판"]["reason"]
assert "제26조제5항" in rows["국가지점번호판"]["reason"]
assert "법정 의무" in rows["임도 안내판"]["reason"]
# 차단기는 교본만 있고 법령에 없다 — 「법정」이라 적으면 거짓이 된다.
assert "법정 의무" not in rows["차단기"]["reason"]
def test_공종이_있는_하나는_값이_선다() -> None:
row = ({"site_container": 2})["가설창고(컨테이너)"]
assert (row["work_item_code"], row["amount"], row["status"]) == ("FP-11-01", 2.0, STATUS_READY)
def test_준비공_표와_인계에_함께_실린다() -> None:
"""⚠ 빼면 받는 쪽이 「빠진 줄」을 못 본다 — 값이 없어도 사유와 함께 간다."""
table = build_table({}, [], [], None, None, {"site_container": 1})
names = [row["item"] for row in table["rows"]]
assert "국가지점번호판" in names
rows = build_handoff(preparation_table=table)["work_items"]
handed = {row["name"]: row for row in rows}
assert "국가지점번호판" in handed
assert handed["국가지점번호판"]["in_bill"] is False
assert handed["가설창고(컨테이너)"]["work_item_code"] == "FP-11-01"