| 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 |
|
|
|
|
| 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() |
|
|
|
|