from __future__ import annotations import sys import unittest from pathlib import Path APP_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(APP_ROOT)) from modules.route_parser import parse_route_text # noqa: E402 class RouteParserTests(unittest.TestCase): def test_arrival_departure_metadata_does_not_create_fake_leg(self): parsed = parse_route_text("Arriv\u00e9e: Ha Noi / D\u00e9part: Hoi An") self.assertEqual(parsed["legs"], []) self.assertEqual(parsed["arrival"], "Ha Noi") self.assertEqual(parsed["departure"], "Hoi An") self.assertEqual(parsed["pending"], []) def test_airport_arrival_metadata_only(self): parsed = parse_route_text("Jour 1: Arriv\u00e9e \u00e0 l'a\u00e9roport de Noi Bai - Ha Noi") self.assertEqual(parsed["legs"], []) self.assertEqual(parsed["arrival"], "Ha Noi") self.assertIsNone(parsed["departure"]) self.assertEqual(parsed["pending"], []) def test_segment_modes_on_same_line(self): parsed = parse_route_text("Jour 6: Ha Long - Ha Noi (car) - Hue (flight)") self.assertEqual( parsed["legs"], [ {"a": "Ha Long", "b": "Ha Noi", "mode": "car"}, {"a": "Ha Noi", "b": "Hue", "mode": "plane"}, ], ) def test_ferry_is_boat(self): parsed = parse_route_text("Jour 5: Rach Gia ferry to Phu Quoc") self.assertEqual(parsed["legs"], [{"a": "Rach Gia", "b": "Phu Quoc", "mode": "boat"}]) self.assertEqual(parsed["pending"], []) def test_speedboat_is_boat_mode(self): parsed = parse_route_text("Jour 8: Con Dao - Phu Quoc by speedboat") self.assertEqual(parsed["legs"], [{"a": "Con Dao", "b": "Phu Quoc", "mode": "boat"}]) self.assertEqual(parsed["pending"], []) def test_mai_hich_alias_resolves_to_mai_chau(self): parsed = parse_route_text("Jour 2: Ha Noi - Mai Hich - Pu Luong") self.assertEqual( parsed["legs"], [ {"a": "Ha Noi", "b": "Mai Chau", "mode": "car"}, {"a": "Mai Chau", "b": "Pu Luong", "mode": "car"}, ], ) def test_long_unlabeled_leg_falls_back_to_plane(self): parsed = parse_route_text("Jour 7: Can Tho - Ha Noi") self.assertEqual(parsed["legs"], [{"a": "Can Tho", "b": "Ha Noi", "mode": "plane"}]) def test_flight_phrase_only_applies_to_following_leg(self): parsed = parse_route_text("Jour 3: Ha Long - Ha Noi & Vol pour Hue") self.assertEqual( parsed["legs"], [ {"a": "Ha Long", "b": "Ha Noi", "mode": "car"}, {"a": "Ha Noi", "b": "Hue", "mode": "plane"}, ], ) if __name__ == "__main__": unittest.main()