rational_extensions 0.5.0

Extensions for rational numbers.
Documentation
use super::{FromStrErr, MinMax, Ratio};
use serde_json as _;
#[test]
fn min_max() {
    for i in 0..1000 {
        for j in 0..1000 {
            assert!(
                MinMax::<u32>::new(i, i + j).is_some_and(|m| *m.min() == i && *m.max() == i + j)
            );
        }
    }
}
#[test]
fn min_max_err() {
    assert!(MinMax::new(f64::NAN, 0.0f64).is_none());
}
#[test]
fn dec_string() {
    assert_eq!("0", &super::to_dec_string(&Ratio::<u32>::new(0, 1), 0));
    assert_eq!(
        "-1.33",
        &super::to_dec_string(&Ratio::<i32>::new(-4i32, 3i32), 2)
    );
    assert_eq!(
        "-0.33",
        &super::to_dec_string(&Ratio::<i32>::new(-1i32, 3i32), 2)
    );
    assert_eq!(
        "5.000",
        &super::to_dec_string(&Ratio::<u32>::new(5u32, 1u32), 3)
    );
    assert_eq!(
        "0.66667",
        &super::to_dec_string(&Ratio::<u32>::new(2, 3), 5)
    );
}
#[test]
fn from_str() {
    assert_eq!(super::try_from_str::<u32>("4"), Ok(Ratio::new(4u32, 1u32)));
    assert_eq!(
        super::try_from_str::<u32>("4/8"),
        Ok(Ratio::new(1u32, 2u32))
    );
    assert_eq!(
        super::try_from_str::<u32>("5 9/8"),
        Ok(Ratio::new(49u32, 8u32))
    );
    assert_eq!(
        super::try_from_str::<i32>("-2 7/6"),
        Ok(Ratio::new(-19i32, 6i32))
    );
    assert_eq!(
        super::try_from_str::<i32>("-5/6"),
        Ok(Ratio::new(-5i32, 6i32))
    );
    assert_eq!(
        super::try_from_str::<u32>("0.1249"),
        Ok(Ratio::new(1249u32, 10000u32))
    );
    assert_eq!(
        super::try_from_str::<i32>("-1.33"),
        Ok(Ratio::new(-133i32, 100i32))
    );
    assert_eq!(
        super::try_from_str::<i32>("-0.33"),
        Ok(Ratio::new(-33i32, 100i32))
    );
    assert_eq!(super::try_from_str::<u32>("0.0"), Ok(Ratio::new(0, 1)));
    assert_eq!(
        super::try_from_str::<u32>("1/0"),
        Err(FromStrErr::DenominatorIsZero)
    );
}