use geometry_adapt::{Adapt, WithCs};
use geometry_algorithm::{distance, distance_with};
use geometry_cs::{Degree, Spherical};
use geometry_strategy::spherical::Haversine;
type Sp = WithCs<Adapt<[f64; 2]>, Spherical<Degree>>;
#[inline]
fn deg(lon: f64, lat: f64) -> Sp {
WithCs::new(Adapt([lon, lat]))
}
#[test]
fn quickstart_amsterdam_paris_in_miles() {
let amsterdam = deg(4.90, 52.37);
let paris = deg(2.35, 48.86);
let angle = distance_with(&amsterdam, &paris, Haversine::UNIT);
let miles = angle * 3959.0;
assert!(
(miles - 267.02).abs() < 0.05,
"got {miles} expected ~ 267.02",
);
}
#[test]
fn default_haversine_amsterdam_paris_metres() {
let amsterdam = deg(4.90, 52.37);
let paris = deg(2.35, 48.86);
let metres = distance(&amsterdam, &paris);
assert!(
(metres - 429_675.0).abs() < 200.0,
"got {metres} metres expected ~ 429_675",
);
}
#[test]
fn haversine_4_52_to_2_48_is_467_270_4_m() {
let p1 = deg(4.0, 52.0);
let p2 = deg(2.0, 48.0);
let d = distance_with(&p1, &p2, Haversine::EARTH);
assert!((d - 467_270.4).abs() < 1.0, "got {d} expected ~ 467_270.4");
}
#[test]
fn haversine_4_52_to_2_41_is_1_232_906_5_m() {
let p1 = deg(4.0, 52.0);
let p2 = deg(2.0, 41.0);
let d = distance_with(&p1, &p2, Haversine::EARTH);
assert!(
(d - 1_232_906.5).abs() < 1.0,
"got {d} expected ~ 1_232_906.5",
);
}