Files
Aislo/resources/tester/test_553_1_pages.py
T
eomsangdonandClaude Sonnet 5.5 58dafb1572 refactor(B04): 전처리 화면 자체 변종을 부품 상자 부품으로 — 켜기 칩 · 분할 고르기 · 고르기 · 슬라이더 · 값 목록 · 카드 · 도구줄 (PLAN 553-1)
- 지도 층 단추 열다섯 안팎 · 표시 토글 셋 · 라이다 겹침 = 켜기 칩(층 색 점) · 도엽 보간 방식 = 분할 고르기 · 도구줄 부품
- 고르기 38 → 고르기 부품 · 점 크기 · 밀도 = 슬라이더 · 입력 파일 정보 = 값 목록 · 초기화 = 위험 고스트 · 묶음 상자 = 카드 + 패널 머리
- 죽은 CSS 열여섯 걷음 · 날 색 → 공통 값 · 가이드 촬영 선택자 · 지킴 시험 test_553_1_pages 늘림

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 22:09:36 +09:00

109 lines
4.4 KiB
Python

"""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",
):
assert part in ts, f"B03 이 부품 {part} 를 안 씀"
support = _src("B03_FileInput", ".ts")["B03_FileInput_UI_Support.ts"]
assert "<button" not in support # 날 단추 없음 — 단추는 부품이 만듦
assert 'class="ui-card b03-file__card' in support # 파일 카드 = 카드 부품
def test_b03_css_common_values_only():
for name, css in _src("B03_FileInput", ".css").items():
assert not OLD_ALIAS.search(css), f"{name}: 옛 보라 별칭"
body = re.sub(r"/\*.*?\*/", "", css, flags=re.S)
assert not RAW_COLOR.search(body), f"{name}: 날 색"
def test_b02_no_dead_select_and_no_raw_widgets():
css = "".join(_src("B02_ProjRegister", ".css").values())
assert "b02-proj__select" not in css # 안 쓰던 고르기 화살표 CSS — 고르기 부품이 냄
ts = "".join(_src("B02_ProjRegister", ".ts").values())
assert "<button" not in ts and 'createElement("button")' not in ts
def test_b04_guide_selectors_alive():
"""가이드 촬영 장면이 잡는 B04 자기 클래스는 소스에 살아 있어야 함."""
text = (ROOT / "A05_EduDetail/guide/B04/_scenes.json").read_text(encoding="utf-8")
for name in set(re.findall(r"\.(b04-[a-z0-9_-]+|contour-[a-z-]+|model-display-options)", text)):
assert _defined("B04_PreProcess", name), f"가이드 선택자 .{name} 가 B04 소스에 없음"
def test_b04_old_variants_gone():
"""날 단추 · 날 체크 · 손 고르기 · 손 슬라이더 · 손 값 줄이 부품으로 바뀜."""
ts = "".join(_src("B04_PreProcess", ".ts").values())
css = "".join(_src("B04_PreProcess", ".css").values())
for old in (
"b04-map__layer-button",
"toggle-button",
"toggle-label",
"b04-surface__select",
"viewer-option-row",
"b04-surface__sheet-method",
"b04-surface__line",
"contour-interval-submit",
"b04-surface__reset",
):
pattern = re.compile(
re.escape(old) + r"(?![a-z_-])"
) # 컨테이너 `...-buttons` 는 자리 이름이라 둠
assert not pattern.search(ts + css), f"옛 변종 {old} 가 남음"
for part in (
"createToggle",
"createSegment",
"createSelectField",
"createSlider",
"createKv",
"createToolbar",
"createPanelHead",
"createBadge",
):
assert part in ts, f"B04 가 부품 {part} 를 안 씀"
assert 'createElement("button")' not in ts # 단추는 부품이 만듦
assert 'createElement("select")' not in ts
assert 'variant: "danger-ghost"' in ts # 초기화 = 위험 고스트 부품
def test_b04_css_common_values_only():
for name, css in _src("B04_PreProcess", ".css").items():
assert not OLD_ALIAS.search(css), f"{name}: 옛 보라 별칭"
body = re.sub(r"/\*.*?\*/", "", css, flags=re.S)
assert not RAW_COLOR.search(body), f"{name}: 날 색"