use crate::{Quantity, Unit};
use qtty_derive::Unit;
pub use crate::dimension::Temperature;
pub trait TemperatureUnit: Unit<Dim = Temperature> {}
impl<T: Unit<Dim = Temperature>> TemperatureUnit for T {}
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "K", dimension = Temperature, ratio = 1.0)]
pub struct Kelvin;
pub type K = Kelvin;
pub type Kelvins = Quantity<Kelvin>;
pub const KELVIN: Kelvins = Kelvins::new(1.0);
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Unit)]
#[unit(symbol = "°R", dimension = Temperature, ratio = 5.0 / 9.0)]
pub struct Rankine;
pub type R = Rankine;
pub type Rankines = Quantity<Rankine>;
pub const RANKINE: Rankines = Rankines::new(1.0);
#[macro_export]
#[doc(hidden)]
macro_rules! temperature_units {
($cb:path) => {
$cb!(Kelvin, Rankine);
};
}
temperature_units!(crate::impl_unit_from_conversions);
#[cfg(feature = "cross-unit-ops")]
temperature_units!(crate::impl_unit_cross_unit_ops);
#[cfg(test)]
temperature_units!(crate::assert_units_are_builtin);
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
use approx::assert_abs_diff_eq;
#[test]
fn kelvin_roundtrip() {
let t = Kelvins::new(284.65);
let t2: Kelvins = t.to();
assert_abs_diff_eq!(t2.value(), 284.65, epsilon = 1e-12);
}
#[test]
fn kelvin_addition() {
let a = Kelvins::new(100.0);
let b = Kelvins::new(184.65);
let c = a + b;
assert_abs_diff_eq!(c.value(), 284.65, epsilon = 1e-12);
}
#[test]
fn rankine_to_kelvin() {
let r = Rankines::new(1.0);
let k: Kelvins = r.to();
assert_abs_diff_eq!(k.value(), 5.0 / 9.0, epsilon = 1e-15);
}
#[test]
fn rankine_absolute_zero() {
let r = Rankines::new(0.0);
let k: Kelvins = r.to();
assert_abs_diff_eq!(k.value(), 0.0, epsilon = 1e-15);
}
#[test]
fn kelvin_to_rankine() {
let k = Kelvins::new(273.15);
let r: Rankines = k.to();
assert_abs_diff_eq!(r.value(), 491.67, epsilon = 1e-9);
}
}