- 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>
69 lines
3.1 KiB
Python
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
|