tmp/ 가 창끼리 안 건너가는 것이 확정돼(랩탑이 시간 두고 두 번 확인) 시험·예외가 저절로 건너가도록 git 안으로 옮김. 사용자 확정. - 내용은 하나도 안 고침 — 자리만 옮김. tmp/tests 는 남겨 둠. - 같은 이름이 이미 있던 64 개는 랩탑 것을 그대로 두고 건너뜀. - helper_b05_*.js 둘은 랩탑이 .cjs 로 이미 올린 것과 **줄바꿈만 다른 같은 내용**이라 복사본을 도로 뺌(시험이 .cjs 를 부름). - resources/tester/ 에서 전체 1176 통과 · 29 건너뜀 · 실패 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
78 lines
3.3 KiB
Python
78 lines
3.3 KiB
Python
"""규준틀 재료 — **세는 것은 확정이고 수량만 몰랐던 자리** (2026-09-09).
|
||
|
||
품셈 11-2·11-3 [주]④ 「재료량은 **설계수량에 따른다**」 ⇒ 품셈이 값을 안 주는 것이지
|
||
「안 센다」가 아니다. 근주이식·임목파쇄(**셀지 말지가 설계 판단**)와 성격이 다르다.
|
||
그래서 **제안값을 보이고 고칠 수 있게** 둔다 — 확정 ⑨·⑩ 과 같은 틀.
|
||
|
||
⚠ 겨누는 것 여섯
|
||
① 개소가 서면 재료도 선다
|
||
② ⚠ 개소가 안 서면 재료도 안 선다 — 밑수가 그 줄이다
|
||
③ 값은 **제안값**이고 산출 조건이 이긴다
|
||
④ ⚠ 제안값이 **실무 관측값이지 법정 기준이 아님**이 사유에 적힌다
|
||
⑤ 손율은 원문값이 함께 적힌다(비탈 50% · 수평 80%)
|
||
⑥ 자재 축으로 간다(할증은 자재총괄에서 한 번만)
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
sys.path.insert(0, str(ROOT))
|
||
|
||
from B08_Quantity.B08_Quantity_Engine_Preparation import ( # noqa: E402
|
||
FRAME_MATERIAL_SUGGESTED,
|
||
frame_material_rows,
|
||
)
|
||
|
||
규준틀 = [
|
||
{"item": "비탈 규준틀", "unit": "개소", "amount": 28.0},
|
||
{"item": "수평 규준틀", "unit": "개소", "amount": 33.0},
|
||
]
|
||
|
||
|
||
def 이름별(rows: list[dict]) -> dict:
|
||
return {(row["source"], row["name"]): row for row in rows}
|
||
|
||
|
||
def test_개소가_서면_재료도_선다() -> None:
|
||
rows = 이름별(frame_material_rows(규준틀))
|
||
assert abs(rows[("비탈 규준틀", "각재 50×50")]["amount"] - 28.0 * 0.0044) < 1e-9
|
||
assert abs(rows[("수평 규준틀", "못")]["amount"] - 33.0 * 0.03) < 1e-9
|
||
|
||
|
||
def test_개소가_안_서면_재료도_안_선다() -> None:
|
||
"""⚠ 밑수가 개소 줄이다 — 개소가 없으면 재료를 지어내지 않는다."""
|
||
assert frame_material_rows([{"item": "비탈 규준틀", "amount": None}]) == []
|
||
|
||
|
||
def test_산출_조건이_이긴다() -> None:
|
||
rows = 이름별(frame_material_rows(규준틀, {"못": 0.05}))
|
||
assert abs(rows[("비탈 규준틀", "못")]["amount"] - 28.0 * 0.05) < 1e-9
|
||
assert "고른 값" in rows[("비탈 규준틀", "못")]["basis"]
|
||
|
||
|
||
def test_관측값이지_법정_기준이_아님이_적힌다() -> None:
|
||
"""⚠ 값만 박고 근거를 안 보이면 「대신 페이지에 남길 것」 지시를 어기는 것이다."""
|
||
basis = 이름별(frame_material_rows(규준틀))[("비탈 규준틀", "각재 50×50")]["basis"]
|
||
assert "실무 관측값" in basis and "법정 기준 아님" in basis
|
||
assert "설계수량에 따른다" in basis
|
||
|
||
|
||
def test_손율이_원문값으로_적힌다() -> None:
|
||
rows = 이름별(frame_material_rows(규준틀))
|
||
assert "손율 50%" in rows[("비탈 규준틀", "판재 T12")]["basis"]
|
||
assert "손율 80%" in rows[("수평 규준틀", "판재 T12")]["basis"]
|
||
|
||
|
||
def test_자재_축으로_간다() -> None:
|
||
assert all(row["destination"] == "material" for row in frame_material_rows(규준틀))
|
||
|
||
|
||
def test_제안값이_실무_관측값과_같다() -> None:
|
||
"""울진 소광 §8 — 각재 50×50 0.0044㎥ · 판재 T12 0.0029㎥ · 못 0.03㎏(개소당)."""
|
||
assert FRAME_MATERIAL_SUGGESTED["각재 50×50"][0] == 0.0044
|
||
assert FRAME_MATERIAL_SUGGESTED["판재 T12"][0] == 0.0029
|
||
assert FRAME_MATERIAL_SUGGESTED["못"][0] == 0.03
|