Files
Aislo/resources/tester/test_778_2_hopyo_machine_link.py
T
eomsangdonandClaude Opus 5.5 42230cf3d6 fix(778-2): 기계 잇기 — 연료 · 조종원 없는 기종은 그 기계경비 기초(272 · 273 · 276)
- SkPatch SOLO · _mach_logics: (주연료, 조종원) 없는 기종 = GC000273 손료만 · GC000272 조종원 없음 · GC000276 연료 없음(M01 로직이 부르는 것과 같음) · 까닭 = 부착용 집게를 GC000268 로 이으면 「없는 요소 MO:None」 셈 오류(ORCA 북부청사방 단산59 실측)
- EQ 630 중 570 셈 됨(남은 60 = M01 기계 자료 빈칸 · 이 걸음 밖) · 여덟 파일 장비 더한줄 180 줄 모두 셈 됨 · 기초 80 · SK 37 · 고름 대기 89 그대로
- test_778_2: 부착용 집게 = GC000273 · 셈 됨

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:11:00 +09:00

80 lines
4.5 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.
"""못옮김 기계 잇기 = 기계경비 기초 로직 줄(PLAN 778-2 · 분석 621-B 4-2).
EQ 키 바로 더한줄은 셈 오류 → 사용자 잇기 `{id, 기계: EQ…}` = SK 더한줄
`{종류: 로직, 로직: 기계경비 기초, 입력값: {기계: 기계 번호}}` · SK 셈 됨(그 기계 시간당 기계경비 ×
엑셀 시간 × 배) · 갈래 다른 키 · 없는 키 = LinkError. 고르기 목록 밖 기계 = 서버 둘째 요청 ·
지은 문맥 밖 스레드에도 셈 됨(마스터를 셈에 넘김). master 읽기만.
"""
import threading
import pytest
from M01_MasterData import M01_MasterData_Store as m01
from M02_MasterTemplete import M02_Hopyo_Combine as combine
from M02_MasterTemplete import M02_Hopyo_SkPatch as skpatch
from M02_MasterTemplete import M02_Sangeun_Calc as calc
from M02_MasterTemplete import M02_Sangeun_Router as sangeun_router
from resources.tester.test_m02_hopyo_excel import client # noqa: F401
BASE = "GC000267" # 바탕 아무 기초(시간 단위) — 셈만 봄
def _plan(whole) -> skpatch._Plan:
doc = {"키": "SK-000000", "이름": "견줌", "단위": "시간", "바탕": {"로직": BASE},
"입력값": {}, "덮개": {}, "뺀줄": [], "자재표시": {}, "더한줄": []} # fmt: skip
work = skpatch._Plan(doc, whole)
one = {"id": "기계:굴착기", "갈래": "기계", "이름": "굴착기", "규격": "0.6", "단위": "시간",
"수량": 0.25, "글": "엑셀만 장비 — 기계 못 찾음", "후보": []} # fmt: skip
work.lost = [one, {**one, "id": "기계:굴착기#1"}]
return work
def test_기계_잇기_뒤_SK_셈_됨():
whole = m01.loaded()[1]
work = _plan(whole)
work.link([{"id": "기계:굴착기", "기계": "EQ000026"}])
add = work.doc["더한줄"][-1]
assert add["종류"] == "로직" and add["로직"] in combine.MACHINE_SET - {
combine.MACHINE["굴착기"]
}
assert add["입력값"] == {skpatch.MACH_IN: "0211-0060"} and "요소" not in add
assert add["수량"] == pytest.approx(0.25 * work.tb) and add["단위"] == "시간"
ran = calc.run(work.doc, whole) # 전 = 「Decimal × dict」 셈 오류
line = next(x for x in ran["줄"] if x.get("cid") == "add:#0")
assert float(line["금액"]) > 0
one = {"종류": "로직", "로직": add["로직"], "입력값": add["입력값"], "수량": 1}
hour = calc.run({**work.doc, "바탕": None, "더한줄": [one]}, whole)["기준"]
assert float(hour["경비"]) == 27120 # 굴착기(타이어) 0.6㎥ 시간당 경비(엑셀 14-6 과 같음)
# 무한궤도 = 굴착기(무한궤도) 기계경비 · 갈래 다른 키 · 없는 키 = 틀림
work.link([{"id": "기계:굴착기#1", "기계": "EQ000019"}])
assert work.doc["더한줄"][-1]["로직"] == combine.MACHINE["굴착기"]
# 연료 · 조종원 없는 부속(부착용 집게 0.6∼0.8) = 손료만 기초(GC000273) · 셈 됨
solo = _plan(whole)
solo.link([{"id": "기계:굴착기", "기계": "EQ000437"}])
assert solo.doc["더한줄"][-1]["로직"] == skpatch.SOLO[(False, False)]
assert calc.run(solo.doc, whole)["기준"] is not None
work.lost = _plan(whole).lost
with pytest.raises(skpatch.LinkError):
work.link([{"id": "기계:굴착기", "기계": "MT000010"}])
with pytest.raises(skpatch.LinkError):
work.link([{"id": "기계:굴착기", "기계": "EQ999999"}])
def test_목록_밖_기계_서버_둘째_요청에도_셈(client): # noqa: F811
m01.loaded() # 마스터 = 이 스레드에서 지음 · 요청 = 다른 스레드(문맥 안 따라감)
client.app.include_router(sangeun_router.router)
one = {"종류": "로직", "로직": "GC000268", "입력값": {skpatch.MACH_IN: "0211-0060"},
"이름": "굴착기(타이어) 0.6㎥", "단위": "시간", "수량": 1} # fmt: skip
doc = {"키": "SK-000000", "이름": "t", "단위": "시간", "바탕": None, "입력값": {}, "덮개": {},
"뺀줄": [], "자재표시": {}, "더한줄": [one]} # fmt: skip
for _ in range(2):
got = client.post("/api/m02/layers/personal/sangeun/calc", json={"문서": doc})
assert got.status_code == 200, got.text
assert got.json()["기준"]["경비"] == 27120, got.json().get("까닭")
whole, out = m01.loaded()[1], {} # 지은 문맥 밖 스레드(서버 요청 스레드 풀과 같음)
run = threading.Thread(target=lambda: out.update(calc.run(doc, whole)))
run.start()
run.join()
assert out["기준"] and float(out["기준"]["경비"]) == 27120, out.get("까닭")