"""설계속도 축 검증 — 임도 종류 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