- 시점 창 · 구간 창 · 다이어그램 선 위 km 칸 · 자동 값 글 = 같은 도우미(fmtKm) - 안 고친 칸은 반올림 값으로 덮지 않음 - 시험 test_261_1 추가 · test_255_1 기대값만 고침 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018jonfdxn1Xit9bdkNJpE4G
72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
"""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 변환 없음
|