Files
Aislo/resources/tester/test_b08_frame_material.py
T
eomsangdonandClaude Opus 5 d7cb14f416 test(B08): tmp/tests 중 tester 에 없던 47 개를 resources/tester 로 옮김
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>
2026-09-09 17:15:57 +09:00

78 lines
3.3 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.
"""규준틀 재료 — **세는 것은 확정이고 수량만 몰랐던 자리** (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