"""139-6 노견을 넓힌 유출 쪽 관 길이 자리 — 사면 우선(물매 1:1.2 그대로) + 유출 벽 높이 역산(0.1 m). 설계선 엔진으로 노견 확장 설계를 내고 배수관 기하를 돌린 값(`helper_139_6_pipe_fit.cjs` · B07 픽스처 배관 85.052 · 유출 = 좌). 225-1 부터 정수 길이 맞춤 · 높이 역산 없음 — 관 길이 = 그려진 길이 0.1 m. """ import json import subprocess import sys from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from config.config_system import STANDARD_CROSS_SECTION # noqa: E402 HELPER = Path(__file__).parent / "helper_139_6_pipe_fit.cjs" pytestmark = pytest.mark.skipif( not (ROOT / "config" / "node_modules").is_dir(), reason="프론트엔드 의존성 미설치" ) @pytest.fixture(scope="module") def out(tmp_path_factory) -> dict: standard = tmp_path_factory.mktemp("std") / "standard.json" standard.write_text(json.dumps(STANDARD_CROSS_SECTION), encoding="utf-8") done = subprocess.run( # noqa: S603 — 고정 실행 파일 ["node", str(HELPER), str(standard)], cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8", ) assert done.returncode == 0, done.stderr return json.loads(done.stdout) def test_안_넓힌_측점은_종전_그대로(out: dict) -> None: """225-1 — 정수 맞춤 없앰: 벽은 기본 자리 · 관 길이 = 그려진 길이 0.1 m(5.772 → 5.8).""" base = out["base"] assert (base["edge"], base["pureHeight"], base["lengthM"]) == (2, 2, 5.8) assert base["cut"] == pytest.approx(5.772) @pytest.mark.parametrize("name, extend", [("shifted", 1.0), ("shifted2", 1.3)]) def test_넓힌_쪽은_물매_그대로_높이_역산(out: dict, name: str, extend: float) -> None: case = out[name] assert case["edge"] == pytest.approx(2 + extend) and case["extend"] == extend assert case["slope"] == pytest.approx(1.2, abs=0.05) # 사면 우선 — 물매 그대로 assert round(case["pureHeight"] * 10) == pytest.approx(case["pureHeight"] * 10) # 0.1 m 눈금 assert case["lengthM"] == round(case["cut"], 1) # 225-1 — 길이는 벽 자리에서 셈(올림 없음) def test_높이가_실제로_바뀜(out: dict) -> None: """225-1 — 길이 맞춤 높이 역산 없앰: 1.3 m 넓혀도 유출 벽 높이는 기본 2.0 그대로.""" assert out["shifted2"]["pureHeight"] == pytest.approx(2.0)