Files
Aislo/resources/tester/test_634_1_pick_menu_row.py
T
eomsangdonandClaude Opus 5.5 2265ac4f7c feat(부품): 634-1 여럿 고르기 메뉴 · 한 행 두 영역 · 막힘 글 · 새 아이콘(요구 546)
- createPickMenu multi — menuitemcheckbox · 눌러도 안 닫힘 · values() · 줄 icon · disabled · title · setItem · 단추 ▾ + 켠 수 배지(0 = 없음) · 하나라도 켜면 눌림 · 밀기 · 창 크기 바뀌면 닫힘 · offLabel 없으면 끔 줄 · 눌림 없음
- createMapToolRow — 그룹1 왼쪽(행 반까지) · 그룹2 오른쪽 · 영역마다 min-width 0 + 자기 가로 밀기 · [?] 판은 행 아래
- mapToolTip — 평소 제목만 · 막힘 때만 「제목 — 까닭」 · MAP_TOOLS 글 = 표 호버제목
- 아이콘 — 묶음 넷(streams · signpost · parcelHouse · ban) · 겹친 셋 대신(contours · cutFill · lineament) · 스냅 간격 spacing
- 배지 count · accent 덧 · 부품 모음 견본 「고르기 메뉴(하나 · 여럿)」 · 지도 도구줄 한 행 견본
- 시험 568_1 고침 — 예정노선 둘 줄이 한 줄 꼴이 되어 목록에 잡힘 · 새 지킴 634_1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 11:26:52 +09:00

69 lines
3.1 KiB
Python

"""634-1 부품(요구 546) — 여럿 고르기 메뉴(안 닫힘 · 켠 수 배지 · 줄 아이콘 · 막힘) · 한 행 두 영역 · 견본 · 아이콘."""
import re
from pathlib import Path
UI = Path(__file__).resolve().parents[2] / "ui_template"
MENU = (UI / "ui_template_context_menu.ts").read_text(encoding="utf-8")
MENU_CSS = (UI / "ui_template_context_menu.css").read_text(encoding="utf-8")
TOOLS = (UI / "ui_template_map_tools.ts").read_text(encoding="utf-8")
TOOLS_CSS = (UI / "ui_template_map_tools.css").read_text(encoding="utf-8")
ICONS = (UI / "ui_template_icons.ts").read_text(encoding="utf-8")
def test_여럿_고르기_안_닫힘_배지():
pick = MENU[MENU.index("export function createPickMenu(") :]
assert '"menuitemcheckbox"' in pick and "values," in pick and "setItem(value, patch)" in pick
click = pick[pick.index('b.addEventListener("click"') :]
click = click[: click.index("pop.append(b);")]
# 여럿 = 켬끔 뒤 바로 돌아감(setOpen(false) 앞)
assert click.index("if (multi)") < click.index("setOpen(false)")
assert (
'createBadge("0", "accent", { kind: "count"' in pick
and "badge.hidden = count === 0;" in pick
)
assert 'root.setAttribute("aria-pressed", String(count > 0));' in pick
assert 'window.addEventListener("resize", onShift);' in pick # 창 크기 = 닫힘
assert 'document.addEventListener("scroll", onShift, true);' in pick # 밀기 = 닫힘
assert ".ui-pick-menu--multi" in MENU_CSS and ".ui-row-menu__item:disabled" in MENU_CSS
def test_한_행_두_영역():
assert "export function createMapToolRow(left: HTMLElement, right: HTMLElement)" in TOOLS
assert ":scope > .ui-map-tools__hint" in TOOLS # [?] 판은 행 아래
first = TOOLS_CSS[TOOLS_CSS.index(".ui-map-row__line > .ui-map-tools:first-child {") :]
first = first[: first.index("}")]
assert "flex-shrink: 0;" in first and "max-width: 50%;" in first # 모자라면 그룹2 먼저
area = TOOLS_CSS[TOOLS_CSS.index(".ui-map-row__line > .ui-map-tools {") :]
assert "min-width: 0;" in area[: area.index("}")]
def test_마우스_글_막힘만_까닭():
tip = TOOLS[TOOLS.index("export function mapToolTip(") :]
assert "why ? `${el.dataset.tip} — ${why}` : el.dataset.tip" in tip[: tip.index("\n}")]
assert 'title: "도움말"' in TOOLS
def test_아이콘_겹침_없음():
table = TOOLS[TOOLS.index("export const MAP_TOOLS") : TOOLS.index("satisfies")]
icons = re.findall(r'icon: "(\w+)"', table)
assert len(icons) == len(set(icons))
for name in (
"contours",
"cutFill",
"lineament",
"spacing",
"streams",
"signpost",
"parcelHouse",
"ban",
):
assert re.search(rf"^ {name}:", ICONS, re.M), name
def test_견본():
parts = (UI / "ui_template_ui_kit_parts.ts").read_text(encoding="utf-8")
frames = (UI / "ui_template_ui_kit_frames.ts").read_text(encoding="utf-8")
assert 'name: "고르기 메뉴(하나 · 여럿)"' in parts and "demo: pickDemo" in parts
assert "createMapToolRow(layers.root, tools.root)" in frames