268 lines
8.6 KiB
Rust
268 lines
8.6 KiB
Rust
use lexical_parse_float::options::Options;
|
|
use lexical_parse_float::parse;
|
|
use lexical_util::format::STANDARD;
|
|
use lexical_util::iterator::AsBytes;
|
|
use lexical_util::step::u64_step;
|
|
|
|
#[test]
|
|
fn parse_complete_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let result = parse::parse_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok(1.2345e10));
|
|
|
|
let string = b"1.2345e";
|
|
let result = parse::parse_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let result = parse::parse_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn fast_path_complete_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let result = parse::fast_path_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok(1.2345e10));
|
|
|
|
let string = b"1.2345e";
|
|
let result = parse::fast_path_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let result = parse::fast_path_complete::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn parse_partial_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let result = parse::parse_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok((1.2345e10, 9)));
|
|
|
|
let string = b"1.2345e";
|
|
let result = parse::parse_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let result = parse::parse_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok((1.2345, 6)));
|
|
}
|
|
|
|
#[test]
|
|
fn fast_path_partial_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let result = parse::fast_path_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok((1.2345e10, 9)));
|
|
|
|
let string = b"1.2345e";
|
|
let result = parse::fast_path_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let result = parse::fast_path_partial::<f64, FORMAT>(string, &OPTIONS);
|
|
assert_eq!(result, Ok((1.2345, 6)));
|
|
}
|
|
|
|
#[test]
|
|
fn parse_number_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_complete_number(byte, false, &OPTIONS);
|
|
assert!(result.is_ok());
|
|
let num = result.unwrap();
|
|
assert_eq!(num.mantissa, 12345);
|
|
assert_eq!(num.exponent, 6);
|
|
assert_eq!(num.many_digits, false);
|
|
|
|
let string = b"1.2345e";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_complete_number(byte, false, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_complete_number(byte, false, &OPTIONS);
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn parse_partial_number_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
const OPTIONS: Options = Options::new();
|
|
let string = b"1.2345e10";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_number(byte, false, &OPTIONS);
|
|
assert!(result.is_ok());
|
|
let (num, count) = result.unwrap();
|
|
assert_eq!(num.mantissa, 12345);
|
|
assert_eq!(num.exponent, 6);
|
|
assert_eq!(num.many_digits, false);
|
|
assert_eq!(count, 9);
|
|
|
|
let string = b"1.2345e";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_number(byte, false, &OPTIONS);
|
|
assert!(result.is_err());
|
|
|
|
let string = b"1.2345 ";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_number(byte, false, &OPTIONS);
|
|
assert!(result.is_ok());
|
|
let (num, count) = result.unwrap();
|
|
assert_eq!(num.mantissa, 12345);
|
|
assert_eq!(num.exponent, -4);
|
|
assert_eq!(num.many_digits, false);
|
|
assert_eq!(count, 6);
|
|
|
|
// Leading zeros
|
|
let string = b"00000000000000000000001.2345 ";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_number(byte, false, &OPTIONS);
|
|
assert!(result.is_ok());
|
|
let (num, count) = result.unwrap();
|
|
assert_eq!(num.mantissa, 12345);
|
|
assert_eq!(num.exponent, -4);
|
|
assert_eq!(num.many_digits, false);
|
|
assert_eq!(count, 28);
|
|
|
|
// Leading zeros
|
|
let string = b"0.00000000000000000000012345 ";
|
|
let byte = string.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_number(byte, false, &OPTIONS);
|
|
assert!(result.is_ok());
|
|
let (num, count) = result.unwrap();
|
|
assert_eq!(num.mantissa, 12345);
|
|
assert_eq!(num.exponent, -26);
|
|
assert_eq!(num.many_digits, false);
|
|
assert_eq!(count, 28);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_digits_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
let mut mantissa: u64 = 0;
|
|
let digits = b"1234567890123456789012345";
|
|
let mut byte = digits.bytes::<{ FORMAT }>();
|
|
parse::parse_digits(byte.integer_iter(), 10, |digit| {
|
|
mantissa = mantissa.wrapping_mul(10).wrapping_add(digit as _);
|
|
});
|
|
assert_eq!(mantissa, 1096246371337559929);
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(not(feature = "compact"))]
|
|
fn parse_8digits_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
let mut mantissa: u64 = 0;
|
|
let digits = b"1234567890123456789012345";
|
|
let mut byte = digits.bytes::<{ FORMAT }>();
|
|
parse::parse_8digits::<_, FORMAT>(byte.integer_iter(), &mut mantissa);
|
|
// We don't check for overflow.
|
|
assert_eq!(mantissa, 11177671081359486962);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_u64_digits_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
let mut mantissa: u64 = 0;
|
|
let mut step = u64_step(10);
|
|
let digits = b"1234567890123456789012345";
|
|
let mut byte = digits.bytes::<{ FORMAT }>();
|
|
parse::parse_u64_digits::<_, FORMAT>(byte.integer_iter(), &mut mantissa, &mut step);
|
|
assert_eq!(mantissa, 1234567890123456789);
|
|
assert_eq!(step, 0);
|
|
|
|
let mut mantissa: u64 = 0;
|
|
let mut step = u64_step(10);
|
|
let digits = b"1234567890123456789";
|
|
let mut byte = digits.bytes::<{ FORMAT }>();
|
|
parse::parse_u64_digits::<_, FORMAT>(byte.integer_iter(), &mut mantissa, &mut step);
|
|
assert_eq!(mantissa, 1234567890123456789);
|
|
assert_eq!(step, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn is_special_eq_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
|
|
let digits = b"NaN";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
assert_eq!(parse::is_special_eq::<FORMAT>(byte.clone(), b"nan"), 3);
|
|
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
assert_eq!(parse::is_special_eq::<FORMAT>(byte.clone(), b"NaN"), 3);
|
|
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
assert_eq!(parse::is_special_eq::<FORMAT>(byte.clone(), b"inf"), 0);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_positive_special_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
|
|
const OPTIONS: Options = Options::new();
|
|
let digits = b"NaN";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_positive_special::<f64, FORMAT>(byte, &OPTIONS).unwrap();
|
|
assert_eq!(result.1, 3);
|
|
assert!(f64::is_nan(result.0));
|
|
|
|
let digits = b"NaN1";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_positive_special::<f64, FORMAT>(byte, &OPTIONS).unwrap();
|
|
assert_eq!(result.1, 3);
|
|
assert!(f64::is_nan(result.0));
|
|
|
|
let digits = b"inf";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_positive_special::<f64, FORMAT>(byte, &OPTIONS).unwrap();
|
|
assert_eq!(result.1, 3);
|
|
assert!(f64::is_infinite(result.0));
|
|
|
|
let digits = b"in";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_positive_special::<f64, FORMAT>(byte, &OPTIONS);
|
|
assert_eq!(result, None);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_partial_special_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
|
|
const OPTIONS: Options = Options::new();
|
|
let digits = b"NaN";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_partial_special::<f64, FORMAT>(byte, true, &OPTIONS).unwrap();
|
|
assert_eq!(result.1, 3);
|
|
assert!(f64::is_nan(result.0));
|
|
assert!(f64::is_sign_negative(result.0));
|
|
}
|
|
|
|
#[test]
|
|
fn parse_parse_special_test() {
|
|
const FORMAT: u128 = STANDARD;
|
|
|
|
const OPTIONS: Options = Options::new();
|
|
let digits = b"NaN";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_special::<f64, FORMAT>(byte, true, &OPTIONS).unwrap();
|
|
assert!(f64::is_nan(result));
|
|
assert!(f64::is_sign_negative(result));
|
|
|
|
let digits = b"NaN1";
|
|
let byte = digits.bytes::<{ FORMAT }>();
|
|
let result = parse::parse_special::<f64, FORMAT>(byte, true, &OPTIONS);
|
|
assert_eq!(result, None);
|
|
}
|