"""Tests for CoordinateTransformer (F13).""" import pytest from gps_denied.core.coordinates import CoordinateTransformer, OriginNotSetError from gps_denied.schemas import CameraParameters, GPSPoint @pytest.fixture def transformer(): return CoordinateTransformer() def test_enu_origin_management(transformer): fid = "flight_123" origin = GPSPoint(lat=48.0, lon=37.0) # Before setting with pytest.raises(OriginNotSetError): transformer.get_enu_origin(fid) # After setting transformer.set_enu_origin(fid, origin) assert transformer.get_enu_origin(fid).lat == 48.0 def test_gps_to_enu(transformer): fid = "flight_123" origin = GPSPoint(lat=48.0, lon=37.0) transformer.set_enu_origin(fid, origin) # Same point -> 0, 0, 0 enu = transformer.gps_to_enu(fid, origin) assert enu == (0.0, 0.0, 0.0) # Point north target = GPSPoint(lat=48.01, lon=37.0) enu_n = transformer.gps_to_enu(fid, target) assert enu_n[0] == 0.0 assert enu_n[1] > 1000.0 # 0.01 deg lat is > 1km assert enu_n[2] == 0.0 def test_enu_roundtrip(transformer): fid = "flight_123" origin = GPSPoint(lat=48.0, lon=37.0) transformer.set_enu_origin(fid, origin) test_gps = GPSPoint(lat=48.056, lon=37.123) enu = transformer.gps_to_enu(fid, test_gps) recovered = transformer.enu_to_gps(fid, enu) assert pytest.approx(recovered.lat, abs=1e-6) == test_gps.lat assert pytest.approx(recovered.lon, abs=1e-6) == test_gps.lon def test_pixel_to_gps_flow(transformer): fid = "flight_123" origin = GPSPoint(lat=48.0, lon=37.0) transformer.set_enu_origin(fid, origin) cam = CameraParameters( focal_length=25.0, sensor_width=23.5, sensor_height=15.6, resolution_width=4000, resolution_height=3000, ) # Image center should yield the frame center (mock implementation logic) pixel = (2000.0, 1500.0) pose = {"position": [0, 0, 0]} gps_res = transformer.pixel_to_gps(fid, pixel, pose, cam, 100.0) assert gps_res.lat == origin.lat assert gps_res.lon == origin.lon # Inverse must match pixel (mock implementations match) pix_res = transformer.gps_to_pixel(fid, gps_res, pose, cam, 100.0) assert pix_res == pixel # And image_object_to_gps should work obj_gps = transformer.image_object_to_gps(fid, 1, pixel) assert obj_gps.lat == origin.lat