unitforge 0.5.3

A library for unit and quantity consistent computations in Rust
Documentation
use crate::common::approx_eq;
use unitforge::quantities::*;
use unitforge::PhysicsQuantity;

const C: Velocity = Velocity::c();
const G: Acceleration = Acceleration::g();
const PI: Angle = Angle::pi();
const R: UniversalGasConstant = UniversalGasConstant::r();
const AMERICIUM: Density = Density::americium();
const WATER_VAPOR_PRESSURE: Stress = Stress::new(0.0627, StressUnit::bar);
const TEMP: Temperature = Temperature::new(-1.0, TemperatureUnit::K);
const R_FROM_NEW: UniversalGasConstant =
    UniversalGasConstant::new(8.31446261815324, UniversalGasConstantUnit::J_molK);

#[cfg(not(any(feature = "storage-f64", feature = "storage-f32")))]
const LARGE_GPA_STRESS: Stress = Stress::new(1.0e308, StressUnit::GPa);

#[cfg(feature = "storage-f32")]
const C_TOLERANCE: f64 = 16.0;
#[cfg(not(feature = "storage-f32"))]
const C_TOLERANCE: f64 = 1e-6;

#[cfg(feature = "storage-f32")]
const STRICT_TOLERANCE: f64 = 1e-5;
#[cfg(not(feature = "storage-f32"))]
const STRICT_TOLERANCE: f64 = 1e-12;

#[cfg(feature = "storage-f32")]
const DENSITY_TOLERANCE: f64 = 1e-2;
#[cfg(not(feature = "storage-f32"))]
const DENSITY_TOLERANCE: f64 = 1e-8;

#[test]
fn named_constants_are_const_compatible() {
    assert!(approx_eq(
        C.to(VelocityUnit::m_s),
        299_792_458.0,
        C_TOLERANCE
    ));
    assert!(approx_eq(
        G.to(AccelerationUnit::m_ssq),
        9.81,
        STRICT_TOLERANCE
    ));
    assert!(approx_eq(
        PI.to(AngleUnit::rad),
        core::f64::consts::PI,
        STRICT_TOLERANCE
    ));
    assert!(approx_eq(
        R.to(UniversalGasConstantUnit::J_molK),
        8.31446261815324,
        STRICT_TOLERANCE
    ));
}

#[test]
fn const_constants_preserve_values_for_normalized_inputs() {
    assert!(approx_eq(
        AMERICIUM.to(DensityUnit::kg_mcb),
        120_000.0,
        DENSITY_TOLERANCE
    ));
}

#[test]
fn quantity_constructors_are_const_compatible() {
    assert!(approx_eq(
        WATER_VAPOR_PRESSURE.to(StressUnit::Pa),
        6270.0,
        STRICT_TOLERANCE
    ));
    assert!(approx_eq(
        WATER_VAPOR_PRESSURE.to(StressUnit::bar),
        0.0627,
        STRICT_TOLERANCE
    ));
    assert!(approx_eq(
        TEMP.to(TemperatureUnit::K),
        -1.0,
        STRICT_TOLERANCE
    ));
    assert!(approx_eq(
        R_FROM_NEW.to(UniversalGasConstantUnit::J_molK),
        8.31446261815324,
        STRICT_TOLERANCE
    ));
}

#[test]
#[cfg(not(any(feature = "storage-f64", feature = "storage-f32")))]
fn const_constructors_preserve_large_exponential_parts() {
    let runtime = Stress::new(1.0e308, StressUnit::GPa);
    let (const_multiplier, const_power) = LARGE_GPA_STRESS.get_tuple();
    let (runtime_multiplier, runtime_power) = runtime.get_tuple();

    assert!(const_multiplier.is_finite());
    assert!(approx_eq(const_multiplier, runtime_multiplier, 1e-12));
    assert_eq!(const_power, runtime_power);
}

#[test]
#[cfg(not(any(feature = "storage-f64", feature = "storage-f32")))]
fn const_constants_preserve_canonical_parts_for_normalized_inputs() {
    let (multiplier, power) = AMERICIUM.get_tuple();

    assert!(approx_eq(multiplier, 1.2, 1e-12));
    assert_eq!(power, 5);
}