unitforge 0.4.1

A library for unit and quantity consistent computations in Rust
Documentation
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
    );
}