use super::*;
use qtty_derive::Unit;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "ct", dimension = Mass, ratio = 1.0 / 5.0)]
pub struct Carat;
pub type Ct = Carat;
pub type Carats = Quantity<Ct>;
pub const CT: Carats = Carats::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "gr", dimension = Mass, ratio = 6_479_891.0 / 100_000_000.0)]
pub struct Grain;
pub type Gr = Grain;
pub type Grains = Quantity<Gr>;
pub const GR: Grains = Grains::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "lb", dimension = Mass, ratio = 45_359_237.0 / 100_000.0)]
pub struct Pound;
pub type Lb = Pound;
pub type Pounds = Quantity<Lb>;
pub const LB: Pounds = Pounds::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "oz", dimension = Mass, ratio = (45_359_237.0 / 100_000.0) / 16.0)]
pub struct Ounce;
pub type Oz = Ounce;
pub type Ounces = Quantity<Oz>;
pub const OZ: Ounces = Ounces::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "st", dimension = Mass, ratio = (45_359_237.0 / 100_000.0) * 14.0)]
pub struct Stone;
pub type St = Stone;
pub type Stones = Quantity<St>;
pub const ST: Stones = Stones::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "ton_us", dimension = Mass, ratio = (45_359_237.0 / 100_000.0) * 2000.0)]
pub struct ShortTon;
pub type ShortTons = Quantity<ShortTon>;
pub const TON_US: ShortTons = ShortTons::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "ton_uk", dimension = Mass, ratio = (45_359_237.0 / 100_000.0) * 2240.0)]
pub struct LongTon;
pub type LongTons = Quantity<LongTon>;
pub const TON_UK: LongTons = LongTons::new(1.0);
crate::impl_unit_from_conversions_between!(
Gram, Yoctogram, Zeptogram, Attogram, Femtogram, Picogram, Nanogram, Microgram,
Milligram, Centigram, Decigram, Decagram, Hectogram, Kilogram, Megagram, Gigagram,
Teragram, Petagram, Exagram, Zettagram, Yottagram, Tonne;
Carat, Grain, Pound, Ounce, Stone, ShortTon, LongTon
);
#[cfg(feature = "cross-unit-ops")]
crate::impl_unit_cross_unit_ops_between!(
Gram, Yoctogram, Zeptogram, Attogram, Femtogram, Picogram, Nanogram, Microgram,
Milligram, Centigram, Decigram, Decagram, Hectogram, Kilogram, Megagram, Gigagram,
Teragram, Petagram, Exagram, Zettagram, Yottagram, Tonne;
Carat, Grain, Pound, Ounce, Stone, ShortTon, LongTon
);
#[macro_export]
#[doc(hidden)]
macro_rules! mass_customary_units {
($cb:path) => {
$cb!(Carat, Grain, Pound, Ounce, Stone, ShortTon, LongTon,);
};
}
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
use approx::assert_abs_diff_eq;
use proptest::prelude::*;
#[test]
fn pound_to_grams() {
let pounds = Pounds::new(1.0);
let grams: Grams = pounds.to();
assert_abs_diff_eq!(grams.value(), 453.592_37, epsilon = 1e-10);
}
#[test]
fn stone_to_pounds() {
let stone = Stones::new(1.0);
let pounds: Pounds = stone.to();
assert_abs_diff_eq!(pounds.value(), 14.0, epsilon = 1e-12);
}
proptest! {
#[test]
fn ounce_gram_roundtrip(v in -1.0e9_f64..1.0e9_f64) {
let ounces = Ounces::new(v);
let roundtrip: Ounces = ounces.to::<Gram>().to();
prop_assert!((roundtrip.value() - v).abs() <= v.abs().max(1.0) * 1e-12);
}
}
}