- map_toolbar = 단추 열쇠 · 할 일 · 보일 페이지(d03 · b05) 표 · mapToolGroups(page, parts) — D03 단추 차례 · 묶음 그대로 - map_terrain_chip = 분할 고르기(수치지형도 · 라이다) · 이름 D03 「분석 지형」 · B05 「설계 지형」 · 없는 원천 막힘 — 바꾸는 일은 onChange(624-1 · 624-4 · 626-1) - 시험 test_624_2_map_parts 새로 · 553-4 돌리기 자리 확인 = 표 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
85 lines
3.6 KiB
Python
85 lines
3.6 KiB
Python
"""PLAN 624-2 — 공용 지도 부품(A00_Common/map) 지킴: 도구줄 표 · 겹 목록 페이지 표 · 범례 · 지형 칩 · D03 은 부르기만.
|
|
|
|
./venv/Scripts/python.exe -m pytest resources/tester/test_624_2_map_parts.py -q
|
|
"""
|
|
|
|
import re
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
MAP = ROOT / "A00_Common" / "map"
|
|
D03 = ROOT / "D03_PlanAnalysis"
|
|
|
|
|
|
def _read(path: Path) -> str:
|
|
return path.read_text(encoding="utf-8")
|
|
|
|
|
|
def _toolbar_rows() -> list[list[tuple[str, set[str]]]]:
|
|
"""표 → 묶음마다 (열쇠, 보일 페이지)."""
|
|
src = _read(MAP / "map_toolbar.ts")
|
|
pages = {"BOTH": {"d03", "b05"}, "B05": {"b05"}}
|
|
body = src[src.index("MAP_TOOLBAR") : src.index("const isAct")]
|
|
groups = re.findall(r"\[\s*(\{.*?\})\s*,?\s*\]", body, re.S)
|
|
return [
|
|
[(k, pages[p]) for k, p in re.findall(r'key: "([\w-]+)".*?pages: (\w+)', g, re.S)]
|
|
for g in groups
|
|
]
|
|
|
|
|
|
def test_toolbar_table_d03_same_as_before_plus_terrain() -> None:
|
|
d03 = [[k for k, p in g if "d03" in p] for g in _toolbar_rows()]
|
|
d03 = [g for g in d03 if g]
|
|
# 옛 D03 도구줄 세 묶음 그대로 + 끝에 지형 칩
|
|
assert d03 == [
|
|
["undo", "redo"],
|
|
["view3d", "rotate-ccw", "rotate-cw"],
|
|
["stations", "slopes", "measure"],
|
|
["terrain"],
|
|
], d03
|
|
b05 = {k for g in _toolbar_rows() for k, p in g if "b05" in p}
|
|
assert {"contour-minor", "footprint", "station-snap", "snap-step", "terrain"} <= b05
|
|
tools = _read(ROOT / "ui_template" / "ui_template_map_tools.ts")
|
|
for key in {k for g in _toolbar_rows() for k, _ in g} - {"snap-step", "terrain"}:
|
|
assert f'"{key}": {{' in tools or f"{key}: {{" in tools, key # 아이콘 · 이름 = MAP_TOOLS
|
|
|
|
|
|
def test_layer_pages() -> None:
|
|
src = _read(MAP / "map_layer_list.ts")
|
|
assert 'd03: { hide: [], pref: "aislo:pref:d03.layers" }' in src
|
|
b05 = re.search(r"b05: \{(.*?)\},", src, re.S).group(1)
|
|
assert 'hide: ["bands", "forestRoadFile"]' in b05 # A⑨
|
|
assert 'on: ["contour", "stream"]' in b05 # A② 지금 그대로
|
|
assert "for (const key of hide) on[key] = false;" in src
|
|
|
|
|
|
def test_common_parts_use_kit_and_no_page_imports() -> None:
|
|
for path in MAP.glob("*.ts"):
|
|
src = _read(path)
|
|
assert len(src.splitlines()) <= 700, path.name
|
|
for page in ("D03_PlanAnalysis", "B05_Profile", "B04_PreProcess"):
|
|
assert f"../../{page}" not in src and f"../{page}" not in src, (path.name, page)
|
|
for raw in ('createElement("button")', 'createElement("input")', 'createElement("select")'):
|
|
assert raw not in src, (path.name, raw)
|
|
chip = _read(MAP / "map_terrain_chip.ts")
|
|
assert "createSegment({" in chip and 'root.dataset.act = "terrain"' in chip
|
|
assert "createLegend(row)" in _read(MAP / "map_legend.ts")
|
|
assert "createMapTools({" in _read(MAP / "map_layer_bar.ts")
|
|
|
|
|
|
def test_d03_calls_common_only() -> None:
|
|
layers = _read(D03 / "D03_PlanAnalysis_UI_Layers.ts")
|
|
assert (
|
|
'createMapLayerBar({\n page: "d03"' in layers
|
|
and 'createMapLegend("d03-plan__legend")' in layers
|
|
)
|
|
assert len(layers.splitlines()) < 683 # 줄이기만
|
|
gl = _read(D03 / "D03_PlanAnalysis_UI_MapGl.ts")
|
|
assert "mapLayerSpecs(light, pick)" in gl and "function haloLine" not in gl
|
|
defs = _read(D03 / "D03_PlanAnalysis_UI_LayerDefs.ts")
|
|
assert "export const GROUPS" not in defs and "readPref" not in defs
|
|
ui_map = _read(D03 / "D03_PlanAnalysis_UI_Map.ts")
|
|
assert 'mapToolGroups("d03", {' in ui_map
|
|
assert 'createTerrainChip({ page: "d03", value: "sheet", have: ["sheet"] })' in ui_map
|
|
assert not (D03 / "D03_PlanAnalysis_UI_ForestLayers.ts").exists()
|