use std::collections::HashSet;
use std::mem::{align_of, size_of};
use unitforge::quantities::*;
use unitforge::{Force, ForceUnit, PhysicsQuantity, QuantityKindId};
#[test]
fn quantity_kind_id_is_stored_in_memory_optimal_layout() {
#[repr(C)]
struct QuantityLayout {
multiplier: f64,
power: i32,
kind_id: u32,
}
let force = Force::new(1.0, ForceUnit::N);
assert_eq!(force.kind_id(), <Force as QuantityKindId>::KIND_ID);
assert_eq!(size_of::<Force>(), size_of::<QuantityLayout>());
assert_eq!(align_of::<Force>(), align_of::<QuantityLayout>());
}
#[test]
fn quantity_kind_ids_are_unique_and_non_zero() {
let ids = [
<Acceleration as QuantityKindId>::KIND_ID,
<Angle as QuantityKindId>::KIND_ID,
<AngularAcceleration as QuantityKindId>::KIND_ID,
<AngularVelocity as QuantityKindId>::KIND_ID,
<Area as QuantityKindId>::KIND_ID,
<AreaOfMoment as QuantityKindId>::KIND_ID,
<Charge as QuantityKindId>::KIND_ID,
<Compliance as QuantityKindId>::KIND_ID,
<Density as QuantityKindId>::KIND_ID,
<Distance as QuantityKindId>::KIND_ID,
<Force as QuantityKindId>::KIND_ID,
<ForceArea as QuantityKindId>::KIND_ID,
<ForceDistance as QuantityKindId>::KIND_ID,
<ForcePerDistancePowerFour as QuantityKindId>::KIND_ID,
<ForcePerVolume as QuantityKindId>::KIND_ID,
<ForceStress as QuantityKindId>::KIND_ID,
<ForceVolume as QuantityKindId>::KIND_ID,
<InverseAngle as QuantityKindId>::KIND_ID,
<InverseArea as QuantityKindId>::KIND_ID,
<InverseDistance as QuantityKindId>::KIND_ID,
<InverseStress as QuantityKindId>::KIND_ID,
<Mass as QuantityKindId>::KIND_ID,
<MassDivTimeSquaredVolume as QuantityKindId>::KIND_ID,
<MassPerDistance as QuantityKindId>::KIND_ID,
<RotationalStiffness as QuantityKindId>::KIND_ID,
<Stiffness as QuantityKindId>::KIND_ID,
<Strain as QuantityKindId>::KIND_ID,
<Stress as QuantityKindId>::KIND_ID,
<StressSquared as QuantityKindId>::KIND_ID,
<Time as QuantityKindId>::KIND_ID,
<Velocity as QuantityKindId>::KIND_ID,
<VelocitySquared as QuantityKindId>::KIND_ID,
<Voltage as QuantityKindId>::KIND_ID,
<Volume as QuantityKindId>::KIND_ID,
];
assert!(ids.iter().all(|id| *id != 0));
let unique = ids.into_iter().collect::<HashSet<_>>();
assert_eq!(unique.len(), ids.len());
}
#[test]
fn kind_id_method_matches_trait_constant_for_representative_quantities() {
assert_eq!(
Distance::new(1.0, DistanceUnit::m).kind_id(),
<Distance as QuantityKindId>::KIND_ID
);
assert_eq!(
Stress::new(1.0, StressUnit::Pa).kind_id(),
<Stress as QuantityKindId>::KIND_ID
);
assert_eq!(
Velocity::new(1.0, VelocityUnit::m_s).kind_id(),
<Velocity as QuantityKindId>::KIND_ID
);
}