Files
Aislo/resources/tester/test_753_1_option_off.py
T
eomsangdonandClaude Opus 5.5 a36092fad8 feat(753-1): 옵션으로 빠진 줄 표시 — 엔진 줄 덧칸 옵션꺼짐
- 새 master_gate: 호표 줄 수량 0 이 만약 간 갈래(상수 0) 탓이면 옵션꺼짐 true
  (고르기 · 수 입력 문턱 · 중간값 거침) · 입력 0 · 표 칸 0 · 원문 0 = 칸 없음
- master_formula.run 한 곳에서 붙임 → M01 /calc · SK 셈 답 줄 저절로 실림
- master_sheet_line: /text · M02 sheet 줄에 같은 칸(KEYS)
- M01 정본 자료 안 고침 · 금액 · 차례 · cid 그대로(돈 로직 1,440 전후 같음)
- 지킴 시험 test_753_1_option_off(GC000211 폼타이 · 진짜 0 · 문턱 · 금액 · /text · SK)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:03:04 +09:00

109 lines
4.5 KiB
Python

"""옵션으로 빠진 줄 표시(PLAN 753-1 · 요구 588-4) — 엔진 줄 덧칸 `옵션꺼짐`.
M01 셈(`/calc`) · 계산서(`/text` · `master_sheet_line.annotate`) · SK 셈(`M02_Sangeun_Calc.run`)이
같은 엔진 줄을 씀 · 금액 그대로 · 진짜 0(입력 0 · 표 칸 0)은 표시 없음.
"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "master_data/scripts"))
import check_master as cm # noqa: E402
import master_formula as mf # noqa: E402
import master_gate as mg # noqa: E402
import master_sheet_line as msl # noqa: E402
import master_text as mtx # noqa: E402
import pytest # noqa: E402
from M01_MasterData import M01_MasterData_Store as m01 # noqa: E402
from M02_MasterTemplete import M02_Labor_Doc as labor # noqa: E402
from M02_MasterTemplete import M02_Sangeun_Calc as calc # noqa: E402
from M02_MasterTemplete import M02_Sangeun_Doc as sd # noqa: E402
FORM = "GC000211" # 6-3-1 합판거푸집 — 폼타이 12.7 · 9.5 · 7.9 규격마다 줄
TIES = ("폼타이 12.7㎜", "폼타이 9.5㎜", "폼타이 7.9㎜")
CASES = [
({"폼타이": "아님"}, set(TIES)),
({"폼타이": "사용", "폼타이규격": "12.7㎜"}, {"폼타이 9.5㎜", "폼타이 7.9㎜"}),
({"폼타이": "사용", "폼타이규격": "9.5㎜"}, {"폼타이 12.7㎜", "폼타이 7.9㎜"}),
]
@pytest.fixture(scope="module")
def master():
files = cm.load()
return files, mf.Master(files)
def _given(whole, key, **over):
return {**cm.시험입력(whole.logic(key)), **over}
@pytest.mark.parametrize("over,off", CASES)
def test_engine_marks_unpicked_ties(master, over, off):
_, whole = master
got = mf.run(whole, FORM, _given(whole, FORM, **over))
marked = {x["이름"] for x in got["줄"] if x.get(mg.KEY)}
assert marked == off
def test_real_zero_not_marked(master):
_, whole = master
got = mf.run(whole, FORM, _given(whole, FORM, 구멍땜=0))
holes = [x for x in got["줄"] if "구멍땜" in x["이름"]]
assert holes and all(x["수량"] == 0 and not x.get(mg.KEY) for x in holes)
# 조건이 참이고 표 칸이 0 인 줄(GC000480 측량초급기능사) — 진짜 0
got = mf.run(whole, "GC000480", cm.시험입력(whole.logic("GC000480")))
line = got["줄"][3]
assert line["수량"] == 0 and not line.get(mg.KEY)
def test_numeric_threshold_marks_other_machine(master):
_, whole = master
got = mf.run(whole, "GC000187", cm.시험입력(whole.logic("GC000187")))
pairs = [(got["줄"][n], got["줄"][n + 1]) for n in (3, 5, 7)]
for a, b in pairs: # 타설길이 문턱으로 둘 중 하나 — 0 인 쪽만 표시
assert {bool(a.get(mg.KEY)), bool(b.get(mg.KEY))} == {True, False}
assert all(bool(x.get(mg.KEY)) == (x["수량"] == 0) for x in (a, b))
def test_money_same_without_mark(master, monkeypatch):
_, whole = master
for over, _ in CASES:
given = _given(whole, FORM, **over)
on = mf.run(whole, FORM, given)
with monkeypatch.context() as m:
m.setattr(mg, "tag", lambda *a: a[2])
off = mf.run(whole, FORM, given)
assert on["계"] == off["계"]
assert [x["금액"] for x in on["줄"]] == [x["금액"] for x in off["줄"]]
def test_never_marks_nonzero(master):
_, whole = master
for key in ("GC000211", "GC000002", "GC000216", "GC000563", "GC000187"):
got = mf.run(whole, key, cm.시험입력(whole.logic(key)))
assert all(x["수량"] == 0 for x in got["줄"] if x.get(mg.KEY))
def test_sheet_text_carries_mark(master):
files, whole = master
given = _given(whole, FORM, 폼타이="사용", 폼타이규격="9.5㎜")
got = msl.annotate(files, FORM, given, mtx.lines(files, FORM, given))
lines = {x["이름"]: x for g in got["groups"] for x in g["줄"]}
assert lines["폼타이 9.5㎜"].get(mg.KEY) is None
assert lines["폼타이 12.7㎜"][mg.KEY] is True and lines["폼타이 7.9㎜"][mg.KEY] is True
assert mg.KEY in msl.KEYS # M02 `/logic-lib/sheet` 도 같은 칸
def test_sk_calc_carries_mark():
whole = m01.loaded()[1]
doc = {"키": "SK-000001", "이름": "시험", "단위": "㎡", "바탕": {"로직": FORM}}
clean = sd.clean(doc, None, whole)
got = labor._json(calc.run(clean, whole, {"폼타이": "사용", "폼타이규격": "12.7㎜"}))
marked = {x["cid"] for x in got["줄"] if x.get(mg.KEY)}
assert marked == {"material:폼타이 9.5㎜#0", "material:폼타이 7.9㎜#0"}
base = labor._json(calc.run(clean, whole))
assert base["기준"]["계"] == pytest.approx(got["기준"]["계"])