- 계산 묶음 drainage 단계(pipelineStage · 붙이기 = 묶음 쪽) — 노선 초안 · 관이 바뀌면 낡음 · 자동 = 3 s 조용한 뒤 「지금 노선으로 셈」 · 수동 = 칸만 흐림 + 가운데 [업데이트] · 구석 「계산 중」 · 다시 조작하면 요청 끊고 처음으로 · 덮개 없음 - ⚙ 설정 창(배수유역 칸 머리 · openModal) 수동(기본) / 자동 · 계정 화면 설정 drainage-mode(b_page_state 등록표 한 줄 · build:corridor 다시 지음) - 늦은 답 버림 = 차례 번호 · 서버 superseded · 세부유역 요청 감싸기와 같은 차례(B05_Profile_UI_Drainage_Run 으로 나눔) - 제안 = 관경(Ø→Ø) · 시설(BOX암거 · 세월교) · 관 자리 후보(지도 점선 원) · [적용] 한 번에 관 초안 · 자동 바꿈 없음 - [확정] savePipes(confirm) = PUT ?recompute=true · [저장] = 낡음 달고 저장 · 패널 691줄 - 순수 규칙 logic/B05_Profile_Drainage_Live · _Suggest · 시험 test_347_2_drainage_live_ui · typecheck 통과 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
"""347-2 · 347-3 배수유역 자동/수동 · 제안 — 화면 쪽 순수 규칙(logic/ 두 파일).
|
|
|
|
- 기본 수동 · 자동 = 3 초 조용한 뒤 · 노선 초안이 있을 때만 낡음.
|
|
- 늦은 답 버림: 옛 차례 · 서버가 그만둔 답 · 답 차례가 다른 것은 안 올림.
|
|
- 제안: 관경(배관 · 추천 ≠ 지금) · 시설(BOX암거 · 세월교) · 관 자리(기존 관 근처 뺌) ·
|
|
[적용] = 한 번에 얹음 · 입력 목록은 안 고침(자동 바꿈 없음).
|
|
Node 헬퍼(`helper_347_2_drainage_live.cjs`)가 TS 를 그 자리에서 돌린다.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
|
|
import pytest
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def r():
|
|
proc = subprocess.run(
|
|
["node", os.path.join(HERE, "helper_347_2_drainage_live.cjs")],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=60,
|
|
encoding="utf-8",
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
def test_mode_and_stale(r):
|
|
assert r["quietMs"] == 3000
|
|
assert r["modes"] == ["manual", "auto", "manual"]
|
|
assert r["stale"] == [False, True]
|
|
|
|
|
|
def test_late_answers_dropped(r):
|
|
assert r["accept"] == [True, False, False, False]
|
|
assert r["body"] == {"generation": 5, "route": None, "points": [{"chainage_m": 1}]}
|
|
|
|
|
|
def test_suggestions_collected(r):
|
|
assert r["suggestions"] == [
|
|
{"kind": "diameter", "chainageM": 100, "from": 1000, "to": 1200},
|
|
{"kind": "position", "chainageM": 200},
|
|
{"kind": "facility", "chainageM": 300, "from": "pipe", "to": "ford_bridge"},
|
|
]
|
|
|
|
|
|
def test_apply_once_without_touching_input(r):
|
|
assert r["untouched"]
|
|
applied = {pipe["chainage_m"]: pipe for pipe in r["applied"]}
|
|
assert sorted(applied) == [100, 200, 300, 500]
|
|
assert applied[100]["options"]["pipe_diameter_mm"] == 1200
|
|
assert applied[200]["source"] == "spacing"
|
|
assert applied[300]["facility"] == "ford_bridge"
|
|
assert applied[500]["facility"] == "box_culvert" # 이미 그 종류 — 그대로
|