- 고름 대기 후보 앞 셋에 그 기초와 줄마다 견준 `줄비교`(같음 · 품다름 · 엑셀만 · 기초만 · 1 단위 품 · 못옮김) — 고르면 만드는 SK 와 같은 셈(`_Plan` 기록) · 판정 · 순위 · 미리 고름 그대로 - 못옮김 `후보` · 안 이은 기계 줄 `남은줄[].후보` = M01 요소 셋(새 `M02_Hopyo_Elem` — 이름 · 규격 점수 › 엑셀 단가 가까운 차례) - 단위 모듈 짝(master_unit.py ↔ master_unit_swap.ts) 별칭 hr = 시간 · 개수 묶음에 개소 — 거울 시험 사례 셋 더함 - 실측(여덟 파일): 고름 대기 89 중 1위 줄비교 72(셋 중 하나 82) · 골든 1위 163 그대로 · 판정 수 그대로 · 개 ↔ 개소 1 블록 견줌 풀림 · 못옮김 후보 8/9 · 기계 줄 후보 32/32 · M01 로직 3,992 값 전후 같음 - 새 지킴 시험 test_746_1_hopyo_compare Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
105 lines
4.8 KiB
Python
105 lines
4.8 KiB
Python
"""746-1 지킴 — 불러오기 고름 대기 후보 블록 줄비교 · 못옮김 · 기계 줄 M01 요소 후보 · 단위 별칭(요구 585).
|
|
|
|
고름 대기 블록(북부청 임도 실물 엑셀 · 읽기만) = 판정 · 후보 차례 그대로 + 앞 셋 `줄비교`(같음 · 품다름 · 엑셀만 ·
|
|
기초만 · 엑셀 품 = 엑셀 지문 품) · 그 기초로 고르면 만드는 SK 와 같은 셈(더한줄 · 뺀줄 수) · 요소 후보 셋 ·
|
|
hr = 시간 · 개소 = 개(같은 성격). 쓰기 없음 · master_data 원본 그대로.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from M01_MasterData import M01_MasterData_Store as m01
|
|
from M02_MasterTemplete import M02_Hopyo_Elem as elem
|
|
from M02_MasterTemplete import M02_Hopyo_Finger as finger
|
|
from M02_MasterTemplete import M02_Hopyo_Match as hm
|
|
from M02_MasterTemplete import M02_Hopyo_Ours as ours
|
|
from M02_MasterTemplete import M02_Hopyo_Sangeun as sg
|
|
from M02_MasterTemplete import M02_Hopyo_SkLink as sklink
|
|
from M02_MasterTemplete import M02_Hopyo_SkPatch as skp
|
|
from M02_MasterTemplete import M02_Hopyo_Verdict as verdict
|
|
from resources.tester import helper_m02_hopyo_golden as golden
|
|
from resources.tester.test_m02_hopyo_excel import master_hash
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "resources/master_data/scripts"))
|
|
import master_unit as mu # noqa: E402
|
|
|
|
FILE, BLOCK = "북부청임도", 38 # 고름 대기 · 1위와 견줌 되는 블록
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def wait():
|
|
before = master_hash()
|
|
if not ours.ready():
|
|
ours.build()
|
|
blocks, first = sg.calls(golden.read(FILE))
|
|
block, line = blocks[BLOCK], first[BLOCK]
|
|
entry = verdict.block(block, line, hm.targets())
|
|
got = skp.plan(entry, block, line, m01.loaded()[1])
|
|
yield {"entry": entry, "block": block, "line": line, "plan": got}
|
|
assert master_hash() == before
|
|
|
|
|
|
def test_판정_후보_차례_그대로_앞_셋_줄비교(wait):
|
|
got, entry = wait["plan"], wait["entry"]
|
|
assert got["갈래"] == skp.WAIT
|
|
assert [c["로직"] for c in got["후보"]] == [c["로직"] for c in entry["후보"][: len(got["후보"])]]
|
|
assert all("줄비교" in c for c in got["후보"][: skp.COMPARE])
|
|
assert all("줄비교" not in c for c in got["후보"][skp.COMPARE :])
|
|
first = got["후보"][0]["줄비교"]
|
|
assert first and first["줄"]
|
|
assert sum(first["수"].values()) == len(first["줄"])
|
|
assert {x["꼴"] for x in first["줄"]} <= set(skp.LOOKS)
|
|
|
|
|
|
def test_줄비교_엑셀_품_지문_그대로_고르면_같은_셈(wait):
|
|
first = wait["plan"]["후보"][0]
|
|
rows = first["줄비교"]["줄"]
|
|
efp = finger.excel(wait["block"], wait["line"])
|
|
labor = {t: x["품"] for t, x in efp["인력"].items() if x.get("품")}
|
|
for x in rows:
|
|
if x["갈래"] == "인력":
|
|
assert x["엑셀"] == pytest.approx(labor.get(x["이름"]) or None), x
|
|
assert x["단위"] == "인"
|
|
if x["꼴"] == "같음":
|
|
assert x["엑셀"] == pytest.approx(x["기초"], rel=0.01), x
|
|
if x["꼴"] == "엑셀만":
|
|
assert x["엑셀"] and not x["기초"]
|
|
if x["꼴"] == "기초만":
|
|
assert x["기초"] and not x["엑셀"]
|
|
made = skp.plan(
|
|
wait["entry"], wait["block"], wait["line"], m01.loaded()[1], {"로직": first["로직"]}
|
|
)
|
|
gone = sum(1 for x in rows if x["꼴"] == "기초만" and x["갈래"] != "자재")
|
|
assert len(made["뺀줄"]) == gone
|
|
assert made["못옮김"] == first["줄비교"]["못옮김"]
|
|
|
|
|
|
def test_요소_후보_셋():
|
|
got = elem.labor("작업반장")
|
|
assert 0 < len(got) <= elem.TOP and {x["이름"] for x in got[:2]} == {"작업반장"}
|
|
assert all(x["키"].startswith("LB") and x["단가"] for x in got)
|
|
got = elem.machines("굴착기 0.7㎥")
|
|
assert got and all(x["키"].startswith("EQ") and "굴착기" in x["이름"] for x in got)
|
|
got = elem.materials("시멘트", "kg")
|
|
assert got and all(x["키"].startswith("MT") for x in got) and len(got) <= elem.TOP
|
|
lost = {"갈래": "기계", "이름": "굴착기", "규격": "0.7"}
|
|
assert elem.lost(lost)[0]["키"].startswith("EQ")
|
|
|
|
|
|
def test_안_이은_기계_줄_EQ_후보():
|
|
line = {"차례": 0, "이름": "굴착기(타이어)", "규격": "0.7㎥", "단위": "hr", "갈래": "기계"}
|
|
got = sklink.left(line, None)
|
|
assert got["까닭"] == sklink.WHY["기계"]
|
|
assert got["후보"] and all(x["키"].startswith("EQ") for x in got["후보"])
|
|
|
|
|
|
def test_단위_별칭_hr_시간_개소_개():
|
|
assert mu.plain("hr") == mu.plain("시간") and mu.plain("HR") == "시간"
|
|
assert mu.same_kind("개소", "개") and mu.swap("개소", "개")["배"] == 1
|
|
assert mu.swap("10개소", "개")["배"] == 10 and mu.swap("hr", "시간")["계수"] is None
|
|
assert mu.swap("조", "개소")["계수"] == "사용자" # 조는 묶음 밖 그대로
|