"""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.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 >= 1519 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["옵션 같음"] >= 18700 and info["옵션 다름"] == info["채택된 차이"] == 1 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] == [("GC000100", "지역=경북", True)] 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["요약"]["저장"] >= 1519 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("기호")]