715-3 일위대가 단위 빈칸 막기와 맞물려 단위 없는 시험 자료가 실패하던 것 수정 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
77 lines
3.6 KiB
Python
77 lines
3.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.종류 === SANGEUN_KIND" in pick and 'SANGEUN_KIND = "sangeun"' in pick
|
||
assert 'ref: { 층: at.층, 주인: at.층 === "system" ? null : at.주인, 키: r.이름 }' in pick
|
||
labor = _text(M02 / "M02_MasterTemplete_Labor_Pick.ts")
|
||
assert "lib?.pick(x.ref, x.제목 || x.이름);" in labor # SK 탭 줄 누름 = 참조
|
||
assert 'if (tab === "sk") return findSangeun(q);' in labor
|
||
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 'done({ 종류: "로직", 로직: x.키, 입력값: {}, 수량: 1 })' in pick
|
||
assert "done({ 참조: ref, 수량: 1 })" in pick
|
||
assert 'done({ 종류: "재료", 요소: m.코드, 이름: m.이름, 단위: m.단위, 수량: 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 단위 `기준금액` · 개인 일위대가 줄이 회사 SK 를 참조 = 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}}],
|
||
},
|
||
)["이름"]
|
||
saved = store.read("precombo", sc)["문서"]["담은로직"][0]["참조"]
|
||
got = labor.calc({"담은로직": [{"참조": {**MINE, "키": sc}, "수량": {"손": 1}}]}, {})
|
||
assert saved == {**COMPANY, "키": sk}
|
||
assert got["반영합"]["계"] == pytest.approx(one * 3, abs=1)
|