- 정본 로직(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>
120 lines
5.3 KiB
Python
120 lines
5.3 KiB
Python
"""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("기호")]
|