"""552-2 기본 부품(입력 · 고르기 · 슬라이더 · 체크 · 켜기 · 분할 · 탭 · 배지 · 툴팁 · 보조 글) 지킴 시험 — 화면 확인은 ORCA. · 부품마다 파일 머리(꼴 · 크기 · 상태 · 쓰기 · 대신) · 클래스 `ui-<부품>` · 옛 공용 이름 그대로 · 크기 = data-size(setUiSize) · 단 값(--ui-size-*)만 읽음 · 상태 = :hover · :active 를 data-state 로도 받음 · 색 = 공통 값만 · 부품 모음 기본 묶음 13 줄 모두 새 파일 견본(옛 PageKit 견본 없음) """ from __future__ import annotations import re from pathlib import Path ROOT = Path(__file__).resolve().parents[2] UI = ROOT / "ui_template" # 파일 · 만들기 함수 · 클래스 PARTS = { "input": ("createInputField", "ui-input"), "input ": ("createSelectField", "ui-select"), "input ": ("createSlider", "ui-slider"), "checkbox": ("createCheckbox", "ui-checkbox"), "toggle": ("createToggle", "ui-toggle"), "segment": ("createSegment", "ui-segment"), "tabs": ("createTabs", "ui-tabs"), "badge": ("createBadge", "ui-badge"), "hover_info": ("tooltipBox", "ui-hover-info"), "text": ("createText", "ui-text"), } def _text(path: Path) -> str: return path.read_text(encoding="utf-8") def test_파일_머리_이름(): for name, (fn, cls) in PARTS.items(): ts = _text(UI / f"ui_template_{name.strip()}.ts") assert f"export function {fn}(" in ts, fn assert cls in ts, cls head = ts[: ts.index("=====", 100)] for word in ("꼴", "크기", "상태", "쓰기", "대신"): assert word in head, (name, word) def test_옛_이름_그대로(): inp = _text(UI / "ui_template_input.ts") for cls in ( '"ui-field"', '"ui-field__label"', "ui-input ui-input--sm", "ui-select ui-select--sm", ): assert cls in inp, cls assert '"ui-field__error"' in inp and "ui-input--error" in inp elements = _text(UI / "ui_template_elements.ts") assert 'export * from "./ui_template_input";' in elements assert "export function createInputField" not in elements # 한 벌 # 보조 탭 = 옛 .ui-subtabs + 알약 단추 · 배지 = 옛 .ui-tag 같이 assert "ui-tabs ui-tabs--pill ui-subtabs" in _text(UI / "ui_template_tabs.ts") assert "ui-tag ui-tag--${tone}" in _text(UI / "ui_template_badge.ts") # 체크 클래스 그대로 assert "ui-checkbox__input" in _text(UI / "ui_template_checkbox.ts") def test_크기_단(): for name in ("input", "checkbox", "toggle", "segment", "tabs", "badge"): assert "setUiSize(" in _text(UI / f"ui_template_{name}.ts"), name for name in ("toggle", "segment", "tabs", "badge", "checkbox"): css = _text(UI / f"ui_template_{name}.css") assert "var(--ui-size-h)" in css, name inp = _text(UI / "ui_template_input.css") assert ".ui-input[data-size]:not(textarea)" in inp and "height: var(--ui-size-h)" in inp # 옛 compact 는 단을 안 붙임(옛 30 그대로) — 크기를 준 칸만 단 ts = _text(UI / "ui_template_input.ts") assert "if (opts.size) setUiSize(input, opts.size);" in ts def test_상태(): need = { "input": ['[data-state="hover"]', '[aria-invalid="true"]', ":disabled"], "checkbox": ['[data-state="hover"]', ":disabled"], "toggle": [ '[data-state="hover"]', '[data-state="active"]', ":disabled", 'aria-pressed="true"', ], "segment": [ '[data-state="hover"]', '[data-state="active"]', ":disabled", 'aria-checked="true"', ], "tabs": ['[data-state="hover"]', ":disabled", ".is-active"], } for name, words in need.items(): css = _text(UI / f"ui_template_{name}.css") for w in words: assert w in css, (name, w) # 램프 · 상태 글 = 기호 같이(색만으로 안 가름) assert 'success: "✓", danger: "✗"' in _text(UI / "ui_template_badge.ts") assert 'error: "✗", warning: "!", success: "✓"' in _text(UI / "ui_template_text.ts") def test_날_색_없음(): for name in ("input", "checkbox", "toggle", "segment", "tabs", "badge", "text", "hover_info"): css = _text(UI / f"ui_template_{name}.css") assert not re.search(r"#[0-9a-fA-F]{3,8}\b|rgba?\(", css), name assert "--b01-" not in css and "--draw-" not in css and "font-family" not in css, name assert ( len(css.splitlines()) <= 700 and len(_text(UI / f"ui_template_{name}.ts").splitlines()) <= 700 ) # 고르기 화살표 = 보조 글 색 값(그림 파일 속) · 옛 보라 없음 styles = _text(UI / "ui_template_elements_styles.ts") assert "%233e0079" not in styles assert "stroke='%236b7280'" in styles and "stroke='%239aa1ab'" in styles theme = _text(UI / "ui_template_theme.css") assert "--color-slate: #6b7280;" in theme and "--color-slate: #9aa1ab;" in theme def test_부품_모음_기본_13(): src = _text(UI / "ui_template_ui_kit_parts.ts") rows = re.findall(r'\{ key: "([^"]+)", name: "[^"]+", group: "basic",([^\n]*)', src) assert len(rows) == 13 # 목록 3장 1 ~ 13(체크 · 라디오 한 줄) for key, rest in rows: assert "legacy" not in rest, key block = src[src.index(f'{{ key: "{key}"') :].split("\n { key:")[0] assert "demo" in block, key assert "tabBar" not in src