Files
Aislo/resources/tester/test_165_pavement_flow.py
T
eomsangdonandClaude Opus 5.5 cb4bab7bf2 feat(구조물표): 323-5 고름 한 칸 — 관 세션 id(옮겨도 그대로 · 저장 안 함) · 고름 강조 한 규칙(pickLights · 카드 형상 · 3D 같은 함수) · 그린 것마다 신원표(data-structure-id + data-part) · 같은 자리 거리 = PIPE_MATCH_M 하나 · 322-0 이 깬 옛 시험 도움 파일 · 줄 수 고침
- `design_pipe_ids.ts` — 장부(세션 pipe-ids) · pipe-s{차례} · 자리 → id(찾는 거리 안 가장 가까운 것) · followMovedPipe 가 id 를 새 자리로(고름 id 그대로 · 순환 import 없게 design_selection 에서 옮김) · 설계 페이지가 프로젝트를 정함(usePipeIds) · 자리 이름 만들기 열 곳 · 되읽기 둘 걷음 · 측점 계획 주인 = 세션 id(withPipeIds)
- `design_pick_match.ts` — pickLights(① id ② 같은 자리 ③ 고른 부분) · paintPicked(카드 통째 형상 · 부분 · 관 계열 · 포장층은 제 손잡이) · tagShape — 관 세트 벽 · 집수정 · 관 · 세월교 측벽 · 몸체 · BOX 끝 · C군 벽 · 물넘이 콘크리트에 신원표 · 형상 판정면은 통째 형상 · 콘크리트만
- 3D — 부재 맞춤 = pickLights(옛 0.01 걷음) · C군 벽 솔리드 = 구조물 id(덮는 측점 어디서 골라도 한 번 스윕한 벽이 켜짐)
- 322-0 이 깬 것 고침 — 노면공 흐름 도움 파일(165 · 231-1) 정의 판 확인 흉내 · design_view_profile 700줄(322-0 이 704)
- 시험: test_323_5_pick(세션 id · 옮김 · 강조 규칙 · 칠하기) · 옛 시험 도움 파일 흉내 · 기대 글 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
2026-10-14 18:06:13 +09:00

125 lines
4.3 KiB
Python

# -*- coding: utf-8 -*-
"""165 B06 노면공 고름 일관성 — 조사 K 재현 차례 6단계.
못박는 것(단계마다 폼 · 알약 · 포장층 · 고른 카드 · 세션 sid 가 같은 것을 가리킴)
1. 목록 노면공 = 포장층 · 알약 · 폼 · sid 모두 노면공 · 카드는 안 고름(스크롤만 · 177-4 · 기준점이 범위 경계여도 범위 밖 카드로 안 감).
2. 범위 안 빈 카드 = 카드 하나 고름 · 노면공 풂 · 세션 = 그 측점(189-1 이 165-1 · 167-3 을 바꿈).
3. 고른 카드의 벽 = 관 폼 + 관 알약(알약이 꺼진 채 폼만 남지 않음 · 165-2) · 포장층 풂.
4. 알약 다시 = 1 과 같음. 관 자리 카드 = 관 · 범위 밖 카드 = 모두 풂(지금처럼).
5. B05 알약 → B06 복귀 = 1 과 같음 · 넘김 카드에서 안 튐.
6. 겹친 노면공 둘 = 고른 층만 · 범위 안 카드 누름 = 카드 하나(189-1).
Node 헬퍼 `helper_165_pavement_flow.cjs` 가 진짜 SPN 에 폼 · 카드 · 알약 흉내를 붙여 돌림. 화면은 사용자 확인.
"""
import json
import os
import subprocess
import pytest
HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.abspath(os.path.join(HERE, "..", ".."))
def _read(*parts: str) -> str:
with open(os.path.join(ROOT, *parts), encoding="utf-8") as handle:
return handle.read()
@pytest.fixture(scope="module")
def out():
proc = subprocess.run(
["node", os.path.join(HERE, "helper_165_pavement_flow.cjs")],
capture_output=True,
text=True,
encoding="utf-8",
timeout=60,
)
assert proc.returncode == 0, proc.stderr
return json.loads(proc.stdout)
def _pave(card, layer="pave", cards=12):
# 노면공 고름 = 카드 하나 안 고름 · 종단 측점선 없음(189-1)
return {
"form": layer,
"pill": layer,
"paveLayer": layer,
"paveCards": cards,
"card": card,
"sid": layer,
"line": None,
}
def _card(at):
# 카드 하나 고름 = 그 측점 기준 · 노면공 · 범위 강조 풂 · 세션 sid 없음(189-1)
line = None if at is None else f"s{at}"
return {
"form": None,
"pill": None,
"paveLayer": None,
"paveCards": 0,
"card": at,
"sid": None,
"line": line,
}
PIPE = {
"form": "pipe-80.17",
"pill": "pipe-80.17",
"paveLayer": None,
"paveCards": 0,
"line": "s80.17",
}
def test_1_목록_노면공(out):
assert out["step1"] == _pave(None) # 카드 하나 안 고름(177-4)
assert out["reveal1"] == "s40" # 기준점 30 = 범위 경계 → 범위 안 첫 카드(20 아님)
def test_2_범위_안_빈_카드는_카드_하나(out):
assert out["step2first"] == _card(40)
assert out["step2re"] == _card(None) # 같은 카드 재누름 = 풂(189-1)
assert out["step2"] == _card(140)
assert out["step2b"] == _card(100)
def test_3_벽은_관_폼과_관_알약_함께(out):
assert out["step3"] == {**PIPE, "card": 100, "sid": None}
def test_4_알약_다시_관_카드_범위_밖(out):
assert out["step4"] == _pave(None)
assert out["pipeCard"] == {**PIPE, "card": 80, "sid": None}
assert out["outside"] == _card(280)
assert out["outsideRe"]["card"] is None
def test_5_B05_복귀(out):
assert out["step5"] == _pave(None)
def test_6_겹친_노면공(out):
assert out["step6"] == _pave(None, "pave2", 6)
assert out["step6b"] == _card(160)
def test_배선():
panel = _read("B06_Section", "B06_Section_UI_Page_Structures_Panel.ts")
assert (
"deps.focusChainage(focusOf(structure), revealOnly);" in panel
) # 노면공 · 측점 없는 구조물(요구 178)
assert "openId" not in panel # 범위 안 빈 카드 = 연 노면공 지킴(165-1) 없앰 · 189-1
# 관 알약은 폼 뒤(폼이 연 구조물을 닫으며 알약을 끔)
at = panel.index("section.selectPipeByChainage(hit.pipeChainageM);")
assert at < panel.index(
"deps.markStructure?.(pipeIdAt(hit.pipeChainageM, deps.projectId));", at
)
view = _read("B06_Section", "B06_Section_UI_Section_View.ts")
assert "spanMarkId = span || isPavement(structureId) ? structureId : null;" in view
assert "held" not in view # 범위 카드 재누름 = 그대로(167-3) 없앰 · 189-1