Files
Aislo/resources/tester/test_802_2_convert.py
T
eomsangdonandClaude Opus 5.5 2c6e49f92c fix(842-3): 범위 잡재료율 기계 둘 · 수식 빌더가 저장본 문서를 조용히 빼던 흠
- 원인: 옮김에서 펌프 준설선 EQ000552 · 553 잡재료율 「13∼18」 이 사라짐 → 옛 엔진 멈춤 · 새 계산기 셈(빈 잡품)
  → GC000268 옵션 「다름」 → 저장 밖 → 그 식을 부르는 문서 320 개가 저장본에서 지워짐(1,520 → 1,200)
- 범위 글 = 잡품 율 글 그대로(from_old · TS fromOld · check 허용) · 두 대 다시 옮김 → 까닭 「범위」 옛 칸과 같음
- 빌더 = 저장본 문서가 저장 밖으로 빠지면 멈춤 · 안 씀 · 키와 까닭 알림(lost) · 시험 802_2 에 lost 0
- 시험 822_2 범위 까닭 기대 되돌림 · 842_3 거울에 범위 값 더함
- 확인: 빌더 --check 저장 1,520 · 기본 다름 0 · 옵션 다름 3(채택) · 저장본 · 목록 같음 · 655 대 시간당(옛 자료 대 새 자료) 다름 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-15 19:25:43 +09:00

121 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""802-2 옛 M01 로직 → 수식 문서 변환 · 금액 전수 대조 지킴 시험.
빌더 `resources/master_data/scripts/build_수식문서_802_2.py`(한 번 돌림 · 2 분 안팎):
① --check — 다시 돌린 결과 = 저장본(`resources/master_data/수식문서/`) · 목록 xlsx.
② 로직 1,519 전수 기본 옵션 = 옛 엔진 노 · 재 · 경 · 계(결과) 원 단위 같음.
③ 옵션 표본 — 로직마다 고르기 입력의 모든 갈래 한 번 이상 · 같음 수 · 다름 = 목록 · 까닭 모름 0.
④ 저장 = 같은 것만(부르는 단가산출까지 · 채택된 차이 GC000100 지역=경북 재료비 1 원 빼고) · 저장본을 읽어 다시 셈해도 같음.
⑤ 791 실무 손 옮김 견본 넷(번지 · 단계 · 합밖 · 줄 자리 · 끝전 · 조정 · 값묶음)도 변환 셈 = 엑셀 금액.
"""
import importlib
import sys
from pathlib import Path
import pytest
from M01_MasterData import M01_MasterData_Store as m01 # scripts 길을 둠
HERE = Path(__file__).resolve().parent
build = importlib.import_module("build_수식문서_802_2")
mc = importlib.import_module("master_doc_calc")
ml = importlib.import_module("master_doc_link")
cv = importlib.import_module("master_doc_convert")
mf = importlib.import_module("master_formula")
mcut = importlib.import_module("master_cut")
@pytest.fixture(scope="module")
def result():
return build.build(log=lambda *a: None)
def test_빌더_check_저장본_목록_같음(result):
assert build.lost(result) == [] # 저장본 문서를 조용히 빼지 않음(842-3 뒤 · 빌더가 멈추고 알림)
assert build.check(result) == []
def test_로직_전수_기본_옵션_같음(result):
files, _ = m01.loaded()
count = sum(len(d.get("줄") or []) for d in files.values() if d.get("그룹") == "로직")
info = result["요약"]
assert info["로직"] == count >= 1513 # 813-2 지움 6
assert info["기본 같음"] == count and info["기본 다름"] == 0
assert info["변환 알림"] == 0
def test_옵션_표본_모든_갈래_한_번_이상(result):
files, _ = m01.loaded()
seen = {(x["로직"], x["옵션"]) for x in result["대조"] if x["옵션"]}
want = 0
for _, row in build.rows_of(files):
base = build.meq.given_of(_whole(), row)
for spec in row.get("입력") or []:
for opt in spec.get("고르기") or []:
if str(opt) != str(base.get(spec["이름"])):
want += 1
assert (row["키"], f"{spec['이름']}={opt}") in seen
info = result["요약"]
assert info["옵션 표본"] == want == info["옵션 같음"] + info["옵션 다름"]
assert (
info["옵션 같음"] >= 18400 and info["옵션 다름"] == info["채택된 차이"] == 3
) # 813-2: 지운 6 문서 표본 빠져 18,438 · 840-5 조종원 환산 뒤 채택 셋
def _whole():
return m01.loaded()[1]
def test_다름_목록_까닭(result):
rows = build.table_rows(result)
sheet = build.read_list()["다름"]
assert sheet[0] == list(build.HEAD) and sheet[1:] == rows
diff = [x for x in result["대조"] if not x["같음"]]
assert all(x["까닭"] != "까닭 모름" for x in diff)
# 채택된 차이(요구 714-3) — 식 속 단가산출 부름 값 = 끝수 뒤 · 재료비 1 원 · 저장은 함
assert [(x["로직"], x["옵션"], x["채택"]) for x in diff] == [
("GC000091", "지역=울산", True),
("GC000093", "지역=경북", True),
("GC000100", "지역=전북", True),
] # 840-5 조종원 1/8 × 16/12 × 25/20 뒤 — 같은 까닭 1 원 셋(옛 GC000100 경북 = 같아짐)
assert diff[0]["까닭"].startswith(build.RAW_SUB)
assert diff[0]["옛"]["재료비"] != diff[0]["새"]["재료비"]
assert abs(diff[0]["새"]["재료비"] - diff[0]["옛"]["재료비"]) == 1
assert {k: diff[0]["옛"][k] for k in ("노무비", "경비")} == {
k: diff[0]["새"][k] for k in ("노무비", "경비")
}
def test_저장_같은_것만_다시_셈(result):
saved = ml.load_all()
assert set(saved) == result["저장"]
assert "GC000100" in saved and len(saved) == result["요약"]["저장"] >= 1513
base = next(x for x in result["대조"] if x["로직"] == "GC000100" and not x["옵션"])
assert (
base["같음"]
and build.new_answer(ml.Links(_whole(), saved), saved["GC000100"]) == base["옛"]
)
for key in ("GC000211", "GC001147", "GF000294", "GC000087"):
doc = saved[key]
got = build.new_answer(ml.Links(_whole(), saved), doc)
old = next(x for x in result["대조"] if x["로직"] == key and not x["옵션"])["옛"]
assert got == old
# ── ⑤ 791 실무 견본 ────────────────────────────────────────────────────
def _semantics():
sys.path.insert(0, str(HERE))
return importlib.import_module("test_791_1_engine_semantics")
@pytest.mark.parametrize("name", ["봉화", "소광", "영월", "임도"])
def test_791_실무_견본_변환_셈_같음(name):
t = _semantics()
master, row, want = getattr(t, name)()
old = mcut.engine(master, row["키"], mf.run(master, row["키"], {}))
doc, notes = cv.convert(master, row, {})
got = mc.calc(doc, ml.Links(master, {row["키"]: doc}))
assert got["셈됨"], got["표지"]
assert {k: got[k] for k in want} == {k: old[k] for k in want} == want
assert not [x for x in notes if not x.startswith("기호")]