- Ctrl+Z · Y · 편집기 [되돌리기] · [다시하기] · [반영 전으로] = 페이지 사진첩(_Profile_History) — 평면 · 종단 · 횡단 · 관 · 구조물을 만진 차례 거꾸로 - 편집기 쌓기 · [반영 전으로] 뒤 사진첩 한 걸음(_Draft.watch) · 사진첩이 되쓴 route-draft 는 fromPage 로 편집기 새 걸음(같은 선 옛 걸음의 고정 · 추천 꼬리표째) - 쌓는 줄 없는 조작(횡단 카드 등) = 놓은 뒤 · change 뒤 400 ms 한 번 찍음 · 고름 · 관 id · 종류 캐시 · 구조물 넘김 · b08 · b09 칸은 사진 밖 - 「마지막에 만진 판만」(_RouteEdit_UndoOwner) 지움 · 편집기는 단축키 안 들음 - 시험 test_346_4_one_undo.py · 345-3 시험 · 219-1 헬퍼 새 꼴로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013QyNXY2TUKXCFMwAca2APG
80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
"""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()
|