- 충돌 시험 셋(717-4 · 719-2 · hopyo build) = 740-1 펼침 단언 + 742-1 저장 수량 단언 합침 - 740-2 일위대가표 풍선 줄의 body(742-1 이 걷은 휘발 셈 몸) → cur Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
90 lines
4.6 KiB
Python
90 lines
4.6 KiB
Python
"""717-4 단가산출(SK) 고르기 — SK 목록 층 차례 · 고른 SK 참조 꼴 · 일위대가 줄 금액."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import re
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
from M02_MasterTemplete import M02_Labor_Ref as refs
|
||
from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
||
from M02_MasterTemplete import M02_Sangeun_Calc as calc
|
||
from resources.tester.test_m02_labor_ref import COMPANY, MINE, world # noqa: F401 — 같은 임시 층
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
M02 = ROOT / "M02_MasterTemplete"
|
||
PCT = "GC001109" # 원/㎡ · 인력 둘 + 덧줄 %
|
||
|
||
|
||
def _text(path: Path) -> str:
|
||
return path.read_text(encoding="utf-8")
|
||
|
||
|
||
def test_sk_list_layer_order_and_ref_shape():
|
||
"""목록 = 마스터 › 회사 › 개인 차례 · 종류 sangeun 만 · 고른 줄 = 참조 {층, 주인, 키}."""
|
||
pick = _text(M02 / "M02_MasterTemplete_Sangeun_Pick.ts")
|
||
order = re.search(r"LAYER_ORDER = \[([^\]]+)\]", pick).group(1)
|
||
assert [x.strip().strip('"') for x in order.split(",")] == ["system", "company", "personal"]
|
||
assert "[...scopes].sort((a, b) => rank(a) - rank(b))" in pick
|
||
assert "r.종류 === kind" in pick and 'SANGEUN_KIND = "sangeun"' in pick
|
||
assert "listLayerDocs(scopes, SANGEUN_KIND)" in pick
|
||
assert 'ref: { 층: at.층, 주인: at.층 === "system" ? null : at.주인, 키: r.이름 }' in pick
|
||
# 721-2 — SK · 일위대가 탭은 찾아 넣기 창(Find_Pick) · 줄 누름 = 참조
|
||
find = _text(M02 / "M02_MasterTemplete_Find_Pick.ts")
|
||
assert "go: take(() => opt.ref?.(x.ref, x.제목 || x.이름))" in find
|
||
assert "sangeun: true," in _text(
|
||
M02 / "M02_MasterTemplete_Hopyo_Pick.ts"
|
||
) # 일위대가 [로직 추가] → 찾아 넣기 창
|
||
store_ts = _text(ROOT / "B09_Estimation" / "B09_Estimation_UI_Store.ts")
|
||
assert '["sangeun", "단가산출"],' in store_ts and "sangeun: sangeunItems," in store_ts
|
||
# 더한줄 고르기 — 715 이음 꼴 셋(인력 · 재료 = 요소 키)
|
||
assert 'logic: (x) => done({ 종류: "로직", 로직: x.키, 입력값: {}, 수량: 1 })' in pick
|
||
assert "ref: (ref) => done({ 참조: ref, 수량: 1 })" in pick
|
||
assert "done({ 종류: e.종류, 요소: e.코드, 이름: e.이름, 단위: e.단위, 수량: 1 })" in pick
|
||
|
||
|
||
def _sk(folder, name):
|
||
with store.at(folder):
|
||
return refs.create(
|
||
"sangeun", {"이름": name, "단위": "㎡", "바탕": {"로직": PCT}, "더한줄": []}
|
||
)["이름"]
|
||
|
||
|
||
def test_list_amount_and_labor_line_holds_upper_sk(world): # noqa: F811
|
||
"""층 목록 SK 줄에 1 단위 `기준금액` · 일위대가 안 줄 수량은 저장 안 함(723-1) · 금액 = 쓰는 자리 수량 × SK 1 단위."""
|
||
from M02_MasterTemplete import M02_Labor_Doc as labor
|
||
|
||
sk = _sk(world["company"], "회사 단가산출")
|
||
with store.at(world["company"]):
|
||
rows = [r for r in store.list_all() if r["종류"] == "sangeun"]
|
||
refs.summaries(world["company"], rows)
|
||
one = calc.calc_doc(store.read("sangeun", sk)["문서"])["1단위"]["계"]
|
||
assert [r["이름"] for r in rows] == [sk]
|
||
assert rows[0]["제목"] == "회사 단가산출" and rows[0]["기준금액"] == pytest.approx(one, abs=1)
|
||
with store.at(world["personal"]):
|
||
sc = refs.create(
|
||
"precombo",
|
||
{
|
||
"이름": "일위대가",
|
||
"단위": "㎡",
|
||
"담은로직": [{"참조": {**COMPANY, "키": sk}, "수량": {"손": 3}}],
|
||
},
|
||
)["이름"]
|
||
line = store.read("precombo", sc)["문서"]["담은로직"][0]
|
||
saved, inner = line["본뜬"], [line["수량"]]
|
||
outer = {"담은로직": [{"참조": {**MINE, "키": sc}, "수량": {"손": 1}}]}
|
||
got = labor.calc(outer, {})
|
||
fed = labor.calc(outer, {f"{refs.ref_id({**MINE, '키': sc})}#0": 3})
|
||
direct = labor.calc({"담은로직": [{"참조": {**COMPANY, "키": sk}, "수량": {"손": 3}}]}, {})
|
||
# 740-1 — 회사 SK = 로직 줄 + 패치로 펼쳐 담음 · 출처 = 본뜬
|
||
assert {k: saved[k] for k in ("층", "주인", "키")} == {**COMPANY, "키": sk}
|
||
assert line["로직"] and "참조" not in line
|
||
# 742-1 — 일위대가 안 줄 수량 = 저장(사용자 입력) · 쓰는 자리 알약이 이어지면 그 값
|
||
assert inner == [{"손": 3}]
|
||
assert got["반영합"]["계"] == pytest.approx(one * 3, abs=1) # 저장 수량 3
|
||
assert direct["반영합"]["계"] == pytest.approx(
|
||
one * 3, abs=1
|
||
) # 바깥이 SK 를 손 3 으로 바로 참조
|
||
assert fed["반영합"]["계"] == pytest.approx(one * 3, abs=1) # 바깥이 안 줄 알약에 3 을 이음
|