Files
Aislo/resources/tester/test_802_2_convert.py
T
eomsangdonandClaude Opus 5.5 3caa3e2193 fix(840-5): 조종원 노임 시간 환산 = 1/8 × 16/12 × 25/20(요구 864 · 경쟁사와 같게) — 기계 식 열 개가 계수표 CC000336 시간환산 · 상여 · 휴지 세 줄을 읽음
- 정본 로직(08장 아홉 · 산림 10장 4륜 덤프) 시간환산 중간 식 = 세 줄 분자 ÷ 분모 곱(713-4 전 꼴) · 수식 문서 = 빌더 변환으로 다시 지음(변환 대조 1,520 같음 · 채택 1 원 셋 = 같은 까닭 714-3)
- 체인톱 GF000337 은 그대로(시간환산 = 하루 연료 · 손료 → 시간 · 조종원 없음)
- 짝: 기계 양식 시간환산(M01 lists = 세 줄 곱) · master_machine_coef ↔ common_util_machine_coef 기본값 5/24 · 기계 덮음 새 조종원 줄 꼴(master_doc_cover ↔ common_util_formula_doc_cover) · 기호 이름 상여분자 · 상여분모 · 휴지분자 · 휴지분모
- 전후: 조종원 기계 295 대 노무비만 ×5/3 · 조종원 없는 기계 불변 · 로직 1,520 중 기계 부르는 431 만 오름
- B09 는 안 고침(계수표 세 줄을 스스로 곱함 · 두 번 곱 0)

낡은 시험 고침: 713-4 지킴을 세 계수 꼴로 · masterdata_check · 796-1 · 821-2 · 821-4 · 822-2 · 836-1 · 839-1 기대값 = 조종원 5/24 · 802-2 채택 차이 셋 · 821-3 줄 쌓기 내 기계 = 836-2 뒤 개인 층 자동 따라옴(옛 단가새값 · 단가갱신 기대 걷음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-15 16:10:24 +09:00

120 lines
5.3 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.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("기호")]