use crate::{Per, Prod, Quantity, Unit};
use qtty_derive::Unit;
pub use crate::dimension::Acceleration;
pub trait AccelerationUnit: Unit<Dim = Acceleration> {}
impl<T: Unit<Dim = Acceleration>> AccelerationUnit for T {}
pub type Accel<L, T> = Quantity<Per<L, Prod<T, T>>>;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "m/s²", dimension = Acceleration, ratio = 1.0)]
pub struct MeterPerSecondSquared;
pub type MetersPerSecondSquared = Quantity<MeterPerSecondSquared>;
pub const METER_PER_SECOND_SQUARED: MetersPerSecondSquared = MetersPerSecondSquared::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "g₀", dimension = Acceleration, ratio = 9.80665)]
pub struct StandardGravity;
pub type StandardGravities = Quantity<StandardGravity>;
pub const STANDARD_GRAVITY: StandardGravities = StandardGravities::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! acceleration_units {
($cb:path) => {
$cb!(MeterPerSecondSquared, StandardGravity);
};
}
acceleration_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
acceleration_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
acceleration_units!(crate::assert_units_are_builtin);
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
use approx::assert_abs_diff_eq;
#[test]
fn standard_gravity_to_mps2() {
let g = StandardGravities::new(1.0);
let mps2: MetersPerSecondSquared = g.to();
assert_abs_diff_eq!(mps2.value(), 9.806_65, epsilon = 1e-10);
}
#[test]
fn mps2_to_standard_gravity() {
let a = MetersPerSecondSquared::new(9.806_65);
let g: StandardGravities = a.to();
assert_abs_diff_eq!(g.value(), 1.0, epsilon = 1e-10);
}
#[test]
fn unit_derives_are_sound() {
let q1 = MetersPerSecondSquared::new(1.0);
let q2 = StandardGravities::new(1.0);
let _ = format!("{}", &q1 as &dyn std::fmt::Display);
let _ = format!("{:e}", &q1 as &dyn std::fmt::LowerExp);
let _ = format!("{}", &q2 as &dyn std::fmt::Display);
let _ = format!("{:e}", &q2 as &dyn std::fmt::LowerExp);
}
}