"""261-1 거리이정표 km 칸 끝수 — 보이는 km = 3자리(1 m) 반올림 · 끝 0 지움 · 안 고치면 저장 m 그대로 · 고치면 km × 1000 → m(끝수 없이).""" import json import re import subprocess from pathlib import Path ROOT = Path(__file__).resolve().parents[2] IMPORTS = re.compile(r"^import[^;]*;\n", re.MULTILINE) UI = "B08_Quantity/B08_Quantity_UI_Milestone" def _read(rel): return (ROOT / rel).read_text(encoding="utf-8") def _node(src, expr): result = subprocess.run( ["node", "--experimental-strip-types", "--no-warnings", "--input-type=module-typescript", "-e", IMPORTS.sub("", src) + f"\nconsole.log(JSON.stringify({expr}));"], capture_output=True, text=True, encoding="utf-8", timeout=60, ) # fmt: skip assert result.returncode == 0, result.stderr return json.loads(result.stdout) def _fmt(values): modal = _read(f"{UI}_Modal.ts") line = next(ln for ln in modal.splitlines() if ln.startswith("export const fmtKm")) return _node(line.replace("export ", ""), f"{json.dumps(values)}.map(fmtKm)") def test_km_글_3자리_끝0_지움(): assert _fmt([576.595 / 1000, 0.3, 0.1 + 0.2, 12, 0, 1.2345, 0.0005, 2 / 3]) == [ "0.577", "0.3", "0.3", "12", "0", "1.235", "0.001", "0.667", ] # fmt: skip def test_고치면_km_곱하기_1000_끝수_없이(): layout = _read("B08_Quantity/B08_Quantity_Milestone_Layout.ts") data = {"site": {"mid_station_m": 576.595, "mid_road": "비포장"}, "base": {}, "routes": []} expr = f'setLeg({json.dumps(data)}, "start", 0, {{ km: 0.3 }}).site.mid_station_m' assert _node(layout, expr) == 300 # 안 고침 = km 키 없는 patch → 저장 m 그대로 expr = f'setLeg({json.dumps(data)}, "start", 0, {{ road: "비포장" }}).site.mid_station_m' assert _node(layout, expr) == 576.595 def test_모든_km_칸_같은_규칙(): modal = _read(f"{UI}_Modal.ts") site = modal[modal.index("export function openSiteInfo") :] assert "fmtKm(data.site.mid_station_m / 1000)" in site assert "fmtKm(site.mid_default_m / 1000)" in site assert "...(text === shown ? {} : { km })" in site # 안 고침 = 덮지 않음 leg = _read(f"{UI}_LegModal.ts") assert "fmtKm(data.site.mid_station_m / 1000)" in leg assert "fmtKm(site.mid_default_m / 1000)" in leg assert "...(dist.input.value === shown ? {} : { km: km(dist.input.value) })" in leg assert "dist.value === shown ? orig : km(dist.value)" in leg # 구간 줄 assert "fmtKm(leg.km)" in leg and "fmtKm(auto)" in leg diagram = _read(f"{UI}_Diagram.ts") assert "fmtKm(leg.km)" in diagram and "fmtKm(leg.auto_km)" in diagram assert "km.value === shown" in diagram # 선 위 km 고치기 칸 · 안 고침 = 덮지 않음 for src in (modal, leg, diagram): assert "String(leg.km)" not in src and "mid_station_m / 1000)" not in src.replace( "fmtKm(data.site.mid_station_m / 1000)", "" ) # 맨 String 변환 없음