# -*- coding: utf-8 -*- """PLAN 115-7 — B05 3D 성토 비탈 끝 종단 이음(공통 변형 장) 합성 검사. Node 도우미(helper_115_7_fill_continuity.cjs)가 TS 를 트랜스파일해 돌리고, 여기서는 결과(JSON)를 단언한다. 직각 골짜기 지느러미 0 · 덧댐 · 계단 지형 출렁임 · 못 닫힘 보간 · 측점 행 날것 · 0 행 끊음 · 절토 그대로. """ import json import os import subprocess import pytest HERE = os.path.dirname(os.path.abspath(__file__)) @pytest.fixture(scope="module") def results(): proc = subprocess.run( ["node", os.path.join(HERE, "helper_115_7_fill_continuity.cjs")], capture_output=True, text=True, timeout=120, ) assert proc.returncode == 0, proc.stderr return json.loads(proc.stdout) def test_valley_has_no_fins(results): r = results["valley"] assert r["fins"] == 0 assert ( r["gullyMax"] == 6 and r["gullyMin"] == 6 ) # 골 행도 이웃 비탈 끝(6 m) — 10.5 m 로 안 뻗음 def test_valley_skirt_replaces_wall(results): r = results["valley"] assert r["skirtMid"] == 94.5 # 비탈 끝 밖 1 m — 96 → 93 반쯤 assert r["skirtOut"] == 93 # 덧댐 밖 — 원지반 assert r["outside"] == 96 # 골 밖 — 원지반 그대로 def test_cut_unchanged(results): r = results["valley"] assert r["cutFlat"] == 4 assert 2 < r["cutGully"] < 2.3 # 절토는 골을 날것 그대로 따른다 def test_step_terrain_wobble_small(results): r = results["steps"] assert r["fins"] == 0 assert r["wobble"] < 0.7 * r["rawWobble"] def test_open_rows_interpolated(results): r = results["column"] assert r["openMax"] == 6 # 못 닫힘(15) → 이웃 6 assert r["stationOpen"] < 9 # 못 닫힘 측점도 보간(날것 20 아님) def test_station_row_kept_and_zero_breaks(results): r = results["column"] assert r["stationKept"] == 9 # 측점 행 날것 assert r["bridged"] == 6 # 단면 있는 짧은 틈 — 잇는다 assert r["cutGap"] == 0 # 단면 없는 행 — 0 그대로(구간 끊음) assert r["neighbourStep"] <= 1 + 1e-6 # 이웃 행 차 1 m/m 안