import math import unittest from B05_wf2_Route.B05_wf2_Route_Engine_RidgeValley import ( _fillet_alignment, _turn_angle, resolve_grade_bounds, ) class ResolveGradeBoundsTest(unittest.TestCase): def test_defaults(self) -> None: gb = resolve_grade_bounds({}) self.assertAlmostEqual(gb["min_uphill_grade"], 0.08) self.assertAlmostEqual(gb["max_uphill_grade"], 0.14) # 엣지용은 방향 중 더 엄격한 값 self.assertAlmostEqual(gb["max_grade_for_edges"], 0.14) self.assertAlmostEqual(gb["min_grade_for_edges"], 0.08) def test_override(self) -> None: gb = resolve_grade_bounds({"max_uphill_grade": 0.10, "max_downhill_grade": 0.12}) self.assertAlmostEqual(gb["max_grade_for_edges"], 0.10) class TurnAngleTest(unittest.TestCase): def test_straight_is_zero(self) -> None: self.assertAlmostEqual(_turn_angle([0, 0], [1, 0], [2, 0]), 0.0, places=6) def test_right_angle(self) -> None: self.assertAlmostEqual(_turn_angle([0, 0], [1, 0], [1, 1]), math.pi / 2, places=6) class FilletAlignmentTest(unittest.TestCase): def test_straight_nodes_preserved(self) -> None: nodes = [[0, 0, 0], [10, 0, 1], [20, 0, 2]] poly, radii = _fillet_alignment(nodes, 12.0, 2.0) self.assertGreaterEqual(len(poly), 2) # 직선이므로 시작·끝 좌표 보존 self.assertAlmostEqual(poly[0][0], 0.0) self.assertAlmostEqual(poly[-1][0], 20.0) def test_single_node(self) -> None: poly, radii = _fillet_alignment([[0, 0, 0]], 12.0, 2.0) self.assertEqual(len(poly), 1)