import tempfile import unittest from pathlib import Path from B03_FileInput.B03_FileInput_Engine_Analyze import analyze_planned_route_csv class PlannedRouteCsvTest(unittest.TestCase): def analyze(self, content: str) -> dict: with tempfile.TemporaryDirectory() as temporary_dir: path = Path(temporary_dir) / "planned_route.csv" path.write_text(content, encoding="utf-8") return analyze_planned_route_csv(path) def test_valid_route_returns_metadata(self) -> None: metadata = self.analyze( "route_name,sequence,x,y,z,crs_epsg\n" "sample,1,183493.5,489290.335,544.659,5187\n" "sample,2,183500.0,489300.0,545.0,5187\n" ) self.assertEqual(metadata["purpose"], "planned_route") self.assertEqual(metadata["route_name"], "sample") self.assertEqual(metadata["point_count"], 2) self.assertEqual(metadata["epsg"], 5187) self.assertEqual(metadata["start_point"], [183493.5, 489290.335, 544.659]) def test_missing_header_is_rejected(self) -> None: with self.assertRaisesRegex(ValueError, "필수 열"): self.analyze("route_name,sequence,x,y,crs_epsg\nsample,1,183493.5,489290.335,5187\n") def test_non_numeric_coordinate_is_rejected(self) -> None: with self.assertRaisesRegex(ValueError, "x 값은 숫자"): self.analyze( "route_name,sequence,x,y,z,crs_epsg\n" "sample,1,not-a-number,489290.335,544.659,5187\n" "sample,2,183500.0,489300.0,545.0,5187\n" ) def test_non_contiguous_sequence_is_rejected(self) -> None: with self.assertRaisesRegex(ValueError, "sequence는 2"): self.analyze( "route_name,sequence,x,y,z,crs_epsg\n" "sample,1,183493.5,489290.335,544.659,5187\n" "sample,3,183500.0,489300.0,545.0,5187\n" ) def test_mixed_epsg_is_rejected(self) -> None: with self.assertRaisesRegex(ValueError, "모든 행에서 같아야"): self.analyze( "route_name,sequence,x,y,z,crs_epsg\n" "sample,1,183493.5,489290.335,544.659,5187\n" "sample,2,183500.0,489300.0,545.0,5186\n" ) if __name__ == "__main__": unittest.main()