import os import unittest from mileage_logger.logic.detect_itinerary import SiteConfig, haversine_distance from mileage_logger.distance.resolve import DistanceResolver CONFIG_PATH = os.path.join(os.path.dirname(__file__), "..", "config", "sites.yml") ROUTES_PATH = os.path.join(os.path.dirname(__file__), "data", "routes_golden.csv") class TestDistanceResolver(unittest.TestCase): @classmethod def setUpClass(cls): cls.site_config = SiteConfig.from_yaml(CONFIG_PATH) cls.resolver = DistanceResolver(route_csv_path=ROUTES_PATH) def test_route_lookup(self): origin = "Home" dest = "Lingwood Primary Academy" origin_site = self.site_config.by_canonical[origin] dest_site = self.site_config.by_canonical[dest] dist = self.resolver.resolve(origin, dest, (origin_site.lat, origin_site.lon), (dest_site.lat, dest_site.lon)) self.assertAlmostEqual(dist, 13.0, places=1) # Second call should hit cache and return same dist2 = self.resolver.resolve(origin, dest, (origin_site.lat, origin_site.lon), (dest_site.lat, dest_site.lon)) self.assertEqual(dist2, dist) def test_fallback_haversine(self): # Choose a pair not in the route catalogue origin = "Lingwood Primary Academy" dest = "Unity SP" origin_site = self.site_config.by_canonical[origin] dest_site = self.site_config.by_canonical[dest] dist = self.resolver.resolve(origin, dest, (origin_site.lat, origin_site.lon), (dest_site.lat, dest_site.lon)) # Compute haversine expected expected = haversine_distance(origin_site.lat, origin_site.lon, dest_site.lat, dest_site.lon) self.assertAlmostEqual(dist, expected, places=1) if __name__ == '__main__': unittest.main()