Files
Aislo/resources/tester/test_342_1_station_line.py
T
eomsangdonandClaude Opus 5.5 ca8c88f810 perf(횡단): 346-2 국부 연산 · [전체 측점 반영] 한 번 · 보이는 카드 먼저
- 횡단 다시 셈이 측점별 입력 지문(지반 표본 · 계획고 · 횡단 입력 · 구조물 맥락 · 표준값)을 기억 — 같으면 앞 결과 그대로 · 계획고 ▲ 한 번 = 10 측점 중 2 측점만 다시 셈 · 결과는 통째 셈과 같음
- [전체 측점 반영] = 다시 셈 한 번(측점마다 66 × 66 돌던 것) · 지금 값을 「사용자 선택」으로 박는 동작 없앰(암 경계 다시 셈 포함 · 사용자 확정 10-16)
- 횡단 카드: 보이는 카드만 바로 갈아 끼움 · 화면 밖은 쉬는 틈에 몇 장씩(경고칩 · 면적 합은 계산값이라 그대로)
- 머묾 재현 · 국부 연산 · 흙 배분 열쇠 · 전체 반영 · 카드 시험(vite ssr 로 진짜 모듈 묶음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QfHKQs7J3hQELKMWQMUJEy
2026-10-16 11:16:19 +09:00

127 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
"""342-1 · 346-2 — 계획선 한 벌 · 낡음 머묾 · 국부 연산 · 흙 배분 열쇠 · [전체 측점 반영] · 카드.
못박는 것
- 머묾 재현: 서버 측점 85.054(0.001 m) · 관 지점 85.05(0.01 m) · 종단곡선 안 — 저장분 선으로
다시 세면 화면 선 기준 낡음이 남음(옛 길) · 화면 선을 받으면 낡음 0 · B05 · B06 판정 같음.
- 국부 연산: 같은 입력 다시 셈 0 측점 · 계획고 ▲ 한 번 = 곡선 둘레 몇 측점 · 결과 = 통째 셈.
- 다시 셈 뒤에도 남은 낡음 = 기다림 끝(false) · 콘솔 경고 한 줄 · 다시 그림(곡선은 그림).
- 흙 배분: 실패한 열쇠 다시 보냄 · 받아 둔 열쇠는 다시 안 물음.
- [전체 측점 반영] = 다시 셈 한 번 · 측점 선택을 세션에 안 박음.
- 횡단 카드: 보이는 카드만 바로 · 나머지는 쉬는 틈에.
Node 헬퍼 `helper_342_1_station_line.mjs` 가 vite ssr 로 묶은 진짜 모듈(`helper_342_1_entry.ts`)을
부름.
"""
import json
import shutil
import subprocess
import sys
from pathlib import Path
import pytest
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[1]
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from config.config_system import STANDARD_CROSS_SECTION # noqa: E402
FIXTURE = HERE / "fixtures" / "b05_192_1_moved_pipe_longitudinal.json"
@pytest.fixture(scope="module")
def out(tmp_path_factory):
work = tmp_path_factory.mktemp("b342")
build = subprocess.run(
[
"node",
str(ROOT / "config" / "node_modules" / "vite" / "bin" / "vite.js"),
"build",
"--configLoader",
"runner",
"--ssr",
"../resources/tester/helper_342_1_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_342_1_entry.js", bundle)
policy = json.loads(FIXTURE.read_text(encoding="utf-8"))["profile_alignment"]["policy"]
source = work / "input.json"
source.write_text(
json.dumps({"standard": STANDARD_CROSS_SECTION, "policy": policy}, default=str),
encoding="utf-8",
)
proc = subprocess.run(
["node", str(HERE / "helper_342_1_station_line.mjs"), str(bundle), str(source)],
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):
assert 85.05 in out["screenStations"] and 85.054 not in out["screenStations"]
def test_머묾_재현_옛_길은_낡음이_남음(out):
assert out["staleBefore"] == [85.054]
assert out["staleOldPath"] == [85.054]
assert out["staleAgainstScreenBefore"] is True
def test_화면_선을_받으면_낡음_0_두_판정_같음(out):
assert out["staleNewPath"] == []
assert out["staleAgainstScreenAfter"] is False
assert out["staleB06View"] == []
def test_국부_연산_바뀐_측점만(out):
assert out["recomputedSame"] == 0
assert 0 < out["recomputedEdit"] < out["total"]
assert out["sameAsWhole"] is True
def test_남은_낡음은_곡선을_그리고_경고(out):
assert out["settleFirst"] is True # 다시 셈 기다림
assert out["settleSameKey"] is True # 다시 셈이 못 고침
assert out["settleAfter"] is False # 기다림 끝 — 곡선 그림
assert out["settleWarns"] == 1
assert out["settleRedraws"] >= 1 # 바뀐 것 없어도 다시 그림
assert out["settleClear"] is False
def test_흙_배분_실패_열쇠_다시_보냄_받은_열쇠는_안_물음(out):
assert out["haulAfterFail"] == 1
assert out["haulRetry"] == 2
assert out["haulB"] == 3
assert out["haulKept"] == 3
assert out["haulKeptPlan"] == 2
def test_전체_측점_반영은_한_번_선택_안_박음(out):
assert out["applyAllCalls"] == [out["total"]]
assert out["applyAllChoiceKeys"] == 0
def test_횡단_카드_보이는_것_먼저(out):
assert out["cardsNow"] == [0, 20, 40]
assert out["cardsRedraws"] == 1
assert sorted(out["cardsAll"]) == [0, 20, 40, 60, 80]