⚠ **뿌리** — `tmp/` 는 창 사이에 안 건너감(실측 확인: 상대 창이 놓은 `tmp/_sync_probe.txt` 가 시간을 두고 두 번 봐도 안 보임). 그래서 **정본(등록부 스키마)만 건너가고 그것을 읽는 시험은 안 건너가** 오늘 두 번, 같은 시험이 **연 창은 통과·받은 창은 실패**가 됐음. - `tmp/tests/*` 를 `resources/tester/` 로 **복사**(127 파일). 내용은 **한 줄도 안 고침** - `tmp/tests` 는 **남겨 둠** — 되돌릴 자리(사용자 지시) - 실행: `./venv/Scripts/python.exe -m pytest resources/tester/ -q` 옮기기 전과 **같은 수**: 617 통과 / 22 건너뜀 / 실패 0 ⇒ 이제 시험·예외·까닭이 **정본과 함께** 움직임. 오늘 세운 「예외는 정본 스키마에」와 짝임. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
2.9 KiB
Python
63 lines
2.9 KiB
Python
"""설계속도 축 검증 — 임도 종류 3종 · 기본 20km/h · 법정 상한 매핑.
|
|
|
|
2026-08-19 사용자 확정: 임도는 속도를 낼 수 없는 노선이라 설계속도 기본은 20이고,
|
|
간선·산불진화만 30·40을 고를 수 있다. 작업임도는 20 고정(별표2 Ⅰ.3).
|
|
종단기울기 상한 표(지식DB 설계제원_총괄 §6)는 설계속도 × 지형 구분으로 정해진다.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from B05_Profile.B05_Profile_Engine_Grade import legal_grade_limit_pct, resolve_design_speed
|
|
from config.config_system import FOREST_ROAD_PROFILE_CRITERIA, ROUTE_GRADE_CLASSES
|
|
|
|
|
|
def test_road_types_are_current_three_plus_legacy():
|
|
"""현행 3종(간선·산불진화·작업) + 폐지된 지선(기존 저장분 호환)."""
|
|
assert set(ROUTE_GRADE_CLASSES) == {"trunk", "fire", "work", "branch"}
|
|
|
|
|
|
@pytest.mark.parametrize("grade_class", ["trunk", "fire", "work", "branch"])
|
|
def test_default_design_speed_is_20(grade_class):
|
|
"""설계속도를 고르지 않으면 어느 종류든 20km/h가 기본이다."""
|
|
assert resolve_design_speed(grade_class) == 20
|
|
|
|
|
|
def test_selectable_speeds_by_road_type():
|
|
"""간선·산불진화는 20~40, 작업임도는 20만 고를 수 있다."""
|
|
selectable = FOREST_ROAD_PROFILE_CRITERIA["selectable_design_speeds"]
|
|
assert selectable["trunk"] == (20, 30, 40)
|
|
assert selectable["fire"] == (20, 30, 40)
|
|
assert selectable["work"] == (20,)
|
|
|
|
|
|
def test_selected_speed_wins_when_allowed():
|
|
"""허용된 속도를 고르면 그 값이 쓰이고, 허용 밖이면 기본으로 돌아간다."""
|
|
assert resolve_design_speed("trunk", 40) == 40
|
|
assert resolve_design_speed("fire", 30) == 30
|
|
# 작업임도는 20만 허용 — 40을 보내도 20으로 되돌린다.
|
|
assert resolve_design_speed("work", 40) == 20
|
|
# 표에 없는 값도 기본으로.
|
|
assert resolve_design_speed("trunk", 25) == 20
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("speed", "normal", "special"),
|
|
[(40, 7.0, 10.0), (30, 8.0, 12.0), (20, 9.0, 14.0)],
|
|
)
|
|
def test_grade_limit_follows_design_speed(speed, normal, special):
|
|
"""종단기울기 상한 = 설계속도 × 지형(지식DB 설계제원_총괄 §6 표와 동일)."""
|
|
assert legal_grade_limit_pct("trunk", "normal", False, speed) == normal
|
|
assert legal_grade_limit_pct("trunk", "special", False, speed) == special
|
|
|
|
|
|
def test_work_road_ignores_high_speed_and_uses_20_limits():
|
|
"""작업임도는 40을 보내도 20km/h 기준(9%/14%)을 쓴다."""
|
|
assert legal_grade_limit_pct("work", "normal", False, 40) == 9.0
|
|
assert legal_grade_limit_pct("work", "special", False, 40) == 14.0
|
|
|
|
|
|
def test_paved_special_terrain_exception_still_applies():
|
|
"""특수지형 + 노면포장은 18% 예외 상한(별표2) — 설계속도와 무관하게 유지."""
|
|
assert legal_grade_limit_pct("trunk", "special", True, 40) == 18.0
|
|
assert legal_grade_limit_pct("work", "special", True, 20) == 18.0
|