Files
Aislo/resources/tester/test_816_1_dump_1ton.py
T
eomsangdonandClaude Sonnet 5.5 78f9d941b0 test(816-4): 진짜 마스터 별칭 내용 · 수에 기댄 시험 고침 — 별칭 칸을 시험 안에서 비운 사본으로
- 까닭: 요구 776 별칭 여덟(덤프자동덮개 · 크레인(트럭) · 엔진톱 등)이 마스터 기계.json 에 들어감 · 앞으로도 늘어남
- test_815_1: 별칭 칸 비우는 `no_aliases` 추가 · test_alias_machine 별칭 전/후를 비운 사본에서
- test_812_9 · test_816_2: 별칭 없는 사본(autouse)에서 봄 · 816_2 에 「별칭이 있으면 별칭 먼저」 한 줄 추가
- test_815_2: 별칭 다섯 = 부분집합 확인(더 있어도 통과)
- test_816_1 · test_816_3: 별칭 있든 없든 통과하게 비움
- 제품 코드 · 마스터 자료 그대로

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 20:20:33 +09:00

92 lines
4.0 KiB
Python

"""816-1 지킴 — 기계표 「덤프트럭(4륜구동) 1ton」(산림품셈 10-9 · 요구 769-1 · 770-1).
(a) 기계표 줄 · 값 — 원문 산림품셈 10-9 · 가격 28,000 천원(조달청 등재가격 기본값) · 키대장
(b) GF000145(4륜구동 1톤 덤프트럭 시간당 기계경비)가 그 줄 가격을 읽음 · 계수 · 연료 · 조종원은 2.5 ton
(c) 잇기 — 가져온 「덤프트럭 1.0Ton · 1톤 · 1ton」 → 새 줄 · 「덤프트럭 2.5ton」 → EQ000069 그대로
(d) 시간당 경비 한 길 — `M02_Machine_Hourly.hourly` · `M02_Doc_Import.hourly_link` = GF000145
"""
from __future__ import annotations
import importlib
import sys
from decimal import Decimal
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
for p in (ROOT, ROOT / "resources/master_data/scripts"):
if str(p) not in sys.path:
sys.path.insert(0, str(p))
from M01_MasterData import M01_MasterData_Store as m01 # noqa: E402
from M02_MasterTemplete import M02_Doc_Import as di # noqa: E402
from M02_MasterTemplete import M02_Machine_Find as mf # noqa: E402
from M02_MasterTemplete import M02_Machine_Hourly as mh # noqa: E402
from test_815_1_import_link import no_aliases # noqa: E402 — M01 별칭 칸 임시
ml = importlib.import_module("master_doc_link")
mc = importlib.import_module("master_doc_calc")
NEW, OLD = "EQ000655", "EQ000069"
def _whole():
return m01.loaded()[1]
def _docs() -> dict:
return ml.load_all()
def test_row() -> None:
row = _whole().get(NEW)
assert (row["원문"], row["원문번호"], row["상세구분"]) == ("산림품셈", "10-9", "덤프트럭")
assert (row["이름"], row["규격"]) == ("덤프트럭(4륜구동)", "1ton")
assert row["값"] == {"가격": 28000} and row["출처"]["가격"] == "산림품셈 10-9"
assert "4륜구동 1톤 덤프트럭" in row["비고"]
def test_gf145_reads_price() -> None:
doc = _docs()["GF000145"]
reads = {(v["연결"].get("키"), v["연결"].get("칸")) for v in doc["변수"]}
assert (NEW, "가격") in reads and (OLD, "가격") not in reads
assert {
(OLD, c) for c in ("상각비계수", "정비비계수", "관리비계수", "주연료", "조종원")
} <= reads
got = mc.calc(doc, ml.Links(_whole(), _docs()))
old = _whole().get(OLD)["값"]
loss = int(Decimal(28000 * 1000) * sum(Decimal(str(old[k])) for k in ("상각비계수", "정비비계수", "관리비계수")) / Decimal(10**7)) # fmt: skip
assert got["셈됨"] and got["경비"] == loss == 8307
def test_find() -> None:
with no_aliases("EQ"): # 진짜 마스터 별칭 있든 없든 같은 결과
_find()
def _find() -> None:
for spec in ("1.0Ton", "1톤", "1ton"):
got = mf.find("덤프트럭", spec)
assert got["키"] == NEW and got["판정"] == mf.LINKED, spec
assert mf.find("덤프트럭", "2.5ton")["키"] == OLD
assert mf.find("덤프트럭", "15Ton")["키"] == "EQ000074"
def test_hourly_one_way() -> None:
assert mh.logic_of("10-9")["키"] == "GF000145"
assert mh.logic_of("0602-0025")["키"] != "GF000145" # 2.5 ton = 일반 식 그대로
got = mh.hourly(NEW)
doc = mc.calc(_docs()["GF000145"], ml.Links(_whole(), _docs()))
assert got["ok"] and got["로직"] == "GF000145"
assert [got[k] for k in ("노무비", "재료비", "경비", "계")] == [float(doc[k]) for k in ("노무비", "재료비", "경비", "계")] # fmt: skip
link = di.hourly_link(NEW, "경비")
assert link["키"] == "GF000145" and "기계" not in link["입력"] and link["칸"] == "경비"
def test_gf283_option() -> None:
"""10-9-1 덤프트럭 운반 「1톤 4륜구동」 옵션 = GF000145 값으로 셈."""
links = ml.Links(_whole(), _docs())
one = mc.calc(_docs()["GF000283"], links, {"덤프트럭": "1톤 4륜구동"})
big = mc.calc(_docs()["GF000283"], links, {"덤프트럭": "0602-0025"})
assert one["셈됨"] and big["셈됨"] and one["노무비"] == big["노무비"] # 조종원 = 2.5 ton
assert one["경비"] > big["경비"] # 손료 = 1 톤 가격 28,000 > 2.5 ton 21,982