use fast_float::{parse, parse_partial, FastFloat};
macro_rules! check_ok {
($s:expr, $x:expr) => {
let s = $s;
check_ok!(s, $x, f32);
check_ok!(s.as_bytes(), $x, f32);
check_ok!(s, $x, f64);
check_ok!(s.as_bytes(), $x, f64);
};
($s:expr, $x:expr, $ty:ty) => {
assert_eq!(<$ty>::parse_float($s).unwrap(), $x);
assert_eq!(<$ty>::parse_float_partial($s).unwrap(), ($x, $s.len()));
assert_eq!(parse::<$ty, _>($s).unwrap(), $x);
assert_eq!(parse_partial::<$ty, _>($s).unwrap(), ($x, $s.len()));
};
}
macro_rules! check_ok_partial {
($s:expr, $x:expr, $n:expr) => {
let s = $s;
check_ok_partial!(s, $x, $n, f32);
check_ok_partial!(s.as_bytes(), $x, $n, f32);
check_ok_partial!(s, $x, $n, f64);
check_ok_partial!(s.as_bytes(), $x, $n, f64);
};
($s:expr, $x:expr, $n:expr, $ty:ty) => {
assert!(<$ty>::parse_float($s).is_err());
assert_eq!(<$ty>::parse_float_partial($s).unwrap(), ($x, $n));
assert!(parse::<$ty, _>($s).is_err());
assert_eq!(parse_partial::<$ty, _>($s).unwrap(), ($x, $n));
};
}
macro_rules! check_err {
($s:expr) => {
let s = $s;
check_err!(s, f32);
check_err!(s.as_bytes(), f32);
check_err!(s, f64);
check_err!(s.as_bytes(), f64);
};
($s:expr, $ty:ty) => {
assert!(<$ty>::parse_float($s).is_err());
assert!(<$ty>::parse_float_partial($s).is_err());
assert!(parse::<$ty, _>($s).is_err());
assert!(parse_partial::<$ty, _>($s).is_err());
};
}
#[test]
fn test_api() {
check_ok!("1.23", 1.23);
check_ok!("0.", 0.);
check_ok!("-0", 0.);
check_ok!("+00", 0.);
check_ok!("-0001e-02", -0.01);
check_ok!("345", 345.);
check_ok_partial!("1a", 1., 1);
check_ok_partial!("-2e-1x", -0.2, 5);
check_ok_partial!("2e2.", 200., 3);
check_ok_partial!("2ea", 2., 1);
check_err!("");
check_err!(" ");
check_err!(".");
check_err!(".e1");
check_err!("+");
check_err!("-");
check_err!("x");
check_err!("a123");
}