use geo::Point;
use tp_lib_core::crs::CrsTransformer;
#[test]
fn test_identity_transform() {
let transformer = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:4326".to_string())
.expect("Failed to create transformer");
let point = Point::new(4.3517, 50.8503); let transformed = transformer
.transform(point)
.expect("Failed to transform point");
assert!((transformed.x() - point.x()).abs() < 1e-6);
assert!((transformed.y() - point.y()).abs() < 1e-6);
}
#[test]
fn test_wgs84_to_belgian_lambert_72() {
let transformer = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:31370".to_string())
.expect("Failed to create transformer");
let wgs84 = Point::new(4.3571, 50.8458);
let lambert = transformer
.transform(wgs84)
.expect("Failed to transform to Lambert 72");
assert!(
lambert.x() > 148_000.0 && lambert.x() < 150_000.0,
"Lambert X coordinate out of expected range: {}",
lambert.x()
);
assert!(
lambert.y() > 169_000.0 && lambert.y() < 171_000.0,
"Lambert Y coordinate out of expected range: {}",
lambert.y()
);
}
#[test]
fn test_wgs84_to_belgian_lambert_2008() {
let transformer = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:3812".to_string())
.expect("Failed to create transformer");
let wgs84 = Point::new(4.3571, 50.8458);
let lambert = transformer
.transform(wgs84)
.expect("Failed to transform to Lambert 2008");
assert!(
lambert.x() > 648_000.0 && lambert.x() < 650_000.0,
"Lambert 2008 X coordinate out of expected range: {}",
lambert.x()
);
assert!(
lambert.y() > 668_000.0 && lambert.y() < 671_000.0,
"Lambert 2008 Y coordinate out of expected range: {}",
lambert.y()
);
}
#[test]
fn test_belgian_lambert_72_to_wgs84() {
let transformer = CrsTransformer::new("EPSG:31370".to_string(), "EPSG:4326".to_string())
.expect("Failed to create transformer");
let lambert = Point::new(148_500.0, 169_500.0);
let wgs84 = transformer
.transform(lambert)
.expect("Failed to transform to WGS84");
assert!(
(wgs84.x() - 4.35).abs() < 0.02,
"WGS84 longitude out of expected range: {}",
wgs84.x()
);
assert!(
(wgs84.y() - 50.84).abs() < 0.02,
"WGS84 latitude out of expected range: {}",
wgs84.y()
);
}
#[test]
fn test_belgian_lambert_2008_to_wgs84() {
let transformer = CrsTransformer::new("EPSG:3812".to_string(), "EPSG:4326".to_string())
.expect("Failed to create transformer");
let lambert = Point::new(648_500.0, 668_500.0);
let wgs84 = transformer
.transform(lambert)
.expect("Failed to transform to WGS84");
assert!(
(wgs84.x() - 4.35).abs() < 0.02,
"WGS84 longitude out of expected range: {}",
wgs84.x()
);
assert!(
(wgs84.y() - 50.83).abs() < 0.02,
"WGS84 latitude out of expected range: {}",
wgs84.y()
);
}
#[test]
fn test_round_trip_transformation() {
let to_lambert = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:31370".to_string())
.expect("Failed to create to_lambert transformer");
let to_wgs84 = CrsTransformer::new("EPSG:31370".to_string(), "EPSG:4326".to_string())
.expect("Failed to create to_wgs84 transformer");
let original = Point::new(4.3517, 50.8503);
let lambert = to_lambert
.transform(original)
.expect("Failed to transform to Lambert");
let round_trip = to_wgs84
.transform(lambert)
.expect("Failed to transform back to WGS84");
assert!(
(round_trip.x() - original.x()).abs() < 0.00001,
"Round trip longitude differs: {} vs {}",
round_trip.x(),
original.x()
);
assert!(
(round_trip.y() - original.y()).abs() < 0.00001,
"Round trip latitude differs: {} vs {}",
round_trip.y(),
original.y()
);
}
#[test]
fn test_invalid_source_crs() {
let result = CrsTransformer::new("INVALID:9999".to_string(), "EPSG:4326".to_string());
assert!(result.is_err());
}
#[test]
fn test_invalid_target_crs() {
let result = CrsTransformer::new("EPSG:4326".to_string(), "INVALID:9999".to_string());
assert!(result.is_err());
}
#[test]
fn test_transform_multiple_points() {
let transformer = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:31370".to_string())
.expect("Failed to create transformer");
let points = vec![
Point::new(4.3517, 50.8503), Point::new(4.4042, 51.2194), Point::new(4.3777, 51.0353), ];
for point in points {
let transformed = transformer
.transform(point)
.expect("Failed to transform point");
assert!(
transformed.x() > 0.0 && transformed.x() < 300_000.0,
"Lambert X out of Belgian bounds: {}",
transformed.x()
);
assert!(
transformed.y() > 0.0 && transformed.y() < 300_000.0,
"Lambert Y out of Belgian bounds: {}",
transformed.y()
);
}
}
#[test]
fn test_transform_preserves_point_ordering() {
let transformer = CrsTransformer::new("EPSG:4326".to_string(), "EPSG:31370".to_string())
.expect("Failed to create transformer");
let point1 = Point::new(4.3517, 50.8503); let point2 = Point::new(4.4042, 51.2194);
let lambert1 = transformer
.transform(point1)
.expect("Failed to transform point1");
let lambert2 = transformer
.transform(point2)
.expect("Failed to transform point2");
assert!(
lambert2.y() > lambert1.y(),
"Point ordering not preserved: {} vs {}",
lambert2.y(),
lambert1.y()
);
}