- 끝 연결선 한 규칙: 묻히면 3도 내림 선 먼저 · 원지반 못 만나면 수평공간 뒤 절토 경사(배관 · 세월교 · 박스) - 유출 3도 절토선 = 보라 선으로 그림 · 폐회로 절토 면적에 넣음(집수정 계류측은 그림만) - 시험 test_139_4_buried_outlet.py 새로 · test_79 · test_91 유출 기대 고침 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jonfdxn1Xit9bdkNJpE4G
74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
"""PLAN 139-4 · 139-5 — 묻힌 흙막이 유출 끝 = 3도 수평 절토선(보라 · 절토 면적) · 못 만나면 복합경사.
|
|
|
|
짝: `B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts`(끝 구간 규칙) · `_Culvert_Tiers.ts`(채널 입력) ·
|
|
`_Culvert_Geom.ts`(유출 절토선 면적에 넣음) · `_Culvert.ts`(그림 · 툴팁). 실제 TS 를 `helper_139_4_buried_outlet.cjs` 가 돌린다.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
|
|
import pytest
|
|
|
|
HERE = os.path.dirname(__file__)
|
|
ROOT = os.path.join(HERE, "..", "..")
|
|
|
|
pytestmark = pytest.mark.skipif(
|
|
not os.path.isdir(os.path.join(ROOT, "config", "node_modules")),
|
|
reason="프론트엔드 의존성 미설치",
|
|
)
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def out() -> dict:
|
|
proc = subprocess.run( # noqa: S603 — 고정 실행 파일
|
|
["node", os.path.join(HERE, "helper_139_4_buried_outlet.cjs")],
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
timeout=60,
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
def _src(rel: str) -> str:
|
|
with open(os.path.join(ROOT, rel), encoding="utf-8") as f:
|
|
return f.read()
|
|
|
|
|
|
@pytest.mark.parametrize("case", ["box", "pipeDown"])
|
|
def test_묻힌_유출_끝은_3도_절토선_면적에_듦(out: dict, case: str) -> None:
|
|
"""세월교 · 박스 흙막이도 배관 관보호공도 같은 3도 선 · 원지반 교점에서 끝 · 절토 면적 > 0."""
|
|
study = out[case]
|
|
assert study["cut"] == [{"points": 2, "grade": out["grade3"], "rises": False, "endGap": 0}]
|
|
assert study["inTrim"] is True
|
|
assert study["cutArea"] - study["cutAreaWithout"] > 0.1
|
|
|
|
|
|
def test_3도_선이_원지반을_못_만나면_복합경사(out: dict) -> None:
|
|
"""유출 바깥이 오르막 — 그때만 절토 경사(1:1.0)로 원지반까지."""
|
|
study = out["pipeUp"]
|
|
assert len(study["cut"]) == 1
|
|
tail = study["cut"][0]
|
|
assert tail["rises"] is True and tail["grade"] == -1 and tail["endGap"] == 0
|
|
assert study["cutArea"] > study["cutAreaWithout"]
|
|
|
|
|
|
def test_성토_끝은_그대로(out: dict) -> None:
|
|
assert out["pipeBase"] == ["fill", "fill"] # 묻히지 않은 기본 = 성토부선 그대로
|
|
|
|
|
|
def test_유출_절토선은_그리고_면적에_넣음() -> None:
|
|
culvert = _src("B06_Section/B06_Section_UI_Cross_Culvert.ts")
|
|
assert 'if (segment.kind === "cut" && !culvert.body) continue;' not in culvert
|
|
assert 'planLine(segment.points, cutLineTip("유출부", segment));' in culvert
|
|
geom = _src("B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts")
|
|
assert "extendTrimSlope(drawnFillPoints(extrasForArea, true), outletInfo.outward);" in geom
|
|
# 집수정 계류측 3도 선은 그림만(면적 밖) — 세월교 · 박스 계류측만 면적
|
|
assert (
|
|
"extendTrimSlope(drawnFillPoints(basinExtrasForArea, !!body), inletInfo.outward);" in geom
|
|
)
|