Files
Aislo/resources/tester/test_816_2_machine_parts.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

148 lines
6.8 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.
"""816-2 지킴 — 「후보 여럿」 기계를 같은 파일 안 구성 대조로 가름(요구 770-2 · 773-3 · 방향 장부 N1).
잣대 = 같은 파일 · 같은 때의 값끼리(손료 계수 · 가격 · 주연료 · 조종원) — 우리 기계표 값과 맞대지 않음.
(a) EST 원파일 MachMainDat 묶기 — main 기계 1,049 대 모두 구성
(b) 견본 셋 — 대형브레이카 +굴착기(1.0㎥) → 같은 파일 굴착기(무한궤도) 1.0㎥ → EQ000022 · 크레인(트럭) 10Ton →
크레인(타이어) 10Ton → EQ000128 · 굴삭기(유압식백호) 0.6㎥ → EQ000019
(c) 파일 값이 우리 표와 달라도 같은 파일 대조로 가름 · 우리 표 값과 같다는 것만으로는 안 이음 · 같은 구성
없음 · 여럿 = 그대로
(d) EST 엑셀 「기계경비」 시트 길 — 산출근거 줄 → 같은 대조 · 2016 사방 엑셀 기계 12 대 구성 읽음
"""
from __future__ import annotations
import sys
from functools import lru_cache
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
HERE = Path(__file__).resolve().parent
for p in (ROOT, HERE):
if str(p) not in sys.path:
sys.path.insert(0, str(p))
from M02_MasterTemplete import M02_Machine_Find as mf # noqa: E402
from M02_MasterTemplete import M02_San_Book as book # noqa: E402
from M02_MasterTemplete import M02_San_Emit as em # noqa: E402
from M02_MasterTemplete import M02_San_Estx as estx # noqa: E402
from M02_MasterTemplete import M02_San_Xlsx as sx # noqa: E402
from test_815_1_import_link import aliases, no_aliases # noqa: E402 — M01 별칭 칸 임시
MAIN = ROOT / "resources/knowledge/original/경쟁사 프로그램/EST Plus 2/다산소프트/2026-07-main.estx"
COMBO = ("대형브레이카", "+굴착기(1.0㎥)")
@pytest.fixture(autouse=True)
def _blank_aliases():
"""같은 파일 대조는 별칭이 없는 상태에서 봄 — 진짜 마스터 별칭 내용 · 수와 무관."""
with no_aliases("EQ"):
yield
@lru_cache(maxsize=1)
def _tables() -> dict:
return estx.tables(MAIN.read_bytes())
@lru_cache(maxsize=1)
def _main() -> dict:
res = estx.resources(_tables()).values()
return {(r["이름"], r["규격"]): r for r in res if r["표"] == "MachTitleDat"}
def _keys(name: str, spec: str, same: list | None) -> list:
return [(p["판정"], p["키"]) for p in em.machine_parts({"갈래": "기계", "이름": name, "규격": spec}, same)] # fmt: skip
def test_main_makes() -> None:
made = estx.makes(_tables())
assert len(made) == 1049 and all(m["손료"] for m in made.values())
code = next(r["Code"] for r in _tables()["MachTitleDat"] if (r["Name"], r["Size"]) == COMBO)
assert made[code] == {"손료": [[2085.0, 142069000.0], [6601.0, 28692000.0]], "주연료": 19.5, "조종원": True} # fmt: skip
assert ["굴착기(무한궤도)", "1.0㎥"] in _main()[COMBO]["같은구성"]
def test_samples() -> None:
for (name, spec), want in (
(COMBO, "EQ000022"),
(("크레인(트럭)", "10Ton"), "EQ000128"),
(("굴삭기(유압식백호)", "0.6㎥"), "EQ000019"),
):
same = _main()[(name, spec)]["같은구성"]
assert any(v == mf.MANY for v, _ in _keys(name, spec, None)), name
after = _keys(name, spec, same)
assert (mf.LINKED, want) in after and all(v != mf.MANY for v, _ in after), name
got = em.machine_parts({"갈래": "기계", "이름": "크레인(트럭)", "규격": "10Ton"}, _main()[("크레인(트럭)", "10Ton")]["같은구성"]) # fmt: skip
assert got[0]["까닭"].startswith(mf.MADE) and "크레인(타이어)" in got[0]["까닭"]
def test_alias_first() -> None:
"""별칭이 있으면 같은 파일 대조보다 먼저(크레인(트럭) 10Ton 별칭 = EQ000128) · 별칭 없으면 여럿."""
assert _keys("크레인(트럭)", "10Ton", None) == [(mf.MANY, None)]
with aliases("EQ", {"EQ000128": '"크레인(트럭) 10Ton"'}):
assert _keys("크레인(트럭)", "10Ton", None) == [(mf.ALIAS, "EQ000128")]
def test_file_values_only() -> None:
"""파일 값이 우리 표와 달라도 같은 파일 대조로 가름 · 우리 표 값과 같아도 같은 파일에 짝 없으면 그대로."""
odd = {"손료": [[9999.0, 1.0]], "주연료": 1.0, "조종원": True} # 우리 표에 없는 값
files = {
"a": ("굴착기", "1.0㎥", odd),
"b": ("굴착기(무한궤도)", "1.0㎥", odd),
"c": ("굴착기(타이어)", "1.0㎥", {**odd, "주연료": 2.0}),
}
same = mf.peers(files)
assert same["a"] == [["굴착기(무한궤도)", "1.0㎥"]]
assert _keys("굴착기", "1.0㎥", same["a"]) == [(mf.LINKED, "EQ000022")]
ours = {
"손료": [[2085.0, 142069000.0]],
"주연료": 19.5,
"조종원": True,
} # 우리 표 무한궤도 값 그대로
alone = mf.peers({"a": ("굴착기", "1.0㎥", ours), "c": ("굴착기(타이어)", "1.0㎥", odd)})
assert "a" not in alone and _keys("굴착기", "1.0㎥", alone.get("a")) == [(mf.MANY, None)]
both = mf.peers(
{**files, "c": ("굴착기(타이어)", "1.0㎥", odd)}
) # 같은 구성 둘(형식 다름) = 여럿
assert _keys("굴착기", "1.0㎥", both["a"])[0][0] == mf.MANY
def test_keep_when_unsure() -> None:
same = _main()[("굴삭기(유압식백호)", "1.0㎥;암보정")].get(
"같은구성"
) # 같은 파일 무한궤도(발파) 2,405
assert ["굴착기(무한궤도)", "1.0㎥(발파)"] in same
assert _keys("굴삭기(유압식백호)", "1.0㎥;암보정", same) == [(mf.LINKED, "EQ000022")]
assert _keys("크레인(트럭)", "10Ton", None) == [(mf.MANY, None)]
def test_excel_sheet() -> None:
rows = [
["기계경비"],
["명 칭", "규 격", "산 출 근 거"],
["1. 굴삭기", "1.0㎥", 0.0, 28259.0],
["손 료", 100000000.0, "₩×", 2038.0, "×", "10(-7)", 20380.0],
["주연료", "경유", 19.5, "ℓ", "×", 993.0, 19363.5],
["건설기계운전사", 1.0, "인", "×", 135644.0],
[],
["2. 굴삭기(무한궤도)", "1.0㎥", 0.0, 28259.0],
["손 료", 100000000.0, "₩×", 2038.0, "×", "10(-7)", 20380.0],
["주연료", "경유", 19.5, "ℓ", "×", 993.0, 19363.5],
["건설기계운전사", 1.0, "인", "×", 135644.0],
[],
]
made = sx.makes(rows)
assert made[("굴삭기", "1.0㎥")][2] == {"손료": [[2038.0, 100000000.0]], "주연료": 19.5, "조종원": True} # fmt: skip
same = mf.peers(made)[("굴삭기", "1.0㎥")]
assert same == [["굴삭기(무한궤도)", "1.0㎥"]]
assert _keys("굴삭기", "1.0㎥", same) == [(mf.LINKED, "EQ000022")]
import test_797_1a_import_flags as practice
sad = practice.FILES.get("2016사방")
if sad:
sheets = book.sheets(sad.name, sad.read_bytes())
assert len(sx.makes(sheets["기계경비"])) == 12