"""552-5 부품 흠 다섯 지킴 시험 — 화면 실측은 Playwright · ORCA(부품 모음 · B07 · B03). ① 보조 글 — 글 줄 안 span · small 은 inline(줄 안 끊김) ② 단추 실측 = 단 — 여백 1em 기준 · 줄 높이 1 · 왼쪽 패널 양식(.ui-panel-form) 옛 규칙이 덮지 않음 ③ [hidden] 단추 — 단추 display 가 숨김을 덮지 않음 ④ 파일 놓기 칸 — 칸 전체 누름 · Enter · Space = 파일 고르기 · 단추 누름은 한 번만 ⑤ 표 — 격자 꼴(grid · 세로선) · 합친 칸(colSpan · rowSpan · head) · 기본 꼴 그대로 """ from __future__ import annotations import re from pathlib import Path UI = Path(__file__).resolve().parents[2] / "ui_template" RAW = re.compile(r"#[0-9a-fA-F]{3,8}\b|rgba?\(|--b01-|--draw-") def _t(name: str) -> str: return (UI / name).read_text(encoding="utf-8") def _rule(css: str, selector: str) -> str: return re.search(re.escape(selector) + r" \{([^}]*)\}", css).group(1) def test_보조_글_줄_안_inline(): css = _t("ui_template_text.css") assert "display: inline;" in _rule(css, ":is(span, small).ui-text") assert "display: flex;" in _rule(css, ".ui-text") # p · div 는 한 줄 상자 그대로 assert not RAW.search(css) def test_단추_실측_단(): css = _t("ui_template_button.css") rule = _rule(css, ".ui-btn[data-size]") assert "calc((var(--ui-size-h) - 2px - 1em) / 2)" in rule and "line-height: 1;" in rule panel = _rule(css, ".ui-panel-form .ui-btn[data-size]:not(.ui-help-btn, .ui-step-nav-btn)") assert "padding-block: calc((var(--ui-size-h) - 2px - 1em) / 2);" in panel assert "line-height: 1;" in panel # 덮는 옛 규칙(글 12 · 줄 높이 normal)은 그대로 — 단 규칙이 더 세게(클래스 넷 > 셋) overlay = (UI / "ui_template_overlay.css").read_text(encoding="utf-8") assert ".ui-panel-form .ui-btn:not(.ui-help-btn, .ui-step-nav-btn) {" in overlay def test_숨김_단추(): css = _t("ui_template_button.css") assert "display: none !important;" in _rule(css, ":is(.ui-btn, .ui-icon-btn)[hidden]") def test_놓기_칸_전체_누름(): ts, css = _t("ui_template_drop.ts"), _t("ui_template_drop.css") assert 'attrs: { role: "button" }' in ts assert 'root.addEventListener("click"' in ts and "ev.target !== input" in ts assert 'ev.key !== "Enter" && ev.key !== " "' in ts and "ev.target !== root" in ts assert "root.tabIndex = on ? -1 : 0" in ts # 단추는 칸으로 올라감 — 따로 열면 두 번 열림 pick = re.search(r"const pick = createButton\(\{([^}]*)\}\)", ts).group(1) assert "onClick" not in pick assert "cursor: pointer;" in _rule(css, ".ui-drop") def test_표_격자_합친_칸(): ts, css = _t("ui_template_table.ts"), _t("ui_template_table.css") assert "grid?: boolean" in ts and '" ui-table--grid"' in ts assert "export interface SpanCell" in ts assert "td.colSpan = span.colSpan" in ts and "td.rowSpan = span.rowSpan" in ts assert 'el(span?.head ? "th" : "td"' in ts assert "if (columns.length)" in ts # 머리 줄 없는 표 grid = _rule(css, ".ui-table--grid :is(th, td)") assert "border: 1px solid var(--color-border);" in grid assert "border-style: hidden;" in _rule(css, ".ui-table--grid") # 기본 꼴 = 세로선 없음 그대로 assert "border-left" not in _rule(css, ".ui-table td") assert not RAW.search(css) kit = _t("ui_template_ui_kit_parts.ts") assert "grid: true" in kit and "rowSpan: 2" in kit