"""390-4 스냅 상태줄 글 = 고른 간격 따라 — `B05_Profile_UI_RouteEdit_SnapStep.ts` 의 `snapFitText` 를 Node 로 돌려 간격별 글 판정 + 편집기 두 자리(전체 · 놓을 때)가 그 글을 씀. ./venv/Scripts/python.exe -m pytest resources/tester/test_390_4_snap_step_text.py -q """ import json import subprocess from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] B05 = ROOT / "B05_Profile" SNAP = B05 / "B05_Profile_UI_RouteEdit_SnapStep.ts" TS = ROOT / "config" / "node_modules" / "typescript" STEPS = ["0.1", "1", "10", "station"] NODE = """ const fs = require("fs"); const ts = require(process.argv[1]); const js = ts.transpileModule(fs.readFileSync(process.argv[2], "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; new Function("exports", "module", "require", js)(box.exports, box, () => ({})); const steps = JSON.parse(process.argv[3]); console.log(JSON.stringify(Object.fromEntries(steps.map((s) => [s, box.exports.snapFitText(s)])))); """ @pytest.fixture(scope="module") def texts() -> dict: run = subprocess.run( # noqa: S603 — 고정 실행 파일 ["node", "-e", NODE, str(TS), str(SNAP), json.dumps(STEPS)], capture_output=True, text=True, encoding="utf-8", timeout=60, ) assert run.returncode == 0, run.stderr return json.loads(run.stdout) @pytest.mark.parametrize( ("step", "want"), [ ("station", "곡선 가운데(MC)를 일반측점에 맞췄습니다."), ("0.1", "곡선 가운데(MC)를 0.1 m 배수에 맞췄습니다."), ("1", "곡선 가운데(MC)를 1 m 배수에 맞췄습니다."), ("10", "곡선 가운데(MC)를 10 m 배수에 맞췄습니다."), ], ) def test_간격별_상태줄_글(texts, step, want) -> None: assert texts[step] == want def test_편집기는_고른_간격_글을_씀() -> None: edit = (B05 / "B05_Profile_UI_RouteEdit.ts").read_text(encoding="utf-8") assert "일반측점에 맞췄" not in edit assert edit.count("applyEdit(snap.text())") == 2 snap = SNAP.read_text(encoding="utf-8") assert "text: () => snapFitText(select.value)" in snap