"""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 도구줄 세 묶음 그대로 + 끝에 추천(636-2) · 지형 칩 · 맨 앞 [?] 도움말 줄(634-2 표 17 줄 · 단추는 `hint`) assert d03 == [ ["hint-toggle"], ["undo", "redo"], ["view3d", "rotate-ccw", "rotate-cw"], ["stations", "slopes", "measure"], ["recommend"], ["terrain"], ], d03 b05 = {k for g in _toolbar_rows() for k, p in g if "b05" in p} assert { "contour-minor", "footprint", "station-snap", "recommend", "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} - { "hint-toggle", "recommend", "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: { pref: "aislo:pref:d03.layers" }' in src b05 = re.search(r"b05: \{(.*?)\},", src, re.S).group(1) # 634-2 — 숨김 표 걷음(요구 546 표 = 22 겹 두 페이지 사용) · 보일 페이지 = 겹 줄 `pages` assert "hide" not in b05 assert 'on: ["contour", "stream"]' in b05 # A② 지금 그대로 assert "if (!def.pages.includes(page)) on[def.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 "terrain: events.terrain," in ui_map # 칩 = 예정노선 지형 칸(624-4) lidar = _read(D03 / "D03_PlanAnalysis_UI_LidarUpload.ts") assert 'createTerrainChip({\n page: "d03",' in lidar assert not (D03 / "D03_PlanAnalysis_UI_ForestLayers.ts").exists()