- 글자 유리 단추 줄 · [?] 안내 판 · 나눔선 다섯 → createMapTools 한 줄(긴 설명은 마우스 글 · 누름 동작 · 단축키 그대로)
- 3D 단추 = mapToolButton("view3d") · 클래스 b05-route__3d-open 유지 · 거리 재기 aria-pressed 맞춤
- 가이드 촬영 선택자(.b05-routeedit__tools · [data-act="hint-toggle"] · .b05-routeedit__hint.is-open) 그대로
- 시험 고침 — 옛 글자 단추 · 나눔선 · 안내 판 CSS 를 잡던 다섯(차례 · 안내 판 · 절/성토선 이름 · 3D 막이)
- 부품 — 빈 묶음 건너뜀 · [hidden] 숨김 규칙
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
87 lines
4.0 KiB
Python
87 lines
4.0 KiB
Python
"""345-5 덧 3 — 노선 편집 평면 상태 · 범례 글판과 도움말 글판 접기.
|
|
|
|
`_RouteEdit_Chrome` 의 배선 · 접힘 기억 · 한 줄 요약 글 · CSS 자리를 글로 봄 ·
|
|
요약 글 정규식은 node 로 돌림.
|
|
./venv/Scripts/python.exe -m pytest resources/tester/test_345_5c_info_hint_collapse.py -q
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
B05 = ROOT / "B05_Profile"
|
|
CHROME = (B05 / "B05_Profile_UI_RouteEdit_Chrome.ts").read_text(encoding="utf-8")
|
|
CSS = (B05 / "B05_Profile_UI_Style_RouteEdit.css").read_text(encoding="utf-8").replace("\r\n", "\n")
|
|
|
|
|
|
def _rule(selector: str) -> str:
|
|
at = CSS.rindex("\n" + selector + " {")
|
|
return CSS[at : CSS.index("}", at)]
|
|
|
|
|
|
def test_도움말_기본_접힘_펼침_기억() -> None:
|
|
assert "let hintOpen = false;" in CHROME # 기본 접힘 · 모듈 값 = 페이지 동안 기억
|
|
# 568-2 — [?] 단추 · 안내 판 = 공용 지도 도구줄(접힘 · 2열 · 클릭 통과는 test_568_1)
|
|
assert (
|
|
"hint: { lines: HINT_LINES, open: hintOpen, onToggle: (open) => (hintOpen = open) }"
|
|
in CHROME
|
|
)
|
|
assert 'mapTools.hint!.classList.add("b05-routeedit__hint")' in CHROME # 가이드 촬영 선택자
|
|
assert '"Ctrl+휠 = 돌리기(한 칸 5°)",' in CHROME
|
|
|
|
|
|
def test_상태_범례_접기_한_줄_기억() -> None:
|
|
assert "let infoCollapsed = false;" in CHROME
|
|
assert 'data-act="info-toggle"' in CHROME and 'aria-expanded="true"' in CHROME
|
|
assert "infoCollapsed = collapsed;" in CHROME and "setInfo(infoCollapsed);" in CHROME
|
|
assert 'infoToggle.textContent = collapsed ? "▸" : "▾";' in CHROME
|
|
assert 'infoToggle.addEventListener("click", () => setInfo(!infoCollapsed));' in CHROME
|
|
# 상태 글이 바뀔 때마다 요약 글을 다시 씀
|
|
assert "new MutationObserver(syncSummary).observe(status," in CHROME
|
|
collapsed = ".b05-routeedit__info.is-collapsed > .b05-routeedit__"
|
|
assert "display: none;" in _rule(f"{collapsed}status,\n{collapsed}legend")
|
|
assert "display: block;" in _rule(f"{collapsed}summary")
|
|
assert "display: none;" in _rule(".b05-routeedit__summary")
|
|
assert "pointer-events: auto;" in _rule(".b05-routeedit__info-toggle")
|
|
|
|
|
|
def test_상태_글판_작게_반투명_자리() -> None:
|
|
info = _rule(".b05-routeedit__info")
|
|
# 왼쪽 아래 제자리 — 뜬 판이 덮으면 그 위로(408-2) · 폭 줄임
|
|
assert "bottom: calc(var(--spacing-12) + var(--b05-profile-cover, 0px));" in info
|
|
assert "max-width: min(460px, 46%, var(--b05-bottom-half));" in info # 408-4 반 폭
|
|
assert "grid-template-columns:" in info
|
|
# 상태 글 두 줄에서 자름 · 범례는 옆 칸 두 줄
|
|
assert "-webkit-line-clamp: 2;" in _rule(".b05-routeedit__status")
|
|
assert "flex-direction: column;" in _rule(".b05-routeedit__legend")
|
|
glass = CSS[CSS.index("\n.b05-routeedit__info {") :]
|
|
glass = glass[: glass.index("}")]
|
|
assert "color-mix(in srgb, var(--color-surface-raised) 72%, transparent)" in glass
|
|
assert not re.search(r"#[0-9a-fA-F]{3,6}\b", glass) # 바탕 · 글 색은 토큰
|
|
|
|
|
|
@pytest.mark.skipif(shutil.which("node") is None, reason="node 없음")
|
|
def test_요약_글은_계획노선_길이() -> None:
|
|
pattern = re.search(r"const length = (/.+?/)\.exec", CHROME).group(1)
|
|
samples = [
|
|
"예상노선 1201.4m · 계획노선 1153.2m · 노드 12개 · 고친 계획노선 · LAS 등고선",
|
|
"노선을 읽는 중…",
|
|
]
|
|
script = (
|
|
f"const re = {pattern};"
|
|
f"const out = {json.dumps(samples, ensure_ascii=False)}.map((t) => {{"
|
|
"const m = re.exec(t)?.[1]; return m ? `계획노선 ${m} m` : t; });"
|
|
"console.log(JSON.stringify(out));"
|
|
)
|
|
run = subprocess.run( # noqa: S603 S607 — 고정 node 실행
|
|
["node", "-e", script], capture_output=True, check=True, encoding="utf-8"
|
|
)
|
|
assert json.loads(run.stdout) == ["계획노선 1153.2 m", "노선을 읽는 중…"]
|