- 더한줄 로직 입력 = 줄 값 › 공통 옵션(바탕 입력값 · 화면 시험 입력) › 로직 기본값(M01 견본) 차례로 채움 — 셈 때 채워 문서엔 안 적음(공통 옵션 바꾸면 따라감) - 그래도 빈 입력 · 수량 없는 일위대가(723-1) · 못 셈 참조 = 0 값묶음 줄(차례 그대로) + 줄 까닭 · 답 `빠진줄` · 계 = 나머지 합 · 줄 남아 빼기 됨 - 쓰는 자리(`unit` · 층 목록 기준금액 · 일위대가 펼침) = 빠진 줄 있으면 통째 기준 없음(부분 값 안 넘김) - 화면 = 띠 「못 셈 줄 — 이름」 · 계산서 금액 — · M01 strict 셈 · Pick.ts 그대로 - 낡은 시험 고침: 715 store · 717-4 = 723-1 뒤 안 줄 수량을 알약(given)으로 · 719-2 = 수량 없음이 통째 까닭 아닌 빠진줄로 - 새 지킴 시험 test_725_1_sangeun_add_inputs(임시 storage) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
4.4 KiB
Python
88 lines
4.4 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}}]}, {})
|
||
assert saved == {**COMPANY, "키": sk} # 참조 = 회사 SK 그대로
|
||
# 723-1 · 내역 17-1 — 일위대가 안 줄 수량은 저장 안 함(null) · 쓰는 자리(바깥 문서)에서 들어옴
|
||
assert inner == [None]
|
||
assert got["반영합"]["계"] == 0 # 안 줄 수량 없음 = 금액 빠짐
|
||
assert direct["반영합"]["계"] == pytest.approx(
|
||
one * 3, abs=1
|
||
) # 바깥이 SK 를 손 3 으로 바로 참조
|
||
assert fed["반영합"]["계"] == pytest.approx(one * 3, abs=1) # 바깥이 안 줄 알약에 3 을 이음
|