- 도면 단추(날 ui-panel-btn) · 장 번호 · 도구 단추 = 단추 부품 · ⚙ = 아이콘 단추 꼴 · 평면도 줄 = 목록 줄 꼴 - 머리 = 패널 머리 + 배지 · 확정 건너뜀 = 띠 알림 · 빈 글 = 빈 상태 · 측점 정보 = 값 목록 · ⚙ 모달 그룹 상자 = 카드 · 종류 이름 칸 = 입력 - window.confirm 둘 → 확인창 부품 · 죽은 CSS 걷음 · 시험 헬퍼 부품 가짜 한 벌(helper_b07_part_stubs) · 153-1 옛 오류(removeAttribute) 고침 · 가이드 선택자 · 지킴 시험 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
165 lines
6.6 KiB
Python
165 lines
6.6 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",
|
|
"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 "<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}: 날 색"
|
|
|
|
|
|
def test_b07_guide_selectors_alive():
|
|
"""가이드 촬영 장면이 잡는 B07 자기 클래스(`b07-…`)는 소스에 살아 있어야 함 — CAD 앱 안(`cad-…`)은 다른 몫."""
|
|
text = (ROOT / "A05_EduDetail/guide/B07/_scenes.json").read_text(encoding="utf-8")
|
|
for name in set(re.findall(r"\.(b07-[a-z0-9_-]+)", text)):
|
|
assert _defined("B07_DesignDetail", name), f"가이드 선택자 .{name} 가 B07 소스에 없음"
|
|
|
|
|
|
def test_b07_uses_parts_not_raw_widgets():
|
|
"""도면 단추 · 장 번호 · 도구 단추 · 그룹 상자 · 알림 · 값 줄이 부품으로 바뀜 · 시스템 확인창 없음."""
|
|
ts = "".join(_src("B07_DesignDetail", ".ts").values())
|
|
css = "".join(_src("B07_DesignDetail", ".css").values())
|
|
for part in (
|
|
"createButton",
|
|
"createBadge",
|
|
"createBanner",
|
|
"createEmpty",
|
|
"createKv",
|
|
"createPanelHead",
|
|
"createCard",
|
|
"createText",
|
|
"askConfirm",
|
|
):
|
|
assert part in ts, f"B07 이 부품 {part} 를 안 씀"
|
|
assert "window.confirm" not in ts
|
|
assert 'createElement("button")' not in ts and 'el("button"' not in ts
|
|
assert "ui-panel-btn" not in ts and "ui-panel-btn" not in css # 옛 날 단추 꼴
|
|
for old in (
|
|
"b07-info__row",
|
|
"b07-info__key",
|
|
"b07-plan-tools__button {",
|
|
"b07-settings__group {",
|
|
):
|
|
assert old not in css and old not in ts, f"옛 변종 {old} 가 남음"
|
|
|
|
|
|
def test_b07_css_common_values_only():
|
|
for name, css in _src("B07_DesignDetail", ".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}: 날 색"
|