Files
Aislo/resources/tester/test_b08_topsoil_haul.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

193 lines
9.2 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).
⚠⚠ 시행규칙 별표2 .2.차.(6)·Ⅰ.3.카.(6):
「노면·절토대상지에 있는 입목…과 그 뿌리, **표토는 전량 제거한 후** 강우 시 유실되거나
경관에 저해되지 않도록 **최고 홍수위보다 높은 장소로 운반하고 쌓아두어야 한다**」
⇒ 제거(9-15)만 세면 **운반이 빠진다.**
⚠ 겨누는 것 다섯
① 줄이 **선다** — 값이 없어도 목록에 남는다
② 물량은 **제거 물량 그대로** — 다시 세지 않는다
③ 거리는 **설계 입력** — 「최고 홍수위보다 높은 장소」는 현장이 정한다. 지어내지 않는다
④ ⚠ 제거가 안 서면(두께 미입력) 운반도 안 선다 — 밑수가 그 줄이다
⑤ 법 문구가 **사유에 적힌다** — 왜 세는지 화면에서 보여야 한다
"""
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
STATUS_PENDING,
STATUS_READY,
preparation_rows,
)
사면 = {"face_dressing_fill": 600.0, "face_dressing_cut": 400.0}
def (thickness: float | None, distance: float | None) -> dict:
rows = preparation_rows(사면, [], thickness, distance)
return {row["item"]: row for row in rows}
def test_줄이_선다() -> None:
assert "표토 운반·적치" in (None, None)
def test_물량은_제거_물량_그대로() -> None:
"""⚠ 다시 세면 두 값이 갈린다 — 제거 줄이 밑수다."""
rows = (0.2, 300.0)
assert rows["표토제거"]["amount"] == 1000.0 * 0.2
assert rows["표토 운반·적치"]["amount"] == rows["표토제거"]["amount"]
assert rows["표토 운반·적치"]["status"] == STATUS_READY
assert rows["표토 운반·적치"]["work_item_code"] == "FP-10-12"
def test_거리를_안_넣으면_막고_사유() -> None:
"""⚠ 「최고 홍수위보다 높은 장소」는 현장이 정한다 — 품셈이 거리를 주지 않는다."""
row = (0.2, None)["표토 운반·적치"]
assert row["amount"] is None and row["status"] == STATUS_PENDING
assert "운반거리가 아직 입력되지 않았습니다" in row["reason"]
# 값을 버리지 않는다 — 운반할 물량은 참고로 보인다.
assert row["reference_amount"] == 200.0
def test_제거가_안_서면_운반도_안_선다() -> None:
row = (None, 300.0)["표토 운반·적치"]
assert row["amount"] is None
assert "두께 먼저" in row["reason"]
def test_법_문구가_사유에_적힌다() -> None:
for thickness, distance in ((None, None), (0.2, None), (0.2, 300.0)):
reason = (thickness, distance)["표토 운반·적치"]["reason"]
assert "별표2" in reason and "운반하고 쌓아두어야" in reason
# ── 뿌리 적재·운반 — 품셈이 네 단계로 둔 자리 (2026-09-09) ──────────────
def test_뿌리_뒤_단계_두_줄이_선다() -> None:
"""⚠⚠ 「벌개·제근 → 뿌리다듬기 → **적재** → **운반**」인데 우리는 한 줄만 세고 있었다.
표토와 같은 병이다 — 법·품셈이 두 동작을 묶어 두는데 앞 동작만 세던 자리.
"""
rows = (0.2, 300.0)
assert "뿌리 적재" in rows and "뿌리 운반" in rows
def test_적재는_9_20_2_운반은_덤프() -> None:
"""⭐ 2026-09-09 확정 5차 4번 — 「뿌리 운반은 **덤프**」로 답이 왔다.
⚠ 그 전에는 「9-20 장에 운반 공종이 없어 코드를 못 붙임」이었다. 지어낸 것이 아니라
**사용자가 고른 것**이라 코드가 붙는다.
⚠ 다만 물량은 여전히 안 선다 — 운반 밑수는 **부피(㎥)** 인데 뿌리 부피를 든 곳이 없다.
"""
rows = (0.2, 300.0)
assert rows["뿌리 적재"]["work_item_code"] == "FP-09-20-02"
assert rows["뿌리 운반"]["work_item_code"] == "FP-10-12"
assert rows["뿌리 운반"]["amount"] is None
assert "부피" in rows["뿌리 운반"]["reason"]
def test_적재는_면적으로_서고_운반은_못_선다() -> None:
"""⭐ 확정 5차 6번으로 **면적 축**이 정해져 적재는 선다(제근과 같은 밑수).
⚠ 운반만 못 선다 — 축이 **부피**라서다. 「같은 확정인데 한 줄만 서는」 자리라 갈라 적는다.
⚠ 대상 면적은 **벌개제근 연동**이라 `tree_removal_*` 에서 온다(표토 계열 `face_dressing_*`
과 **다른 면적**이다 — 2026-09-09 실측: 17,873.8 ↔ 15,726.9).
"""
사면 = {**{"tree_removal_fill": 600.0, "tree_removal_cut": 400.0}, **{}}
rows = {row["item"]: row for row in preparation_rows(사면, [], 0.2, 300.0)}
assert rows["뿌리 적재"]["amount"] == 1000.0
assert rows["제근·뿌리다듬기"]["amount"] == 1000.0 # 같은 밑수로 함께 섬
assert rows["뿌리 운반"]["amount"] is None
assert rows["뿌리 운반"]["reference_amount"] == 1000.0
# ── 2026-09-09 준비공 축 감사에서 잡은 둘 ──────────────────────────
def test_면적이_0이면_물량을_안_낸다() -> None:
"""⚠ 0 은 **「없음」과 구별이 안 된다** — 받는 쪽이 「표토가 없는 노선」으로 읽는다.
절·성토 사면적이 0 인 임도는 성립하지 않으므로, 이 자리는 사실상 **사면표가 아직
안 선 것**이다. 두께 미입력은 이미 막고 있었는데 면적 0 은 그냥 통과하고 있었다.
"""
from B08_Quantity.B08_Quantity_Engine_Preparation import build_table
rows = {r["item"]: r for r in build_table(slope_totals={}, topsoil_thickness_m=0.2)["rows"]}
제거 = rows["표토제거"]
assert 제거["amount"] is None
assert "사면표" in 제거["reason"]
# 운반은 제거를 밑수로 삼으므로 함께 막힌다 — 0 ㎥ 를 실어 나르는 줄이 안 생긴다.
assert rows["표토 운반·적치"]["amount"] is None
def test_대상_면적이_법_문언과_다르다는_사실이_적힌다() -> None:
"""⚠ 값을 고치는 것이 아니라 **드러내는** 시험이다(임의 확정 금지).
별표2 Ⅰ.2.차.(6) 은 대상을 「**노면·절토대상지**」로 못박고, 성토대상지는 (7) 에서
「표토 등은 **제거·정리**한다」로 따로 두어 운반·적치 의무를 안 건다. 우리는
절토·성토 **사면적을 다 더하고 노면은 안 센다** — 두 방향으로 어긋난다.
실무가 어느 쪽인지는 사용자·실무자 확인 사항이라 **사유만** 낸다.
"""
from B08_Quantity.B08_Quantity_Engine_Preparation import build_table
rows = {
r["item"]: r
for r in build_table(
slope_totals={"face_dressing_cut": 9000.0, "face_dressing_fill": 6726.9},
topsoil_thickness_m=0.2,
)["rows"]
}
reason = rows["표토제거"]["reason"]
assert rows["표토제거"]["amount"] is not None # 값은 그대로 선다
assert "노면·절토대상지" in reason and "노면은 안 셈" in reason
def test_운반이_갈래를_실어_보낸다() -> None:
"""⚠ `FP-10-12` 는 **부모**다 — 품이 붙은 것은 잎(10-12-1 토사 · -2 암절취 · -3 발파암)뿐.
갈래를 안 보내면 B09 가 「이 공종엔 일위대가가 없고 한 층 아래에 있습니다 — 후보 3건」
에서 멈추고 **금액이 안 선다.** 표토가 토사인 것은 다툼이 없으므로 갈래를 실어 보낸다.
"""
from B08_Quantity.B08_Quantity_Engine_Handoff import build_handoff
from B08_Quantity.B08_Quantity_Engine_Preparation import build_table
table = build_table(
slope_totals={"face_dressing_cut": 9000.0, "face_dressing_fill": 6726.9},
topsoil_thickness_m=0.2,
topsoil_haul_distance_m=500.0,
)
handed = {r["name"]: r for r in build_handoff(preparation_table=table)["work_items"]}
운반 = handed["표토 운반·적치"]
assert 운반["in_bill"] is True
assert (운반["variant_axis"], 운반["variant_value"]) == ("ground_class", "토사")
def test_제거_품에_20m_압토가_들어_있다는_사실이_적힌다() -> None:
"""⚠ 품셈 9-15-2 원문이 `L(운반거리) 20m` 를 적용값으로 박아 뒀다.
실무 내역서(영월 2024)도 「표토제거 답외구간 / M2 · 도자 19Ton · D=20」 **한 줄뿐이고
운반 줄이 따로 없다.** 우리 운반 줄은 그래서 **20m 를 넘는 몫**일 때만 새 줄인데 그
가름을 아직 안 했다 — 값을 지어내지 않고 **그 사실을 사유에 남긴다**(이중계상 후보).
"""
from B08_Quantity.B08_Quantity_Engine_Preparation import build_table
rows = {
r["item"]: r
for r in build_table(
slope_totals={"face_dressing_cut": 9000.0, "face_dressing_fill": 6726.9},
topsoil_thickness_m=0.2,
topsoil_haul_distance_m=500.0,
)["rows"]
}
reason = rows["표토 운반·적치"]["reason"]
assert "L=20m 압토가 들어 있음" in reason and "20m 를 넘는" in reason