unitforge 0.4.1

A library for unit and quantity consistent computations in Rust
Documentation
use crate::common::approx_eq;
use unitforge::quantities::{
    Area, AreaOfMoment, AreaOfMomentUnit, AreaUnit, DistanceUnit, Force, ForceStressUnit,
    ForceUnit, InverseStress, InverseStressUnit, Stress, StressSquared, StressSquaredUnit,
    StressUnit,
};
use unitforge::{PhysicsQuantity, Quantity, Sqrt, Unit};

#[test]
fn mul_with_self() {
    let area = Quantity::AreaQuantity(Area::new(10.0, AreaUnit::msq));
    let area_of_moment = (area * area).unwrap();

    assert_eq!(
        area_of_moment
            .to(Unit::AreaOfMomentUnit(AreaOfMomentUnit::mhc))
            .unwrap(),
        100.0
    );
}

#[test]
fn sqrt_of_area_of_moment_returns_area() {
    let area_of_moment =
        Quantity::AreaOfMomentQuantity(AreaOfMoment::new(25.0, AreaOfMomentUnit::mhc));
    let area = area_of_moment.sqrt().unwrap();

    assert!((area.to(Unit::AreaUnit(AreaUnit::msq)).unwrap() - 5.0).abs() < 1e-10);
}

#[test]
fn sqrt_handles_odd_decimal_power() {
    let area = Area::from_exponential(9.0, 1);
    let distance = area.sqrt();

    assert!((distance.to(DistanceUnit::m) - 90.0f64.sqrt()).abs() < 1e-12);
}

#[test]
fn inverse_stress_from_stress_division() {
    let stress = Stress::new(2.0, StressUnit::Pa);
    let inverse = 1.0 / stress;
    assert!((inverse.to(InverseStressUnit::_Pa) - 0.5).abs() < 1e-12);
}

#[test]
fn stress_from_inverse_stress_division() {
    let inverse = InverseStress::new(0.5, InverseStressUnit::_Pa);
    let stress = 1.0 / inverse;
    assert!((stress.to(StressUnit::Pa) - 2.0).abs() < 1e-12);
}

#[test]
fn stress_squared_from_force_stress_over_area() {
    let force = Force::new(2.0, ForceUnit::N);
    let stress = Stress::new(3.0, StressUnit::Pa);
    let area = Area::new(6.0, AreaUnit::msq);
    let result = (force * stress) / area;

    assert!(approx_eq(result.to(StressSquaredUnit::Nsq_mmhc), 1.0, 1e-12));
}

#[test]
fn force_stress_from_stress_squared_times_area() {
    let stress_squared = StressSquared::new(2.0, StressSquaredUnit::Nsq_mmhc);
    let area = Area::new(3.0, AreaUnit::msq);
    let result = stress_squared * area;

    assert!(approx_eq(result.to(ForceStressUnit::Nsq_msq), 6.0, 1e-12));
}