use danwi::{Quantity, dimension::Energy, kind::Torque, prelude::*};
type TorqueQ = Quantity<f64, Energy, Torque>;
#[test]
fn same_kind_arithmetic() {
let t: TorqueQ = (50.0.N() * 0.4.m()).cast_kind();
assert_eq!(t + t, (40.0.J()).cast_kind());
assert_eq!(t - t, (0.0.J()).cast_kind());
assert_eq!(-t, (-20.0.J()).cast_kind());
assert!(t > (10.0.J()).cast_kind());
}
#[test]
fn scalar_ops_preserve_kind() {
let t: TorqueQ = (20.0.J()).cast_kind();
let doubled: TorqueQ = t * 2.0;
assert_eq!(doubled, 2.0 * t);
assert_eq!(doubled / 2.0, t);
}
#[test]
fn cast_and_erase() {
let t: TorqueQ = (20.0.J()).cast_kind();
assert_eq!(t.value(), 20.0);
assert_eq!(t.erase_kind(), 20.0.J());
let power = t.erase_kind() / 2.0.s();
assert_eq!(power, 10.0.W());
}
#[test]
fn custom_kinds_via_macro() {
mod my {
danwi::kinds! {
Activity;
}
}
let decay: Quantity<f64, danwi::dimension::Frequency, my::Activity> = (37.0.kHz()).cast_kind();
assert_eq!((decay + decay).value(), 74_000.0);
}
#[test]
fn kinded_quantities_stay_transparent() {
assert_eq!(core::mem::size_of::<TorqueQ>(), core::mem::size_of::<f64>());
}