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)
);
}