Files
Aislo/resources/tester/test_design_page_single.py
T
eomsangdonandClaude Opus 5.5 90a2cb9a11 refactor(B05·B06): 한 페이지 뼈대 — 주소 둘이 같은 페이지(design_page) · 같은 페이지 안 이동은 보기만 바꿈 · 떠날 때 3D · 종단도 · 횡단 정리 · 숨긴 3D 그리기 멈춤 · 창 키 듣기 뗌 · 뷰어 나눔(771→541)
- 라우터: 여러 주소 페이지(MountedPage) 길 · 같은 페이지면 셸도 다시 안 그림 · 떠나면 dispose · 늦게 끝난 옛 렌더 버림
- design_page: 보기 약속 DesignPageView(mount 중간 단계 · mountCenter 끝 모습 + shared 한 벌 자리) · host.onShow · onHide · onDispose
- 3D 뷰어: setActive(루프 멈춤 · 창 포인터 뗌) · dispose 가 WebGL 문맥까지 놓음 · 보관 지형은 남김 · 코리도 조각을 Viewer_Corridor 로
- 종단도: setActive(창 키 듣기 뗌 · 보일 때 초안 · 판 다시 읽음)
- 겹친 알약: 같은 측점이면 누른 알약을 그대로(24-6b)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt
2026-09-29 21:39:31 +09:00

77 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
"""한 페이지 뼈대(계획서 24-3a) · 겹친 알약(24-6b) 회귀검증.
주소 둘(`#/b05-profile` · `#/b06-section`)이 같은 페이지(`A00_Common/design/design_page.ts`)를
열고, 같은 페이지 안 이동은 다시 만들지 않고 보기만 바꾸는지, 떠날 때 3D(WebGL 문맥) ·
종단도 · 횡단을 정리하는지, 숨긴 3D 는 그리기 루프를 멈추는지, 창에 건 키 듣기를 떼는지 본다.
화면 수치(문맥 수 · 루프 · 같은 노드 · 전환 시간)는 ORCA 로 잰다 — 여기서는 길이 끊기지 않게 잠근다.
"""
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent.parent
def _read(relative: str) -> str:
return (ROOT / relative).read_text(encoding="utf-8")
def test_주소_둘이_같은_페이지():
router = _read("A00_Common/router.ts")
assert router.count('(await import("./design/design_page")).renderDesignPage') == 2
assert "export function showWithinPage(" in router
# 다른 페이지로 떠나면 정리 · 늦게 끝난 옛 렌더는 버림
assert "mounted?.dispose();" in router
assert "if (page && seq !== renderSeq) page.dispose();" in router
def test_같은_페이지면_셸도_다시_안_그림():
main = _read("A00_Common/main.ts")
within = main.index("showWithinPage(currentRoute())")
assert within < main.index("renderShell(appRoot")
assert "if (within) return;" in main
def test_보기_약속_두_길():
page = _read("A00_Common/design/design_page.ts")
assert "export interface DesignPageView" in page
assert "mount?: (root: HTMLElement, host: DesignPageHost)" in page
assert "mountCenter?: (" in page and "shared: DesignPageShared" in page
for hook in ("onShow:", "onHide:", "onDispose:"):
assert hook in page
# 보기는 처음 보일 때 한 번만 만든다 — 있으면 보이기만.
assert "if (slot) slot.show();" in page
def test_페이지가_숨김_떠남을_건다():
life = _read("B05_Profile/B05_Profile_UI_Page_Life.ts")
assert "deps.viewer.setActive(false)" in life and "deps.viewer.dispose()" in life
assert "bindProfileViewLife(host," in _read("B05_Profile/B05_Profile_UI_Page.ts")
b06 = _read("B06_Section/B06_Section_UI_Page.ts")
assert "host?.onHide(() => sectionView.setActive(false));" in b06
assert "host?.onDispose(() => sectionView.dispose());" in b06
def test_3D_멈춤과_문맥_놓기():
viewer = _read("B05_Profile/B05_Profile_UI_Viewer.ts")
assert "setActive(active)" in viewer
assert "renderer.forceContextLoss();" in viewer
# 보관 지형은 다음 뷰어가 쓴다 — 떠날 때 버리지 않는다.
assert "if (terrain !== cachedTerrain.object) disposeObject(terrain);" in viewer
assert len(viewer.splitlines()) <= 700
def test_창_키_듣기를_뗌():
tools = _read("B05_Profile/B05_Profile_UI_Profile_Panel_Tools.ts")
assert 'window.removeEventListener("keydown", onKeyDown);' in tools
assert 'window.addEventListener("keydown", (event)' not in tools
profile = _read("A00_Common/design/design_profile.ts")
assert "setListening(false);" in profile # dispose
pick = _read("B05_Profile/B05_Profile_UI_Viewer_Structure_Pick.ts")
assert "setListening(on)" in pick
def test_겹친_알약은_누른_것을_그대로():
profile = _read("A00_Common/design/design_profile.ts")
assert "stationIdAtStructure(selectedStructureId) === stationId" in profile