Files
Aislo/resources/tester/test_271_profile_settings.py
T
eomsangdonandClaude Opus 5.5 5db9a08202 fix(463 덧 지표면 설정 없는 노선): panelValuesOf · 서명 · [저장] 상단측 차례가 surface_params 없으면 기본값 — 종단도 안 그려지던 흠
- latest 에 surface_params 없음(옛 · 시험 · 막 만든 프로젝트) = 등고선 칸은 패널 값 그대로 · 종단도 기준은 저장 설정대로
- 시험 test_271_profile_settings 에 지표면 설정 없는 노선 한 건 · 346_2 · 442_2 · 저장 시험 통과

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

104 lines
4.0 KiB
Python

"""463 B05 · B06 한 페이지 — 페이지 설정 한 칸(요구 271-5 · 분석 4장 (B)).
① 종단도 기준(기울기 상한 · 최소고 강제 · 시작 측점) = 세션 초안(448) ?? 저장 노선 설정
· 빈 칸 = 좌측 패널 기본(설계속도 20 · 특수지형 · 강제 해제 · 0) · 작업임도는 20 만
· 둘 다 없으면 종단도 그대로
② 이음 — 횡단 보기 · 종단 보기 둘 다 종단도를 그린 뒤 같은 함수
· 옛 코드 = B05 좌측 패널만 얹어 B06 새로고침에서 라벨 오프셋 · 기울기 빨강 · 강제가
B05 열기 전까지 다름 · B06 이 받은 노선은 캐시에 둠
③ 좌측 패널 상한 = 같은 기준 함수
TS 셈은 `helper_271_profile_settings.cjs`.
./venv/Scripts/python.exe -m pytest resources/tester/test_271_profile_settings.py -q
"""
import json
import subprocess
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
HELPER = Path(__file__).with_name("helper_271_profile_settings.cjs")
pytestmark = pytest.mark.skipif(
not (ROOT / "config" / "node_modules" / "typescript").is_dir(),
reason="프론트엔드 의존성 미설치",
)
def src(*parts: str) -> str:
return ROOT.joinpath(*parts).read_text(encoding="utf-8")
@pytest.fixture(scope="module")
def got() -> dict:
run = subprocess.run( # noqa: S603 — 고정 실행 파일
["node", str(HELPER)],
capture_output=True,
text=True,
encoding="utf-8",
timeout=120,
)
assert run.returncode == 0, run.stderr
return json.loads(run.stdout)
def test_초안이_저장_설정을_이김(got):
assert got["nothing"] == {}
assert got["saved"] == {
"grade": 8,
"enforce": True,
"display": {"station": 3, "cumulative": 60},
}
assert got["draft"] == {
"grade": 12,
"enforce": False,
"display": {"station": 5, "cumulative": 100},
}
assert got["work"] == got["draft"]
assert got["draftOnly"] == {
"grade": 10,
"enforce": True,
"display": {"station": 0, "cumulative": 0},
}
def test_빈_칸은_좌측_패널_기본(got):
zero = {"station": 0, "cumulative": 0}
assert got["workSaved"] == {"grade": 9, "enforce": False, "display": zero} # 작업임도 30 → 20
assert got["defaults"] == {"grade": 14, "enforce": False, "display": zero} # 20 · 특수
def test_두_보기가_같은_함수로_얹음():
cross = src("B06_Section", "B06_Section_UI_Section_View_Profile.ts")
render = cross[cross.index(" profile.render(") :]
assert render.index("applyPageSettings(profile, id);") < render.index("lane.paint();")
loader = cross[cross.index("function loadRoute(") :]
loader = loader[: loader.index("\n}\n")]
assert "writeRouteLatestCache(projectId, latest);" in loader
assert "applyPageSettings(profile, projectId, latest);" in loader
assert "enforceKnown" not in cross
sections = src("A00_Common", "design", "design_view_profile_sections.ts")
body = sections[sections.index(" function renderSections(") :]
body = body[: body.index("\n }\n")]
assert "applyPageSettings(profilePanel, projectId, state.latest ?? undefined);" in body
assert "panel.gradeLimitPct()" not in body
def test_좌측_패널_상한도_같은_기준():
part = src("B05_Profile", "B05_Profile_UI_Panel_Settings.ts")
assert "return gradeLimitOf(currentSpeed(), terrain, parseOptional(maxGradePct));" in part
def test_지표면_설정_없는_노선도_안_죽음(got):
# 463 덧 — latest 에 surface_params 없음(옛 · 시험 · 막 만든 프로젝트) = 종단도 기준은 저장 설정대로 · 등고선 칸 그대로
assert got["noSurface"] == {
"grade": 14,
"enforce": True,
"display": {"station": 0, "cumulative": 0},
}
assert got["noSurfacePanel"] is None
fetch = src("B05_Profile", "B05_Profile_Api_Fetch.ts")
assert "latest?.surface_params.source_filter" not in fetch # [저장] 상단측 차례도 같은 꼴