Files
Aislo/resources/tester/test_445_curve_icon.py
T
eomsangdonandClaude Sonnet 5.5 6aa0582495 feat(B05): 교각점 정보 = 근처 아이콘 · 아이콘 누름 = 정보 창 (PLAN 587-1 · 요구 445 C1)
- 교각점 고름 = 창 없이 근처(40 px) 아이콘 · 멀면 0.7 s 뒤 숨김 · 누름 = 창 열림(멀어져도 유지)
- 창 열린 채 다른 교각점 = 열린 채 새 정보 · 닫힌 채 = 닫힌 채 · [닫기] = 창 닫고 고름 풂
- 부품 상자 아이콘 단추 「유리」 꼴 더함(견본 · 시험 552-2)
- 새 지킴 시험 test_445_curve_icon · 398-2 · 408 도우미에 가짜 아이콘

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 18:42:16 +09:00

85 lines
3.2 KiB
Python

"""445-C1 B05 교각점 정보 = 근처 아이콘 — 규칙(`logic/B05_Profile_RouteEdit_CurveIcon.ts`)을 Node 로 돌려 판정 +
배선 글 대조(`_CurveBar` 가 열림을 봄 · 닫기는 고름도 풂 · 아이콘은 부품 상자 유리 꼴).
./venv/Scripts/python.exe -m pytest resources/tester/test_445_curve_icon.py -q
"""
import json
import subprocess
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
B05 = ROOT / "B05_Profile"
LOGIC = B05 / "logic" / "B05_Profile_RouteEdit_CurveIcon.ts"
TS = ROOT / "config" / "node_modules" / "typescript"
DRIVER = r"""
const fs = require("fs");
const ts = require(process.argv[1]);
const js = ts.transpileModule(fs.readFileSync(process.argv[2], "utf8"), {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
}).outputText;
const m = { exports: {} };
new Function("exports", "module", js)(m.exports, m);
const L = m.exports;
console.log(JSON.stringify({
near: L.NEAR_PX,
nearIn: L.isNear(L.NEAR_PX, false),
nearOut: L.isNear(L.NEAR_PX + 1, false),
nearOnIcon: L.isNear(500, true),
keepOpenOther: L.openAfterPick(true, 3),
closedStaysClosed: L.openAfterPick(false, 3),
releaseCloses: L.openAfterPick(true, -1),
noPick: L.iconVisible(-1, false, true, false),
picked_near: L.iconVisible(2, false, true, false),
picked_far: L.iconVisible(2, false, false, false),
picked_far_touch: L.iconVisible(2, false, false, true),
open_near: L.iconVisible(2, true, true, false),
}));
"""
@pytest.fixture(scope="module")
def got() -> dict:
run = subprocess.run( # noqa: S603 — 고정 실행 파일
["node", "-e", DRIVER, str(TS), str(LOGIC)],
capture_output=True,
text=True,
encoding="utf-8",
timeout=60,
)
assert run.returncode == 0, run.stderr
return json.loads(run.stdout)
def test_근처_판정(got) -> None:
assert got["near"] == 40
assert got["nearIn"] is True and got["nearOut"] is False
assert got["nearOnIcon"] is True # 아이콘 위는 멀어도 근처
def test_창_열림_이어감(got) -> None:
assert got["keepOpenOther"] is True # 열린 채 다른 교각점 = 열린 채
assert got["closedStaysClosed"] is False # 닫힘 = 닫힌 채
assert got["releaseCloses"] is False # 고름 풂 = 닫힘
def test_아이콘_보임(got) -> None:
assert got["noPick"] is False
assert got["picked_near"] is True and got["picked_far"] is False
assert got["picked_far_touch"] is True # 터치 = 고르면 늘 보임
assert got["open_near"] is False # 창이 열리면 아이콘 숨김
def test_배선_글() -> None:
bar = (B05 / "B05_Profile_UI_RouteEdit_CurveBar.ts").read_text(encoding="utf-8")
assert "openAfterPick" in bar and "icon.update(" in bar
assert "onClose: () => params.onUnselect()" in bar # 닫기 = 창 닫고 고름도 풂
# 닫힘이면 창을 숨기고 아이콘만 — 창 show 보다 앞
assert bar.index("if (!open) {") < bar.index("label.show({")
icon = (B05 / "B05_Profile_UI_RouteEdit_CurveIcon.ts").read_text(encoding="utf-8")
assert 'variant: "glass"' in icon and "createIconButton" in icon # 부품 상자 유리 꼴
assert "document.createElement" not in icon.split("export function")[1] # 날 요소 없음