"""391 B05 평면 그림(요구 242-5 · 6 · 12 · 13 · 15) — 20 m 법선 · 곡선 3점 · 삼각형 · 잠금 색. Node 헬퍼(`helper_391_routeedit_plan_draw.cjs`)가 TS 를 트랜스파일해 가짜 캔버스로 돌림. ./venv/Scripts/python.exe -m pytest resources/tester/test_391_routeedit_plan_draw.py -q """ import json import math import subprocess from pathlib import Path import pytest HERE = Path(__file__).resolve().parent ROOT = HERE.parents[1] B05 = ROOT / "B05_Profile" @pytest.fixture(scope="module") def results(): proc = subprocess.run( ["node", str(HERE / "helper_391_routeedit_plan_draw.cjs")], capture_output=True, text=True, timeout=60, ) assert proc.returncode == 0, proc.stderr return json.loads(proc.stdout) def _read(name: str) -> str: return (B05 / name).read_text(encoding="utf-8") def test_법선은_좌우_20m_하늘색(results): line = results["normal"][0] assert line["color"] == "#0ea5e9" # 2 px/m · 동서 노선 50 m 자리 → 좌(북) 20 m · 우(남) 20 m assert line["path"] == [[100, 40], [100, -40]] def test_맴돔과_고름이_한_함수(): hover = _read("B05_Profile_UI_RouteEdit_Hover.ts") assert "drawStationNormal(context, scene, line, hover.chainage);" in hover assert "* 12" not in hover # 짧은 12 px 선 지움 render = _read("B05_Profile_UI_RouteEdit_Render.ts") assert "drawStationNormal(context, scene, line, watch.chainageM);" in render assert "leftCut" not in render and "--b05-footprint-cut" not in render assert 'context.strokeStyle = "#ff9800";' in render # 구조물 마름모 그대로 def test_MC_는_호_가운데(results): r = 10 * (1 - 1 / math.sqrt(2)) assert results["mid"] == [round(-r, 3), round(r, 3)] def test_고른_곡선_세_점_접선_굵은_호(results): picked = results["picked"] assert picked["dots"][0] == [-10, 0] and picked["dots"][2] == [0, 10] assert picked["dots"][1] == results["mid"] assert picked["tangent"] == [[-10, 0], [0, 0], [0, 10]] assert picked["arcWidths"] == [8, 5] # 흰 테 · 하늘색 def test_곡선_없음_고름_없음은_안_그림(results): assert results["offDrawn"] == 0 def test_곡선_없는_교각점은_삼각형(results): tri = results["triangle"] assert len(tri) == 3 and tri[0] == [100, round(100 - 6 * 1.4, 3)] render = _read("B05_Profile_UI_RouteEdit_Render.ts") assert "if (noCurve) traceNodeTriangle(context, x, y, radius);" in render assert "drawPickedCurve(context, scene, style);" in render assert render.index("drawPickedCurve(") < render.index("drawPickHover(context") def test_잠금_황금_굵기4_흰테(): css = (ROOT / "ui_template" / "ui_template_theme.css").read_text(encoding="utf-8") assert css.count("--map-route-locked: #ca8a04;") == 1 assert css.count("--map-route-locked: #facc15;") == 2 # 어두움 · 시스템 어두움 render = _read("B05_Profile_UI_RouteEdit_Render.ts") assert "const LOCKED_WIDTH = 4;" in render assert "piece, [], halo, LOCKED_WIDTH + 3);" in render def test_파일_700줄_안(): for name in ( "B05_Profile_UI_RouteEdit_Render.ts", "B05_Profile_UI_RouteEdit_Hover.ts", "B05_Profile_UI_RouteEdit_Curve_Pick.ts", ): assert len(_read(name).splitlines()) <= 700, name