"""345-3 노선 편집 → 종단 보기 가운데 위 본문 — Ctrl+Z · Y 는 마지막에 만진 판 하나 · 종단도 판 흐름 배치 · 왼쪽 「계획노선」 칸 · 편집 단추 지움 · [노선 반영] 뒤 새로고침 없이 다시 세움. Ctrl+Z 몫은 Node 헬퍼 `helper_345_3_undo_owner.cjs` 가 진짜 `_RouteEdit_History` 로 돌림(346-4) · 배선 · CSS 는 글로 봄(화면 확인은 브레인). """ from __future__ import annotations import json import re import subprocess from pathlib import Path import pytest HERE = Path(__file__).resolve().parent ROOT = HERE.parents[1] def _read(rel: str) -> str: return (ROOT / rel).read_text(encoding="utf-8") def _block(css: str, selector: str) -> str: found = re.search(rf"^{re.escape(selector)} \{{([^}}]*)\}}", css, re.M) assert found, selector return found.group(1) @pytest.fixture(scope="module") def out() -> dict: run = subprocess.run( ["node", str(HERE / "helper_345_3_undo_owner.cjs")], capture_output=True, text=True, encoding="utf-8", check=True, ) return json.loads(run.stdout) def test_Ctrl_Z_는_사진첩_한_줄(out): # 346-4 — 「마지막에 만진 판 하나」 없앰 · 평면 편집기는 단축키를 안 들음(종단도가 사진첩으로) assert out["plan"] == [] and out["keydownListeners"] == 0 def test_종단도_Ctrl_Z_줄이_사진첩_하나(): tools = _read("B05_Profile/B05_Profile_UI_Profile_Panel_Tools.ts") at = tools.index('if (isCtrlKey(event, "z") || isCtrlKey(event, "y")) {') assert "undoOwner" not in tools and "history.undo()" in tools[at : at + 240] history = _read("B05_Profile/B05_Profile_UI_RouteEdit_History.ts") assert '"keydown"' not in history and "onPageHistory" in history def test_편집기는_본문_페이지_수명(): view = _read("A00_Common/design/design_view_profile.ts") assert "mountRouteEditor(mainContent, host, activeProjectId, rebuildAfterReplan," in view assert "tools: [view3d.modal.button]," in view assert "openRouteEditModal" not in view and "location.reload()" not in view assert len(view.splitlines()) <= 700 def test_종단도_판은_횡단_보기만_흐름(): """345-5 — 종단 보기는 다시 뜬 판(평면 위 오버레이) · 횡단 보기만 흐름.""" css = _read("A00_Common/design/design_page.css") rule = _block( css, '.design-page__main[data-view="cross"] > .design-page__profile > .b05-route-profile' ) assert "position: relative;" in rule and "flex: none;" in rule assert "\n.design-page__main > .design-page__profile > .b05-route-profile" not in css def test_계획노선_칸_편집_단추_지움(): sections = _read("B05_Profile/B05_Profile_UI_Panel_Sections.ts") assert '"planned-route"' not in sections and "plannedRouteButton" not in sections panel = _read("B05_Profile/B05_Profile_UI_Panel.ts") assert "onEditPlannedRoute" not in panel and "createRoutePart" not in panel assert not (ROOT / "B05_Profile/B05_Profile_UI_Panel_Route.ts").exists()