Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VmC34fsxxbweEG3RUjs3Mn
108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""224-1c(PLAN 325-3) 유토곡선 · 배수유역 [창 분할] — 종단 [창 분할]과 같은 양식 · 따로 새 창.
|
|
|
|
- 단추 = 유토 판 좌상단 · 배수 머리줄 맨 앞 · 글 [창 분할]/[창 결합] · 툴팁에 판 이름.
|
|
- 창 이름 셋 다름(같으면 앞 창 body 를 덮어 조각이 사라짐).
|
|
- 뗌 = 새 창 body · 유토 손잡이 숨김 · 인라인 높이 비움 · 배수 지도 관찰 rehome.
|
|
- 붙임(단추 · 새 창 닫힘 · 페이지 떠남) = 제자리 — 유토 손잡이 바로 앞 · 배수 content 끝.
|
|
- 종단 새 창 안에서 다시 떼면 그 창이 새 창을 엶(메인 창 팝업 차단 피함).
|
|
|
|
`helper_224_1c_subpanel_popout.cjs` 가 진짜 TS 를 가짜 DOM · 가짜 창 위에서 돌림.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import re
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
ROOT = Path(HERE).parents[1]
|
|
NAMES = ["aislo-profile-popout", "aislo-masshaul-popout", "aislo-drainage-popout"]
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def r():
|
|
proc = subprocess.run(
|
|
["node", os.path.join(HERE, "helper_224_1c_subpanel_popout.cjs")],
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
timeout=60,
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
def test_단추_글_툴팁_클래스(r):
|
|
cls = "ui-btn ui-btn--ghost b05-subpanel__popout"
|
|
assert r["mass"] == {
|
|
"text": "창 분할",
|
|
"title": "유토곡선 창 분할",
|
|
"className": cls,
|
|
"type": "button",
|
|
}
|
|
assert r["drainage"] == {
|
|
"text": "창 분할",
|
|
"title": "배수유역 창 분할",
|
|
"className": cls,
|
|
"type": "button",
|
|
}
|
|
assert "b05-route-profile__popout" in r["profile"]["className"]
|
|
|
|
|
|
def test_유토_뗌(r):
|
|
assert r["massOpened"] == {
|
|
"inPopupBody": True,
|
|
"isPopout": True,
|
|
"handleHidden": True,
|
|
"inline": "",
|
|
"text": "창 결합",
|
|
"docTitle": "유토곡선 — Aislo",
|
|
}
|
|
|
|
|
|
def test_배수_뗌은_rehome(r):
|
|
assert r["drainOpened"] == {"inPopupBody": True, "rehomes": 1, "text": "창 결합"}
|
|
|
|
|
|
def test_새_창_닫힘과_단추로_제자리(r):
|
|
assert r["massClosed"] == {
|
|
"order": ["b05-profile__masshaul-overlay", "b05-profile__masshaul-handle"],
|
|
"handleHidden": False,
|
|
"isPopout": False,
|
|
"text": "창 분할",
|
|
}
|
|
assert r["drainClosed"] == {"popupClosed": True, "last": True, "rehomes": 2, "text": "창 분할"}
|
|
|
|
|
|
def test_창_이름_셋_다름과_여는_창(r):
|
|
names = [name for _, name in r["opened"]]
|
|
assert set(names) == set(NAMES) and len(set(NAMES)) == 3
|
|
# 종단 새 창 안의 단추는 종단 새 창이 엶
|
|
assert r["opened"][3] == ["aislo-profile-popout", "aislo-masshaul-popout"]
|
|
assert r["nested"]["profileInPopup"] is True
|
|
|
|
|
|
def test_페이지_떠나면_셋_다_닫고_제자리(r):
|
|
assert r["disposed"] == {
|
|
"closed": [True, True, True],
|
|
"profileInSlot": True,
|
|
"massBeforeHandle": True,
|
|
"drainInContent": True,
|
|
"handleHidden": False,
|
|
"original": 1,
|
|
}
|
|
|
|
|
|
def test_배선과_양식():
|
|
shared = (ROOT / "A00_Common/design/design_shared.ts").read_text(encoding="utf-8")
|
|
assert "attachSubPanelPopouts(profile);" in shared
|
|
css = (ROOT / "A00_Common/design/design_page.css").read_text(encoding="utf-8")
|
|
block = re.search(r"\n\.b05-subpanel__popout \{([^}]*)\}", css).group(1)
|
|
assert "var(--btn-bar-padding)" in block and "var(--btn-bar-font-size)" in block
|
|
assert ".b05-profile__masshaul-overlay.is-popout," in css
|
|
assert ".b05-drainage.is-popout {" in css
|