Files
Aislo/resources/tester/test_552_2_parts.py
T
eomsangdonandClaude Opus 5.5 2c51bb53a6 feat(ui-kit): 기본 부품 입력 · 고르기 · 슬라이더 · 체크 · 켜기 · 분할 · 탭 · 배지 · 툴팁 · 보조 글 (PLAN 552-2)
- ui_template_input.ts · .css 새로 — createInputField · createSelectField 를 옮김(ui_template_elements 가 다시 내보냄 · 부르는 길 그대로) · size(data-size 단 높이) · unit(칸 안 단위) · multiline · createSlider(이름 | 막대 | 값 글 3열)
- 옛 compact 는 단을 안 붙임 — 옛 작은 칸 30 그대로(32 로 맞추면 페이지 칸이 바뀜 · 553 에서 단으로 옮김)
- 입력 · 고르기 상태 = 마우스 선 짙게 · 막힘 흐림 · 오류 빨강(aria-invalid 같이) · 고르기 화살표 = 보라 → 보조 글 색(밝음 · 어두움 따로)
- 체크 = 라디오 · 칩 꼴 더함(createCheckbox 부름 그대로) · 켜기(스위치 · 색 점 칩) · 분할 고르기(대시보드 .b01-sys-seg 꼴) · 탭(밑줄 · 보조 알약 = 옛 .ui-subtabs · 수 배지)
- 배지(알약 · 수 · 램프 ✓ ✗ · 점 · 옛 .ui-tag 같이) · 툴팁 제자리 상자(tooltipBox) · 보조 글(흐린 · 안내 · 오류 ✗ · 경고 ! · 성공 ✓)
- 부품 모음 기본 묶음 13 줄 모두 새 부품 견본 · 상태 다섯 칸 · 여덟 단 한 줄
- 시험 test_552_2_parts 새로(머리 · 옛 이름 · 크기 단 · 상태 · 날 색 없음 · 부품 모음 13)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 21:39:26 +09:00

131 lines
5.4 KiB
Python

"""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