use super::Q;
use crate::traits::Distance;
impl<Rational: Into<Q>> Distance<Rational> for Q {
type Output = Q;
fn distance(&self, other: Rational) -> Self::Output {
let other = other.into();
let difference = other - self;
difference.abs()
}
}
#[cfg(test)]
mod test_distance {
use super::{Distance, Q};
#[test]
fn small_values() {
let a = Q::ONE;
let b = Q::from((5, -15));
let zero = Q::ZERO;
assert_eq!(Q::ONE, a.distance(&zero));
assert_eq!(Q::ONE, zero.distance(&a));
assert_eq!(Q::from((4, 3)), a.distance(&b));
assert_eq!(Q::from((4, 3)), b.distance(&a));
assert_eq!(Q::from((1, 3)), b.distance(&zero));
assert_eq!(Q::from((1, 3)), zero.distance(&b));
assert_eq!(Q::ZERO, b.distance(&b));
}
#[test]
fn large_values() {
let a = Q::from(i64::MAX);
let b = Q::from(i64::MIN);
let zero = Q::ZERO;
assert_eq!(&a - &b, a.distance(&b));
assert_eq!(&a - &b, b.distance(&a));
assert_eq!(a, a.distance(&zero));
assert_eq!(a, zero.distance(&a));
assert_eq!(&a + Q::ONE, b.distance(&zero));
assert_eq!(&a + Q::ONE, zero.distance(&b));
assert_eq!(Q::ZERO, a.distance(&a));
}
#[test]
fn availability() {
let a = Q::ZERO;
let u_0 = a.distance(0_u8);
let u_1 = a.distance(15_u16);
let u_2 = a.distance(35_u32);
let u_3 = a.distance(u64::MAX);
let i_0 = a.distance(0_i8);
let i_1 = a.distance(-15_i16);
let i_2 = a.distance(35_i32);
let i_3 = a.distance(i64::MIN);
let f_0 = a.distance(4.25_f32);
let f_1 = a.distance(0.66015625_f64);
assert_eq!(Q::ZERO, u_0);
assert_eq!(Q::from(15), u_1);
assert_eq!(Q::from(35), u_2);
assert_eq!(Q::from(u64::MAX), u_3);
assert_eq!(Q::ZERO, i_0);
assert_eq!(Q::from(15), i_1);
assert_eq!(Q::from(35), i_2);
assert_eq!(Q::from(i64::MIN).abs(), i_3);
assert_eq!(Q::from((425, 100)), f_0);
assert_eq!(Q::from((169, 256)), f_1);
}
}