"""553-1 B02 · B03 · B04 · B07 페이지 부품 옮김 지킴 시험 — 자체 변종이 부품으로 바뀐 자리 · 가이드 촬영 선택자 · 날 색 없음.""" import json import re from pathlib import Path ROOT = Path(__file__).resolve().parents[2] OLD_ALIAS = re.compile(r"--color-(royal-amethyst|deep-iris|mist-violet|plum-velvet|lavender-wash)") RAW_COLOR = re.compile(r"#[0-9a-fA-F]{3,8}\b|\brgba?\(") def _src(folder: str, suffix: str) -> dict[str, str]: return {p.name: p.read_text(encoding="utf-8") for p in (ROOT / folder).glob(f"*{suffix}")} def _guide_selectors(page: str, prefix: str) -> set[str]: text = (ROOT / f"A05_EduDetail/guide/{page}/_scenes.json").read_text(encoding="utf-8") return set(re.findall(rf"\.{re.escape(prefix)}[a-z0-9_-]+", text)) def _defined(folder: str, name: str) -> bool: body = "".join(_src(folder, ".ts").values()) + "".join(_src(folder, ".css").values()) return name.lstrip(".") in body def test_b03_guide_selectors_alive(): """가이드 촬영 장면이 잡는 B03 클래스는 소스에 살아 있어야 함.""" for sel in _guide_selectors("B03", "b03-file__"): assert _defined("B03_FileInput", sel), f"가이드 선택자 {sel} 가 B03 소스에 없음" def test_b03_uses_parts(): ts = "".join(_src("B03_FileInput", ".ts").values()) for part in ( "createBanner", "createProgressBar", "createToggle", "createPanelHead", "createIconButton", "createText", "createDrop", "openModal", "askConfirm", "createCard", "createListRow", ): assert part in ts, f"B03 이 부품 {part} 를 안 씀" assert "window.confirm" not in ts # 시스템 대화상자 없음 — 확인창 부품 css = "".join(_src("B03_FileInput", ".css").values()) for old in ( "b03-file__modal", "b03-file__temp-option", "b03-file__progress-bar", "native-input", ): assert old not in css and old not in ts, f"옛 변종 {old} 가 남음" support = _src("B03_FileInput", ".ts")["B03_FileInput_UI_Support.ts"] assert "