unitforge 0.3.17

A library for unit and quantity consistent computations in Rust
Documentation
#![cfg(test)]
mod tests {
    use crate::*;
    use num_traits::Zero;

    #[test]
    fn test_new() {
        let input = 1000;
        let output = Distance::new(input.into(), DistanceUnit::mm);
        assert_eq!(
            output,
            Distance {
                multiplier: 1000f64,
                power: -3
            }
        )
    }

    #[test]
    fn optimize_on_add() {
        let f_1 = Force::new(10.0, ForceUnit::N);
        let f_2 = Force::new(1.0E12, ForceUnit::N);
        let f = f_1 + f_2;
        assert!(f.get_multiplier().log10().round() == 0.);
    }

    #[test]
    fn optimize_large() {
        let mut x = Force {
            multiplier: 1E10,
            power: 0,
        };
        x.optimize();
        assert!(x.get_multiplier().log10().round() == 0.);
        assert_eq!(x.to(ForceUnit::N), 1E10);
    }

    #[test]
    fn optimize_small() {
        let mut x = Force {
            multiplier: 1E-10,
            power: 0,
        };
        x.optimize();
        assert!(x.get_multiplier().log10().round() == 0.);
        assert_eq!(x.to(ForceUnit::N), 1E-10);
    }

    #[test]
    fn optimize_zero() {
        let mut f_1 = Force::zero();
        f_1.optimize();
        assert_eq!(f_1, Force::zero());
    }

    #[test]
    fn mul_with_self() {
        let a = Quantity::AreaQuantity(Area::new(10.0, AreaUnit::msq));
        let b = (a * a).unwrap();
        assert_eq!(
            b.to(Unit::AreaOfMomentUnit(AreaOfMomentUnit::mhc)).unwrap(),
            100.0
        );
    }

    #[test]
    fn sqrt() {
        let a = Quantity::AreaOfMomentQuantity(AreaOfMoment::new(25.0, AreaOfMomentUnit::mhc));
        let b = a.sqrt().unwrap();
        assert!((b.to(Unit::AreaUnit(AreaUnit::msq)).unwrap() - 5.0).abs() < 1E-10);
    }

    #[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!((result.to(StressSquaredUnit::Nsq_mmhc) - 1.0).abs() < 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!((result.to(ForceStressUnit::Nsq_msq) - 6.0).abs() < 1E-12);
    }

    #[test]
    fn test_optimal_unit_with_selection() {
        let area = Area::new(0.0001, AreaUnit::msq);
        let optimal_unit = area
            .optimal_unit(
                vec![AreaUnit::kmsq, AreaUnit::cmsq, AreaUnit::nmsq]
                    .into_iter()
                    .collect::<std::collections::HashSet<_>>(),
            )
            .unwrap();
        assert_eq!(optimal_unit, AreaUnit::cmsq)
    }
}