core/util: Add unit tests for parse_numeric_str and fix whitespace handling

This commit is contained in:
Diego Reis 2025-03-24 19:56:13 -03:00
parent 6798341b05
commit 5dba4999a7

View file

@ -713,7 +713,9 @@ pub fn checked_cast_text_to_numeric(text: &str) -> std::result::Result<OwnedValu
}
fn parse_numeric_str(text: &str) -> Result<(OwnedValueType, &str), ()> {
let bytes = text.trim_start().as_bytes();
let text = text.trim();
let bytes = text.as_bytes();
if bytes.is_empty() {
return Err(());
}
@ -1513,4 +1515,111 @@ pub mod tests {
assert_eq!(cast_text_to_numeric("0.0"), OwnedValue::Float(0.0));
assert_eq!(cast_text_to_numeric("-"), OwnedValue::Integer(0));
}
#[test]
fn test_parse_numeric_str_valid_integer() {
assert_eq!(
parse_numeric_str("123"),
Ok((OwnedValueType::Integer, "123"))
);
assert_eq!(
parse_numeric_str("-456"),
Ok((OwnedValueType::Integer, "-456"))
);
assert_eq!(
parse_numeric_str("000789"),
Ok((OwnedValueType::Integer, "000789"))
);
}
#[test]
fn test_parse_numeric_str_valid_float() {
assert_eq!(
parse_numeric_str("123.456"),
Ok((OwnedValueType::Float, "123.456"))
);
assert_eq!(
parse_numeric_str("-0.789"),
Ok((OwnedValueType::Float, "-0.789"))
);
assert_eq!(
parse_numeric_str("1e10"),
Ok((OwnedValueType::Float, "1e10"))
);
assert_eq!(
parse_numeric_str("-1.23e-4"),
Ok((OwnedValueType::Float, "-1.23e-4"))
);
assert_eq!(
parse_numeric_str("1.23E+4"),
Ok((OwnedValueType::Float, "1.23E+4"))
);
}
#[test]
fn test_parse_numeric_str_edge_cases() {
assert_eq!(parse_numeric_str("1e"), Ok((OwnedValueType::Float, "1")));
assert_eq!(parse_numeric_str("1e-"), Ok((OwnedValueType::Float, "1")));
assert_eq!(parse_numeric_str("1e+"), Ok((OwnedValueType::Float, "1")));
assert_eq!(parse_numeric_str("-1e"), Ok((OwnedValueType::Float, "-1")));
assert_eq!(parse_numeric_str("-1e-"), Ok((OwnedValueType::Float, "-1")));
}
#[test]
fn test_parse_numeric_str_invalid() {
assert_eq!(parse_numeric_str(""), Err(()));
assert_eq!(parse_numeric_str("abc"), Err(()));
assert_eq!(parse_numeric_str("-"), Err(()));
assert_eq!(parse_numeric_str("e10"), Err(()));
assert_eq!(parse_numeric_str(".e10"), Err(()));
assert_eq!(parse_numeric_str("1.2.3"), Err(()));
}
#[test]
fn test_parse_numeric_str_with_whitespace() {
assert_eq!(
parse_numeric_str(" 123"),
Ok((OwnedValueType::Integer, "123"))
);
assert_eq!(
parse_numeric_str(" -456.78 "),
Ok((OwnedValueType::Float, "-456.78"))
);
assert_eq!(
parse_numeric_str(" 1.23e4 "),
Ok((OwnedValueType::Float, "1.23e4"))
);
}
#[test]
fn test_parse_numeric_str_leading_zeros() {
assert_eq!(
parse_numeric_str("000123"),
Ok((OwnedValueType::Integer, "000123"))
);
assert_eq!(
parse_numeric_str("000.456"),
Ok((OwnedValueType::Float, "000.456"))
);
assert_eq!(
parse_numeric_str("0001e3"),
Ok((OwnedValueType::Float, "0001e3"))
);
}
#[test]
fn test_parse_numeric_str_trailing_characters() {
assert_eq!(
parse_numeric_str("123abc"),
Ok((OwnedValueType::Integer, "123"))
);
assert_eq!(
parse_numeric_str("456.78xyz"),
Ok((OwnedValueType::Float, "456.78"))
);
assert_eq!(
parse_numeric_str("1.23e4extra"),
Ok((OwnedValueType::Float, "1.23e4"))
);
}
}