Files
Aislo/resources/tester/test_143_2_b08_blank_values.py
T
eomsangdonandClaude Opus 5.5 14c3f01f11 fix(B08): 임의 · 실무 값 빈칸 — 관경 · 련 미입력 · 1본 프로젝트 값만 · 거창 계수 비율 미정 · 수심비 빈칸(143-2)
- 집계표 — 관경 · 련 빈칸 = 「미입력」 열(or 1000 · or 1 지움) · 관경 빈칸 흙막이 빈 높이 미입력 · 1본 = 프로젝트 층 변수만(시스템 층 폴백 지움)
- 토공집계표 — 성토면다짐 · 초류종자살포 · 지장목제거 = 빈칸 + 「비율 미정」 · 구조물 쪽 늘 빈 줄 8 뺌(나머지 7 유지)
- 수리 박스 — 수심비 처음 값 빈칸 · 빈칸이면 수심 · 유출량 멈춤 · 칸 옆 알림
- 좌측 패널 1본 읽기 전 빈칸 · 시험 test_69 · 98 · 122 · 73_11 고침 + 새 test_143_2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
2026-10-09 14:56:57 +09:00

81 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
"""B08 구조물 집계표 — 관경 · 련 빈칸 = 「미입력」(임의 1000 · 1 로 안 채움 · PLAN 143-2).
견본: 100 관 관경 빈칸 L16 · 유출 흙막이 높이 빈칸 / 200 세월교 Φ1000 련 빈칸 · 관 길이 9.
"""
from __future__ import annotations
import json
from pathlib import Path
from B08_Quantity import B08_Quantity_Router_Summary as summary
from M02_MasterTemplete import M02_Item_Snapshot as snapshots
from M02_MasterTemplete.StructOptions import M02_SO_Definition as definition
ITEM = {"layer": "system", "owner": None, "key": "SS000001", "name": "견본"}
POINTS = [
{
"chainage_m": 100.0,
"options": {
"pipe_diameter_mm": "",
"outlet_type": "기슭막이",
"outlet_revet_form": "돌쌓기(메)",
"outlet_revet_before_m": 5,
"outlet_revet_after_m": 5,
},
"summary_item": ITEM,
"group_items": {"g9lq9uk": ITEM},
},
{
"chainage_m": 200.0,
"facility": "ford_bridge",
"options": {"pipe_diameter_mm": 1000, "pipe_count": "", "ford_width_m": 12},
"summary_item": ITEM,
},
]
DESIGNS = [
{"chainage_m": 100.0, "design": {"pipe_length_m": 16}},
{"chainage_m": 200.0, "design": {"ford_pipe_length_m": 9}},
]
def _run(tmp_path: Path) -> dict:
root = tmp_path / "proj"
edits = root / "B04_PreProcess/drainage/edits"
edits.mkdir(parents=True)
points = [{**p, "source": "user"} for p in POINTS]
(edits / "pipe_points.json").write_text(
json.dumps({"points": points}, ensure_ascii=False), encoding="utf-8"
)
names = definition.read()["종류"]["pipe"]["이름"]
linked = {owner: {} for owner in snapshots.assignments(root)}
return summary.pipe_summary(root, DESIGNS, names, 6.0, linked=linked)
def _cell(out: dict, at: float, cid: str):
row = next(r for r in out["rows"] if abs(r["chainage_m"] - at) < 0.01)
return row["values"].get(cid)
def test_관경_빈칸은_미입력_열(tmp_path):
out = _run(tmp_path)
cols = {c["id"]: c for c in out["columns"]}
assert cols["pipe:len|-"]["group"] == ["관 공", "미입력", "관매설"]
assert _cell(out, 100, "pipe:len|-") == 16
assert _cell(out, 100, "pipe:cp|-") == 2 # 1본 6 m — 관경과 무관
assert not any(c.startswith("pipe:len|1000") and _cell(out, 100, c) for c in cols)
# 흙막이 빈 높이 = 관경 최소 높이를 모름 → 「미입력」
assert cols["pipe:revet|돌쌓기(메)|-"]["group"][2] == "미입력"
assert _cell(out, 100, "pipe:revet|돌쌓기(메)|-") == 10
def test_세월교_련_빈칸은_미입력_관_몫_빈칸(tmp_path):
out = _run(tmp_path)
cols = {c["id"]: c for c in out["columns"]}
assert cols["pipe:ford|1000|-|width"]["group"][1] == "Φ1000×미입력련"
assert _cell(out, 200, "pipe:ford|1000|-|width") == 12
assert _cell(out, 200, "pipe:len|1000") is None # 련 수를 모르면 관 몫도 빈칸
assert _cell(out, 200, "pipe:cp|1000") is None
assert not [p for p in out["pipes"] if p["column"] == "pipe:cp|1000"]