"""Unit tests for `runner.helpers.geo` — Vincenty distance + offset projection.""" from __future__ import annotations import math import pytest from runner.helpers.geo import GeodeticDelta, delta, distance_m, offset def test_distance_zero_for_same_point() -> None: assert distance_m(50.0, 30.0, 50.0, 30.0) == pytest.approx(0.0, abs=1e-6) def test_distance_one_degree_latitude_around_111km() -> None: # ~111 km per degree of latitude at the equator; 1° at lat=50° is similar. d = distance_m(50.0, 30.0, 51.0, 30.0) assert 110_000 < d < 112_000 def test_offset_then_distance_round_trip() -> None: """Offsetting a point by N meters along a bearing recovers ~N when measured back.""" # Arrange start_lat, start_lon = 50.0, 30.0 bearing = 45.0 target_distance = 5_000.0 # Act end_lat, end_lon = offset(start_lat, start_lon, bearing, target_distance) measured = distance_m(start_lat, start_lon, end_lat, end_lon) # Assert assert measured == pytest.approx(target_distance, rel=1e-6) def test_delta_returns_full_structure() -> None: d = delta(50.0, 30.0, 50.0, 31.0) assert isinstance(d, GeodeticDelta) assert d.distance_m > 0 assert math.isfinite(d.forward_bearing_deg) assert math.isfinite(d.reverse_bearing_deg) @pytest.mark.parametrize("bad", [float("nan")]) def test_distance_rejects_nan(bad: float) -> None: with pytest.raises(ValueError, match="NaN"): distance_m(bad, 30.0, 50.0, 30.0)