Files
Aislo/resources/tester/test_272_swap_keeps_canon.py
T
eomsangdonandClaude Opus 5.5 ff21ef21b7 fix(472 덧 관 지움 ↶): 갈아끼움 — 지금 상세에 없던 측점이 정본 자리로 돌아오면 정본 설계(빈 기본 설계 아님)
- 관 지움 ↶ = 351 측점이 새로 서며 freshDesign(잠정 status · 포장 권장 pavement_suggested 빠짐 → 성토 경고 안내가 달라짐) → 같은 자리 정본 행이 있으면 그 설계 사본
- 지금 상세에 같은 자리 측점이 있으면(격자에 구조물 놓기 등) 옛 규칙 그대로 · 노선 초안 차례 그대로
- 시험 test_272_swap_keeps_canon 관 지움 되돌림(옛 코드 실패)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:34:51 +09:00

145 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
"""467 (요구 272 · 분석 4장 (B1)) — 노선 초안 없는 차례의 갈아끼움이 정본 횡단을 지킴.
못박는 것
- 관만 옮김(노선 초안 없음) — 같은 열쇠 · 누가거리 0.01 m 안 측점은 앞 횡단(서버 정본)
기하 · 표본 · 중심고 그대로(R 12 곡선 축 차 3.3e-4 · 중심 0.5 mm 차여도) ·
옮긴 관 측점만 브라우저 표본.
- 되돌림(관 제자리) — 관 측점 밖 모든 횡단이 정본과 바이트 같음(관 측점 = 브라우저 표본).
- 노선 초안 차례 = 옛 규칙(축 허용 1e-4 · 넘으면 브라우저 표본).
- 가게 길(`swapSectionStations`) = 가게 `routeDraft` 로 가름 — 없음 · 있음 ·
초안 버린 직후(초안 표본이 안 남음).
Node 헬퍼 `helper_272_swap_canon.mjs` 가 vite ssr 로 묶은 진짜 모듈을 부름.
"""
import json
import shutil
import subprocess
from pathlib import Path
import pytest
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[1]
CURVES = ("27.50", "33.20", "38.90")
STRAIGHT = ("0.00", "20.00", "40.00", "60.00", "70.00")
STILL = (*STRAIGHT, *CURVES)
@pytest.fixture(scope="module")
def out(tmp_path_factory):
work = tmp_path_factory.mktemp("b272swap")
build = subprocess.run( # noqa: S603 — 고정 실행 파일
[
"node",
str(ROOT / "config" / "node_modules" / "vite" / "bin" / "vite.js"),
"build",
"--configLoader",
"runner",
"--ssr",
"../resources/tester/helper_272_swap_canon_entry.ts",
"--outDir",
str(work),
"--logLevel",
"error",
],
cwd=ROOT,
capture_output=True,
text=True,
encoding="utf-8",
timeout=300,
)
assert build.returncode == 0, build.stderr
bundle = work / "bundle.mjs"
shutil.copy(work / "helper_272_swap_canon_entry.js", bundle)
proc = subprocess.run( # noqa: S603
["node", str(HERE / "helper_272_swap_canon.mjs"), str(bundle)],
cwd=ROOT,
capture_output=True,
text=True,
encoding="utf-8",
timeout=120,
)
assert proc.returncode == 0, proc.stderr
return json.loads(proc.stdout)
def test_관만_옮김_정본_기하_표본_그대로(out):
keep = out["pure"]["keep"]
for at in STILL:
assert keep[at]["same"], at # 곡선 축 차 3.3e-4 여도 서버 표본 · 기하
assert keep[at]["mark"] == f"canon@{float(at):g}"
assert keep["55.00"]["browser"] and not keep["55.00"]["same"] # 옮긴 관 = 새 자리 표본
assert out["pure"]["keepMoved"] is False # 「노선 밖 고침」 셈 그대로(0.01 m)
assert out["pure"]["defaultIsKeep"] # 기본 = 노선 초안 없음
def test_되돌림_정본과_바이트_같음(out):
back = out["pure"]["back"]
assert all(back[at]["same"] for at in STILL)
assert out["pure"]["backBytes"] # 관 측점 밖 횡단 = 정본 바이트
assert back["45.00"]["browser"] # 관 측점 = 브라우저 표본(정본은 저장 뒤 서버 값)
def test_격자에_구조물_놓고_뺌_같은_자리_정본(out):
g = out["gridStructure"]
assert (
g["placed"]["same"] and not g["placed"]["browser"]
) # 열쇠 바뀜(구조물) · 같은 자리 = 정본
assert g["removed"]["same"] and not g["removed"]["browser"] # 다시 격자 = 정본 표본 · 기하
assert g["removedBytes"]
def test_노선_초안_차례는_옛_규칙(out):
draft = out["pure"]["draft"]
for at in CURVES: # 축 차 > 1e-4 = 새 표본
assert draft[at]["browser"] and not draft[at]["same"], at
for at in STRAIGHT: # 축 차 1e-5 · 자리 같음 = 앞 표본(기하는 새 틀)
assert not draft[at]["browser"] and not draft[at]["same"], at
def test_가게_길_초안_없음(out):
s = out["storeNoDraft"]
assert s["moved"] and s["back"]
assert all(s["moved"][at]["same"] for at in STILL)
assert all(s["back"][at]["same"] for at in STILL) and s["backBytes"]
def test_가게_길_초안_있음_버린_직후(out):
s = out["storeDraft"]
assert s["routeDraftSet"]
for at in CURVES: # 초안이 옮긴 곡선 = 새 표본
assert s["draft"][at]["browser"], at
for at in STRAIGHT: # 초안 차례 = 옛 규칙(기하 새 틀 · 표본 앞 값)
assert not s["draft"][at]["same"] and not s["draft"][at]["browser"], at
dropped = s["dropped"]
for at in (
CURVES
): # 버린 뒤 = 저장 정본 자리 · 표본(초안 3 cm 자리 표본이 안 남음 · 467 덧 정본 물러섬)
assert dropped[at]["same"] and not dropped[at]["browser"], at
for at in STRAIGHT: # 초안이 안 옮긴 측점 = 앞 횡단 표본(서버) 그대로
assert not dropped[at]["browser"], at
def test_옮겼다_제자리_관_측점_정본(out):
p = out["pipeBack"]
assert p["pipe"]["same"] and not p["pipe"]["browser"] # 저장 정본 표본 · 기하
assert p["bytes"] # 관 밖 횡단 = 정본 바이트(관 설계 = 옮김 규칙 · 다시 셈 입력은 정본 물러섬)
def test_일반_측점_자리_관_지움_다른_목록(out):
g = out["pipeGone"]
assert g["placedKind"] == "irregular"
assert g["same"] is False # 관 카드 → 일반 측점 = 갈아끼움
assert g["sameUntouched"] is True # 일반 측점 그대로 = 같은 목록
assert g["culvertLeft"] is False and g["kind"] == "regular" # 관 카드 안 남음
assert g["canon"] # 그 자리 정본 표본 · 기하
def test_관_지움_되돌림_정본_설계(out):
r = out["pipeRestore"]
assert r["design"] and r["copy"] # 지우기 전 설계(정본 사본) — 빈 기본 설계 아님(472 덧)
assert r["place"] and r["bytes"]
assert r["bareFresh"]