use crate::{Quantity, Unit};
use qtty_derive::Unit;
pub use crate::dimension::Length;
pub trait LengthUnit: Unit<Dim = Length> {}
impl<T: Unit<Dim = Length>> LengthUnit for T {}
#[cfg(feature = "astro")]
mod astro;
#[cfg(feature = "astro")]
pub use astro::*;
#[cfg(feature = "customary")]
mod customary;
#[cfg(feature = "customary")]
pub use customary::*;
#[cfg(feature = "navigation")]
mod navigation;
#[cfg(feature = "navigation")]
pub use navigation::*;
#[cfg(feature = "fundamental-physics")]
mod fundamental_physics;
#[cfg(feature = "fundamental-physics")]
pub use fundamental_physics::*;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "m", dimension = Length, ratio = 1.0)]
pub struct Meter;
pub type Meters = Quantity<Meter>;
pub const M: Meters = Meters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "km", dimension = Length, ratio = 1_000.0)]
pub struct Kilometer;
pub type Km = Kilometer;
pub type Kilometers = Quantity<Km>;
pub const KM: Kilometers = Kilometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "cm", dimension = Length, ratio = 1e-2)]
pub struct Centimeter;
pub type Cm = Centimeter;
pub type Centimeters = Quantity<Cm>;
pub const CM: Centimeters = Centimeters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "mm", dimension = Length, ratio = 1e-3)]
pub struct Millimeter;
pub type Mm = Millimeter;
pub type Millimeters = Quantity<Mm>;
pub const MM: Millimeters = Millimeters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "μm", dimension = Length, ratio = 1e-6)]
pub struct Micrometer;
pub type Um = Micrometer;
pub type Micrometers = Quantity<Um>;
pub const UM: Micrometers = Micrometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "nm", dimension = Length, ratio = 1e-9)]
pub struct Nanometer;
pub type Nm = Nanometer;
pub type Nanometers = Quantity<Nm>;
pub const NM: Nanometers = Nanometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "pm", dimension = Length, ratio = 1e-12)]
pub struct Picometer;
pub type Picometers = Quantity<Picometer>;
pub const PMETER: Picometers = Picometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "fm", dimension = Length, ratio = 1e-15)]
pub struct Femtometer;
pub type Femtometers = Quantity<Femtometer>;
pub const FM: Femtometers = Femtometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "am", dimension = Length, ratio = 1e-18)]
pub struct Attometer;
pub type Attometers = Quantity<Attometer>;
pub const AM: Attometers = Attometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "zm", dimension = Length, ratio = 1e-21)]
pub struct Zeptometer;
pub type Zeptometers = Quantity<Zeptometer>;
pub const ZMETER: Zeptometers = Zeptometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "ym", dimension = Length, ratio = 1e-24)]
pub struct Yoctometer;
pub type Yoctometers = Quantity<Yoctometer>;
pub const YMETER: Yoctometers = Yoctometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Mm", dimension = Length, ratio = 1e6)]
pub struct Megameter;
pub type MegaMeter = Megameter;
pub type Megameters = Quantity<Megameter>;
pub const MEGAMETER: Megameters = Megameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "dm", dimension = Length, ratio = 1e-1)]
pub struct Decimeter;
pub type Decimeters = Quantity<Decimeter>;
pub const DM: Decimeters = Decimeters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "dam", dimension = Length, ratio = 1e1)]
pub struct Decameter;
pub type Decameters = Quantity<Decameter>;
pub const DAM: Decameters = Decameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "hm", dimension = Length, ratio = 1e2)]
pub struct Hectometer;
pub type Hectometers = Quantity<Hectometer>;
pub const HM: Hectometers = Hectometers::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Gm", dimension = Length, ratio = 1e9)]
pub struct Gigameter;
pub type Gigameters = Quantity<Gigameter>;
pub const GM: Gigameters = Gigameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Tm", dimension = Length, ratio = 1e12)]
pub struct Terameter;
pub type Terameters = Quantity<Terameter>;
pub const TM: Terameters = Terameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Pm", dimension = Length, ratio = 1e15)]
pub struct Petameter;
pub type Petameters = Quantity<Petameter>;
pub const PM: Petameters = Petameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Em", dimension = Length, ratio = 1e18)]
pub struct Exameter;
pub type Exameters = Quantity<Exameter>;
pub const EM: Exameters = Exameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Zm", dimension = Length, ratio = 1e21)]
pub struct Zettameter;
pub type Zettameters = Quantity<Zettameter>;
pub const ZM: Zettameters = Zettameters::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "Ym", dimension = Length, ratio = 1e24)]
pub struct Yottameter;
pub type Yottameters = Quantity<Yottameter>;
pub const YM: Yottameters = Yottameters::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! length_units {
($cb:path) => {
$cb!(
Meter, Decimeter, Centimeter, Millimeter, Micrometer, Nanometer, Picometer, Femtometer,
Attometer, Zeptometer, Yoctometer, Decameter, Hectometer, Kilometer, Megameter,
Gigameter, Terameter, Petameter, Exameter, Zettameter, Yottameter
);
};
}
length_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
length_units!(crate::impl_unit_cross_unit_ops);
#[cfg(feature = "astro")]
macro_rules! __impl_length_bridges_with_astro_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_from_each_extra_to_bases!(
{
AstronomicalUnit, LightYear, Parsec, Kiloparsec, Megaparsec, Gigaparsec,
nominal::SolarRadius, nominal::SolarDiameter, nominal::EarthRadius,
nominal::EarthEquatorialRadius, nominal::EarthPolarRadius,
nominal::JupiterRadius, nominal::LunarRadius, nominal::LunarDistance
}
$($extra),+
);
#[cfg(feature = "cross-unit-ops")]
crate::__impl_cross_ops_each_extra_to_bases!(
{
AstronomicalUnit, LightYear, Parsec, Kiloparsec, Megaparsec, Gigaparsec,
nominal::SolarRadius, nominal::SolarDiameter, nominal::EarthRadius,
nominal::EarthEquatorialRadius, nominal::EarthPolarRadius,
nominal::JupiterRadius, nominal::LunarRadius, nominal::LunarDistance
}
$($extra),+
);
};
}
#[cfg(feature = "navigation")]
macro_rules! __impl_length_bridges_with_navigation_as_base {
($($extra:ty),+ $(,)?) => {
crate::__impl_from_each_extra_to_bases!(
{NauticalMile, Chain, Rod, Link, Fathom, EarthMeridionalCircumference, EarthEquatorialCircumference}
$($extra),+
);
#[cfg(feature = "cross-unit-ops")]
crate::__impl_cross_ops_each_extra_to_bases!(
{NauticalMile, Chain, Rod, Link, Fathom, EarthMeridionalCircumference, EarthEquatorialCircumference}
$($extra),+
);
};
}
#[cfg(all(feature = "astro", feature = "customary"))]
__impl_length_bridges_with_astro_as_base!(Inch, Foot, Yard, Mile);
#[cfg(all(feature = "astro", feature = "navigation"))]
__impl_length_bridges_with_astro_as_base!(
NauticalMile,
Chain,
Rod,
Link,
Fathom,
EarthMeridionalCircumference,
EarthEquatorialCircumference
);
#[cfg(all(feature = "astro", feature = "fundamental-physics"))]
__impl_length_bridges_with_astro_as_base!(
BohrRadius,
ClassicalElectronRadius,
PlanckLength,
ElectronReducedComptonWavelength
);
#[cfg(all(feature = "customary", feature = "navigation"))]
__impl_length_bridges_with_navigation_as_base!(Inch, Foot, Yard, Mile);
#[cfg(all(feature = "navigation", feature = "fundamental-physics"))]
__impl_length_bridges_with_navigation_as_base!(
BohrRadius,
ClassicalElectronRadius,
PlanckLength,
ElectronReducedComptonWavelength
);
#[cfg(all(feature = "customary", feature = "fundamental-physics"))]
crate::__impl_from_each_extra_to_bases!(
{Inch, Foot, Yard, Mile}
BohrRadius, ClassicalElectronRadius, PlanckLength, ElectronReducedComptonWavelength
);
#[cfg(all(
feature = "customary",
feature = "fundamental-physics",
feature = "cross-unit-ops"
))]
crate::__impl_cross_ops_each_extra_to_bases!(
{Inch, Foot, Yard, Mile}
BohrRadius, ClassicalElectronRadius, PlanckLength, ElectronReducedComptonWavelength
);
#[cfg(test)]
length_units!(crate::assert_units_are_builtin);
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
#[cfg(feature = "astro")]
use crate::units::length::astro::{ARCSECONDS_PER_RADIAN, AU_IN_METERS};
use approx::{assert_abs_diff_eq, assert_relative_eq};
use proptest::prelude::*;
#[test]
fn kilometer_to_meter() {
let km = Kilometers::new(1.0);
let m = km.to::<Meter>();
assert_abs_diff_eq!(m.value(), 1000.0, epsilon = 1e-9);
}
#[test]
fn meter_to_kilometer() {
let m = Meters::new(1000.0);
let km = m.to::<Kilometer>();
assert_abs_diff_eq!(km.value(), 1.0, epsilon = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn au_to_meters() {
let au = AstronomicalUnits::new(1.0);
let m = au.to::<Meter>();
assert_abs_diff_eq!(m.value(), AU_IN_METERS, epsilon = 1e-6);
}
#[test]
#[cfg(feature = "astro")]
fn au_to_kilometers() {
let au = AstronomicalUnits::new(1.0);
let km = au.to::<Kilometer>();
assert_relative_eq!(km.value(), 149_597_870.7, max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn light_year_to_meters() {
let ly = LightYears::new(1.0);
let m = ly.to::<Meter>();
assert_relative_eq!(m.value(), LightYear::RATIO, max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn light_year_to_kilometers() {
let ly = LightYears::new(1.0);
let km = ly.to::<Kilometer>();
assert_relative_eq!(km.value(), 9_460_730_472_580.000_8, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn au_to_light_year() {
let au = AstronomicalUnits::new(1.0);
let ly = au.to::<LightYear>();
assert_relative_eq!(ly.value(), 1.582e-5, max_relative = 1e-3);
}
#[test]
#[cfg(feature = "astro")]
fn light_year_to_au() {
let ly = LightYears::new(1.0);
let au = ly.to::<AstronomicalUnit>();
assert_relative_eq!(au.value(), 63241.0, max_relative = 1e-3);
}
#[test]
#[cfg(feature = "astro")]
fn from_impl_au_to_ly() {
let au = 1.0 * AU;
let ly: LightYears = au.into();
assert_relative_eq!(ly.value(), 1.582e-5, max_relative = 1e-3);
}
#[test]
#[cfg(feature = "astro")]
fn from_impl_ly_to_au() {
let ly = 1.0 * LY;
let au: AstronomicalUnits = ly.into();
assert_relative_eq!(au.value(), 63241.0, max_relative = 1e-3);
}
#[test]
#[cfg(feature = "astro")]
fn parsec_to_light_year() {
let pc = Parsecs::new(1.0);
let ly = pc.to::<LightYear>();
let expected = (AstronomicalUnit::RATIO * ARCSECONDS_PER_RADIAN) / LightYear::RATIO;
assert_relative_eq!(ly.value(), expected, max_relative = 1e-15);
}
#[test]
#[cfg(feature = "astro")]
fn parsec_to_au() {
let pc = Parsecs::new(1.0);
let au = pc.to::<AstronomicalUnit>();
assert_relative_eq!(au.value(), 3.26 * 63241.0, max_relative = 1e-2);
}
#[test]
#[cfg(feature = "astro")]
fn parsec_ratio_sanity() {
let lhs = Parsec::RATIO / AstronomicalUnit::RATIO;
let rhs = ARCSECONDS_PER_RADIAN;
assert_relative_eq!(lhs, rhs, max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn solar_radius_to_meters() {
let sr = nominal::SolarRadiuses::new(1.0);
let m = sr.to::<Meter>();
assert_abs_diff_eq!(m.value(), 695_700_000.0, epsilon = 1e-3);
}
#[test]
#[cfg(feature = "astro")]
fn solar_radius_to_km() {
let sr = nominal::SolarRadiuses::new(1.0);
let km = sr.to::<Kilometer>();
assert_abs_diff_eq!(km.value(), 695_700.0, epsilon = 1e-6);
}
#[test]
fn roundtrip_km_m() {
let original = Kilometers::new(42.5);
let converted = original.to::<Meter>();
let back = converted.to::<Kilometer>();
assert_abs_diff_eq!(back.value(), original.value(), epsilon = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn roundtrip_au_ly() {
let original = AstronomicalUnits::new(10000.0);
let converted = original.to::<LightYear>();
let back = converted.to::<AstronomicalUnit>();
assert_relative_eq!(back.value(), original.value(), max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn roundtrip_parsec_ly() {
let original = Parsecs::new(5.0);
let converted = original.to::<LightYear>();
let back = converted.to::<Parsec>();
assert_relative_eq!(back.value(), original.value(), max_relative = 1e-12);
}
#[test]
#[cfg(feature = "customary")]
fn inch_to_meter_exact_ratio() {
let inch = Inches::new(1.0);
let m = inch.to::<Meter>();
assert_relative_eq!(m.value(), 0.0254, max_relative = 1e-16);
}
#[test]
#[cfg(feature = "navigation")]
fn nautical_mile_to_meter_exact_ratio() {
let nmi = NauticalMiles::new(1.0);
let m = nmi.to::<Meter>();
assert_abs_diff_eq!(m.value(), 1852.0, epsilon = 1e-12);
}
#[test]
#[cfg(feature = "customary")]
fn roundtrip_inch_meter() {
let original = Inches::new(123.456);
let converted = original.to::<Meter>();
let back = converted.to::<Inch>();
assert_relative_eq!(back.value(), original.value(), max_relative = 1e-12);
}
#[test]
#[cfg(feature = "navigation")]
fn roundtrip_nautical_mile_meter() {
let original = NauticalMiles::new(3.75);
let converted = original.to::<Meter>();
let back = converted.to::<NauticalMile>();
assert_relative_eq!(back.value(), original.value(), max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn roundtrip_parsec_kpc() {
let original = Parsecs::new(12_345.0);
let converted = original.to::<Kiloparsec>();
let back = converted.to::<Parsec>();
assert_relative_eq!(back.value(), original.value(), max_relative = 1e-12);
}
proptest! {
#[test]
fn prop_roundtrip_km_m(k in -1e6..1e6f64) {
let original = Kilometers::new(k);
let converted = original.to::<Meter>();
let back = converted.to::<Kilometer>();
prop_assert!((back.value() - original.value()).abs() < 1e-9 * k.abs().max(1.0));
}
#[test]
fn prop_km_m_ratio(k in 1e-6..1e6f64) {
let km = Kilometers::new(k);
let m = km.to::<Meter>();
prop_assert!((m.value() / km.value() - 1000.0).abs() < 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn prop_roundtrip_au_km(a in 1e-6..1e6f64) {
let original = AstronomicalUnits::new(a);
let converted = original.to::<Kilometer>();
let back = converted.to::<AstronomicalUnit>();
prop_assert!((back.value() - original.value()).abs() / original.value() < 1e-12);
}
#[test]
#[cfg(feature = "customary")]
fn prop_roundtrip_inch_m(i in -1e6..1e6f64) {
let original = Inches::new(i);
let converted = original.to::<Meter>();
let back = converted.to::<Inch>();
let scale = i.abs().max(1.0);
prop_assert!((back.value() - original.value()).abs() < 1e-9 * scale);
}
}
#[test]
fn decimeter_to_meter() {
let q = Decimeters::new(10.0);
assert_relative_eq!(q.to::<Meter>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn centimeter_to_meter() {
let q = Centimeters::new(100.0);
assert_relative_eq!(q.to::<Meter>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn millimeter_to_centimeter() {
let q = Millimeters::new(10.0);
assert_relative_eq!(q.to::<Centimeter>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn micrometer_to_millimeter() {
let q = Micrometers::new(1_000.0);
assert_relative_eq!(q.to::<Millimeter>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn nanometer_to_micrometer() {
let q = Nanometers::new(1_000.0);
assert_relative_eq!(q.to::<Micrometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn picometer_to_nanometer() {
let q = Picometers::new(1_000.0);
assert_relative_eq!(q.to::<Nanometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn femtometer_to_picometer() {
let q = Femtometers::new(1_000.0);
assert_relative_eq!(q.to::<Picometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn attometer_to_femtometer() {
let q = Attometers::new(1_000.0);
assert_relative_eq!(q.to::<Femtometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn zeptometer_to_attometer() {
let q = Zeptometers::new(1_000.0);
assert_relative_eq!(q.to::<Attometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn yoctometer_to_zeptometer() {
let q = Yoctometers::new(1_000.0);
assert_relative_eq!(q.to::<Zeptometer>().value(), 1.0, max_relative = 1e-15);
}
#[test]
fn decameter_to_meter() {
let q = Decameters::new(1.0);
assert_relative_eq!(q.to::<Meter>().value(), 10.0, max_relative = 1e-15);
}
#[test]
fn hectometer_to_meter() {
let q = Hectometers::new(1.0);
assert_relative_eq!(q.to::<Meter>().value(), 100.0, max_relative = 1e-15);
}
#[test]
fn megameter_to_kilometer() {
let q = Megameters::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn gigameter_to_megameter() {
let q = Gigameters::new(1.0);
assert_relative_eq!(q.to::<Megameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn terameter_to_gigameter() {
let q = Terameters::new(1.0);
assert_relative_eq!(q.to::<Gigameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn petameter_to_terameter() {
let q = Petameters::new(1.0);
assert_relative_eq!(q.to::<Terameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn exameter_to_petameter() {
let q = Exameters::new(1.0);
assert_relative_eq!(q.to::<Petameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn zettameter_to_exameter() {
let q = Zettameters::new(1.0);
assert_relative_eq!(q.to::<Exameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
fn yottameter_to_zettameter() {
let q = Yottameters::new(1.0);
assert_relative_eq!(q.to::<Zettameter>().value(), 1_000.0, max_relative = 1e-15);
}
#[test]
#[cfg(feature = "customary")]
fn foot_to_meter() {
let q = Feet::new(1.0);
assert_relative_eq!(q.to::<Meter>().value(), 0.3048, max_relative = 1e-15);
}
#[test]
#[cfg(feature = "customary")]
fn yard_to_meter() {
let q = Yards::new(1.0);
assert_relative_eq!(q.to::<Meter>().value(), 0.9144, max_relative = 1e-15);
}
#[test]
#[cfg(feature = "customary")]
fn mile_to_kilometer() {
let q = Miles::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 1.609_344, max_relative = 1e-15);
}
#[test]
#[cfg(all(feature = "navigation", feature = "customary"))]
fn fathom_to_foot() {
let q = Fathoms::new(1.0);
assert_relative_eq!(q.to::<Foot>().value(), 6.0, max_relative = 1e-14);
}
#[test]
#[cfg(all(feature = "navigation", feature = "customary"))]
fn chain_to_foot() {
let q = Chains::new(1.0);
assert_relative_eq!(q.to::<Foot>().value(), 66.0, max_relative = 1e-14);
}
#[test]
#[cfg(all(feature = "navigation", feature = "customary"))]
fn rod_to_foot() {
let q = Rods::new(1.0);
assert_relative_eq!(q.to::<Foot>().value(), 16.5, max_relative = 1e-14);
}
#[test]
#[cfg(all(feature = "navigation", feature = "customary"))]
fn link_to_foot() {
let q = Links::new(100.0);
assert_relative_eq!(q.to::<Foot>().value(), 66.0, max_relative = 1e-14);
}
#[test]
#[cfg(feature = "astro")]
fn megaparsec_to_kiloparsec() {
let q = Megaparsecs::new(1.0);
assert_relative_eq!(q.to::<Kiloparsec>().value(), 1_000.0, max_relative = 1e-12);
}
#[test]
#[cfg(feature = "astro")]
fn gigaparsec_to_megaparsec() {
let q = Gigaparsecs::new(1.0);
assert_relative_eq!(q.to::<Megaparsec>().value(), 1_000.0, max_relative = 1e-12);
}
#[test]
#[cfg(feature = "navigation")]
fn earth_meridional_circumference_to_km() {
let q = EarthMeridionalCircumferences::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 40_007.863, max_relative = 1e-6);
}
#[test]
#[cfg(feature = "navigation")]
fn earth_equatorial_circumference_to_km() {
let q = EarthEquatorialCircumferences::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 40_075.017, max_relative = 1e-6);
}
#[test]
#[cfg(feature = "fundamental-physics")]
fn bohr_radius_to_picometers() {
let q = BohrRadii::new(1.0);
assert_relative_eq!(q.to::<Picometer>().value(), 52.917_72, max_relative = 1e-5);
}
#[test]
#[cfg(feature = "fundamental-physics")]
fn classical_electron_radius_to_femtometers() {
let q = ClassicalElectronRadii::new(1.0);
assert_relative_eq!(
q.to::<Femtometer>().value(),
2.817_940_320_5,
max_relative = 1e-9
);
}
#[test]
#[cfg(feature = "fundamental-physics")]
fn planck_length_ratio() {
let q = PlanckLengths::new(1.0);
let back = q.to::<Meter>().to::<PlanckLength>();
assert_relative_eq!(back.value(), 1.0, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "fundamental-physics")]
fn electron_compton_wavelength_to_femtometers() {
let q = ElectronReducedComptonWavelengths::new(1.0);
assert_relative_eq!(
q.to::<Femtometer>().value(),
386.159_267_44,
max_relative = 1e-7
);
}
#[test]
#[cfg(feature = "astro")]
fn earth_radius_to_km() {
let q = nominal::EarthRadii::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 6_371.0, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn earth_equatorial_radius_to_km() {
let q = nominal::EarthEquatorialRadii::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 6_378.137, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn earth_polar_radius_to_km() {
let q = nominal::EarthPolarRadii::new(1.0);
assert_relative_eq!(
q.to::<Kilometer>().value(),
6_356.752_314_2,
max_relative = 1e-9
);
}
#[test]
#[cfg(feature = "astro")]
fn lunar_radius_to_km() {
let q = nominal::LunarRadii::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 1_737.4, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn jupiter_radius_to_km() {
let q = nominal::JupiterRadii::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 71_492.0, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn lunar_distance_to_km() {
let q = nominal::LunarDistances::new(1.0);
assert_relative_eq!(q.to::<Kilometer>().value(), 384_400.0, max_relative = 1e-9);
}
#[test]
#[cfg(feature = "astro")]
fn solar_diameter_to_solar_radius() {
let diameters = nominal::SolarDiameters::new(1.0);
let radii = diameters.to::<nominal::SolarRadius>();
assert_relative_eq!(radii.value(), 2.0, max_relative = 1e-14);
}
#[test]
fn symbols_are_correct() {
assert_eq!(Meter::SYMBOL, "m");
assert_eq!(Kilometer::SYMBOL, "km");
assert_eq!(Centimeter::SYMBOL, "cm");
#[cfg(feature = "customary")]
assert_eq!(Inch::SYMBOL, "in");
#[cfg(feature = "astro")]
assert_eq!(AstronomicalUnit::SYMBOL, "au");
#[cfg(feature = "astro")]
assert_eq!(Parsec::SYMBOL, "pc");
}
}