- 고르기: 누름 = 더함 · Shift = 뺌 · Ctrl = 넣고 빼기 · 상자 = 앞 고름 ∪ 상자 · Shift 상자 = 뺌(H4 · H5) · 명령 안 고르기 단계도 누를 때 첫 점 · 스침 강조(ic/selecting.ts) - 그립: 쉴 때만 집음(N7) · 누르고 떼면 대기 → 다음 누름에 놓음 · 끌어 놓기(H3) · 거리 숫자(N8) · 확정 · 읽기 전용 도면은 그립 · Delete 막음(H2) - 직교: F8 = 기준점에서 가로 · 세로 강제 · Shift 누른 동안 뒤집음 · 객체 스냅 점 · 좌표 · 각도 잠금은 안 덮음 · 클릭 사건 snapped 채움(ic/ortho.ts · H8) · 가이드는 F3 와 뗌 · 가이드 잡는 거리 = 화면 픽셀(H9) - 휠: 기본 밂(앞으로 굴리면 확대 · 오토캐드 · 모든 화면 · ☰ 설정 뒤집기 그대로) · 가운데 단추 두 번 = 범위 줌 · ZOOM · ⛶ 앞 화면 기억(ic/zoom-prompt.ts) - 시험: mouse-acad 새로 · 휠 방향 시험 손질(input-wheel · input-prefs-cad · input_prefs · app_settings · 164 · 220_1 · 221_1 · 244_8 기대값 뒤집음 · 266 pull 박음) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Se7ytqbohmBQnfYpwYFnYf
115 lines
4.0 KiB
Python
115 lines
4.0 KiB
Python
"""PLAN 332-1 — 휠 확대 방향 한 설정(`A00_Common/input_prefs.ts`) · 모든 휠 화면이 그 판정을 거침.
|
|
|
|
· 기본 = 밂(휠을 앞으로 = 확대 · 오토캐드 · 337) · 당김 저장 뒤 뒤집힘 · 깨짐 · 모르는 값 · 막힌 저장소 · Node = 기본
|
|
· 핀치(트랙패드 · 손가락)는 설정과 상관없이 늘 벌리면 확대
|
|
· 키 = 등록표 `input-prefs`(pref · global) 와 같은 글자
|
|
짝: `helper_input_prefs.cjs`(실제 TS 를 Node 로 돌림).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import re
|
|
import subprocess
|
|
|
|
import pytest
|
|
|
|
HERE = os.path.dirname(__file__)
|
|
ROOT = os.path.join(HERE, "..", "..")
|
|
|
|
pytestmark = pytest.mark.skipif(
|
|
not os.path.isdir(os.path.join(ROOT, "config", "node_modules")),
|
|
reason="프론트엔드 의존성 미설치",
|
|
)
|
|
|
|
|
|
def _read(rel: str) -> str:
|
|
with open(os.path.join(ROOT, rel), encoding="utf-8") as f:
|
|
return f.read()
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def r() -> dict:
|
|
proc = subprocess.run( # noqa: S603 — 고정 실행 파일
|
|
["node", os.path.join(HERE, "helper_input_prefs.cjs")],
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
timeout=60,
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
PULL = {"pull": True, "push": False, "mouseCtrl": True, "bridgePull": True}
|
|
PUSH = {"pull": False, "push": True, "mouseCtrl": False, "bridgePull": False}
|
|
PINCH = {"padSpread": True, "padPinch": False, "fingerSpread": True}
|
|
|
|
|
|
def _pick(case: dict, keys: dict) -> dict:
|
|
return {k: case[k] for k in keys}
|
|
|
|
|
|
def test_Node_기본_밂(r):
|
|
n = r["node"]
|
|
assert n["default"] == {"wheelZoom": "push", "cadAliases": {}}
|
|
assert n["prefs"] == n["default"]
|
|
assert _pick(n, PULL) == PUSH and _pick(n, PINCH) == PINCH
|
|
|
|
|
|
def test_당김_저장_뒤_뒤집힘_핀치는_그대로(r):
|
|
p = r["saved"]
|
|
assert p["prefs"]["wheelZoom"] == "pull"
|
|
assert _pick(p, PULL) == PULL
|
|
assert _pick(p, PINCH) == PINCH # 벌리면 확대는 설정과 상관없음
|
|
# 별칭 = 대문자 · 글자 아닌 것 · 빈 목록 버림
|
|
assert p["prefs"]["cadAliases"] == {"LINE": ["LL"]}
|
|
|
|
|
|
@pytest.mark.parametrize("case", ["broken", "unknown", "empty", "blocked"])
|
|
def test_깨짐_모르는_값_없음_막힘_기본(r, case):
|
|
c = r[case]
|
|
assert c["prefs"] == {"wheelZoom": "push", "cadAliases": {}}
|
|
assert _pick(c, PULL) == PUSH and _pick(c, PINCH) == PINCH
|
|
|
|
|
|
def test_등록표_키(r):
|
|
assert r["node"]["key"] == r["registryKey"] == "aislo:pref:input-prefs"
|
|
assert r["registryEntry"] == {"bucket": "pref", "scope": "global"}
|
|
|
|
|
|
def test_읽기_층은_의존_없음_불러올_때_window_안_만짐():
|
|
src = _read("A00_Common/input_prefs.ts")
|
|
assert not re.search(r"^import ", src, re.M)
|
|
assert "window." not in src
|
|
|
|
|
|
# 휠 줌 자리 — 직접 박은 방향(`deltaY < 0 ?` · `deltaY > 0 ?` · `-ev.deltaY`)이 없고 공용 판정을 부름
|
|
WHEEL_SITES = {
|
|
"A00_Common/touch_bridge.ts": "wheelEventIn(e, isPinchWheel(e))",
|
|
"A00_Common/b_svg_zoom_pan.ts": "wheelEventIn(event)",
|
|
"B04_PreProcess/B04_PreProcess_UI_Camera.ts": "wheelEventIn(event)",
|
|
"M02_MasterTemplete/DataFlow/M02_DF_Diagram.ts": "wheelZoomsIn(ev)",
|
|
"M02_MasterTemplete/M02_MasterTemplete_Labor_Diagram.ts": "wheelZoomsIn(e)",
|
|
"ui_template/ui_template_loupe.ts": "wheelIn(deltaY)",
|
|
"A00_Common/spreadsheet/spreadsheet_grid.ts": "wheelZoomsIn(ev)",
|
|
# wheelZoomsIn 을 거쳐 따라오는 셋
|
|
"B04_PreProcess/B04_PreProcess_UI_MapViewer.ts": "wheelZoomsIn(event)",
|
|
"B05_Profile/B05_Profile_UI_Drainage_Interact.ts": "wheelZoomsIn(event)",
|
|
"B05_Profile/B05_Profile_UI_RouteEdit_Input.ts": "wheelZoomsIn(event)",
|
|
}
|
|
|
|
|
|
@pytest.mark.parametrize("rel", sorted(WHEEL_SITES))
|
|
def test_휠_자리_공용_판정(rel):
|
|
src = _read(rel)
|
|
assert WHEEL_SITES[rel] in src
|
|
assert not re.search(r"deltaY [<>] 0 \?", src), rel
|
|
assert "-ev.deltaY" not in src and "Math.sign(-deltaY)" not in src
|
|
|
|
|
|
def test_700줄_안():
|
|
for rel in WHEEL_SITES:
|
|
assert _read(rel).count("\n") <= 700, rel
|