- 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>
131 lines
5.4 KiB
Python
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
|