Files
Aislo/resources/tester/test_391_routeedit_plan_draw.py
T
eomsangdonandClaude Opus 5.5 c3efa6dd7e feat(B05 평면 구조물 마커): 구조물 측점 마커 · 고름 정보 창 · 20 m 법선 · 끌기 · 방향키 1 m (399)
- 마커 = 종단 알약과 같은 목록(laneStructures) · 노선 위 알약 꼴(종류 색) · 스냅 · 간격과 무관
- 고름 = 알약 고름과 같은 길(onStructureSelect · 공용 고름) · 알약 벌룬 그대로 · 좌우 20 m 법선
- 끌기 · 방향키 = 노선 따라 정수 m 1 m 씩 · 시점 · 종점 밖 안 감 · 놓을 때 알약 끌기와 같은 길로 한 번
- 집기 차례 = 교각점 · 곡선 손잡이 다음 · 옛 마름모 지움
- 시험 test_399_plan_structure_marks · test_391 마름모 줄 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
2026-10-17 21:43:51 +09:00

95 lines
3.4 KiB
Python

"""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";' not in render # 구조물 고름 = 마커 법선 · 창(399)
assert "drawStructureMarks(context, scene, line, style);" 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