use std::convert::TryFrom;
use uninum::Number;
#[test]
fn test_boundary_edge_cases() {
assert_eq!(Number::try_from("127").unwrap(), Number::from(127u64));
assert_eq!(Number::try_from("128").unwrap(), Number::from(128u64));
assert_eq!(Number::try_from("-127").unwrap(), Number::from(-127i64));
assert_eq!(Number::try_from("-128").unwrap(), Number::from(-128i64));
assert_eq!(Number::try_from("-129").unwrap(), Number::from(-129i64));
assert_eq!(Number::try_from("32767").unwrap(), Number::from(32767u64));
assert_eq!(Number::try_from("32768").unwrap(), Number::from(32768u64));
assert_eq!(Number::try_from("-32767").unwrap(), Number::from(-32767i64));
assert_eq!(Number::try_from("-32768").unwrap(), Number::from(-32768i64));
assert_eq!(Number::try_from("-32769").unwrap(), Number::from(-32769i64));
assert_eq!(
Number::try_from("2147483647").unwrap(),
Number::from(2147483647u64)
);
assert_eq!(
Number::try_from("2147483648").unwrap(),
Number::from(2147483648u64)
);
assert_eq!(
Number::try_from("-2147483647").unwrap(),
Number::from(-2147483647i64)
);
assert_eq!(
Number::try_from("-2147483648").unwrap(),
Number::from(-2147483648i64)
);
assert_eq!(
Number::try_from("-2147483649").unwrap(),
Number::from(-2147483649i64)
);
}
#[test]
fn test_conversion_extreme_values() {
assert_eq!(
Number::try_from("18446744073709551615").unwrap(),
Number::from(u64::MAX)
);
assert_eq!(
Number::try_from("9223372036854775807").unwrap(),
Number::from(i64::MAX)
);
assert_eq!(
Number::try_from("-9223372036854775808").unwrap(),
Number::from(i64::MIN)
);
#[cfg(feature = "decimal")]
{
assert!(
Number::try_from("18446744073709551616")
.unwrap()
.try_get_decimal()
.is_some()
);
assert!(
Number::try_from("99999999999999999999999999999999")
.unwrap()
.try_get_f64()
.is_some()
); }
#[cfg(not(feature = "decimal"))]
{
assert!(
Number::try_from("18446744073709551616")
.unwrap()
.try_get_f64()
.is_some()
);
assert!(
Number::try_from("99999999999999999999999999999999")
.unwrap()
.try_get_f64()
.is_some()
);
}
assert!(Number::try_from("1e-308").is_ok());
assert!(Number::try_from("1e-323").is_ok()); assert!(Number::try_from("1e-324").is_ok()); }
#[test]
fn test_special_float_values() {
let pos_inf = Number::try_from("inf").unwrap();
assert!(
pos_inf
.try_get_f64()
.is_some_and(|f| f.is_infinite() && f.is_sign_positive())
);
let neg_inf = Number::try_from("-inf").unwrap();
assert!(
neg_inf
.try_get_f64()
.is_some_and(|f| f.is_infinite() && f.is_sign_negative())
);
let pos_inf_caps = Number::try_from("INFINITY").unwrap();
assert!(pos_inf_caps.try_get_f64().is_some_and(|f| f.is_infinite()));
let neg_inf_caps = Number::try_from("-INFINITY").unwrap();
assert!(
neg_inf_caps
.try_get_f64()
.is_some_and(|f| f.is_infinite() && f.is_sign_negative())
);
let nan = Number::try_from("NaN").unwrap();
assert!(nan.try_get_f64().is_some_and(|f| f.is_nan()));
let nan_lower = Number::try_from("nan").unwrap();
assert!(nan_lower.try_get_f64().is_some_and(|f| f.is_nan()));
assert!(Number::try_from("inff64").is_err());
assert!(Number::try_from("nanf64").is_err());
}
#[test]
fn test_zero_variants() {
assert_eq!(Number::try_from("0").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("-0").unwrap(), Number::from(0i64));
assert_eq!(Number::try_from("+0").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("00").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("000000").unwrap(), Number::from(0u64));
#[cfg(feature = "decimal")]
{
assert!(Number::try_from("0.0").unwrap().try_get_decimal().is_some());
assert!(
Number::try_from("-0.0")
.unwrap()
.try_get_decimal()
.is_some()
);
assert!(
Number::try_from("+0.0")
.unwrap()
.try_get_decimal()
.is_some()
);
assert!(
Number::try_from("00.00")
.unwrap()
.try_get_decimal()
.is_some()
);
}
#[cfg(not(feature = "decimal"))]
{
assert!(Number::try_from("0.0").unwrap().try_get_f64().is_some());
assert!(Number::try_from("-0.0").unwrap().try_get_f64().is_some());
assert!(Number::try_from("+0.0").unwrap().try_get_f64().is_some());
assert!(Number::try_from("00.00").unwrap().try_get_f64().is_some());
}
assert_eq!(Number::try_from("0e10").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("0E+5").unwrap(), Number::from(0u64));
assert!(Number::try_from("0.0e-5").unwrap().try_get_f64().is_some());
assert_eq!(Number::try_from("0x0").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("0o0").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("0b0").unwrap(), Number::from(0u64));
}
#[test]
fn test_precision_edge_cases() {
let exact_f64_max = 9007199254740992u64; assert_eq!(Number::from(exact_f64_max), Number::from(exact_f64_max));
let beyond_f64_precision = 9007199254740993u64; assert_eq!(
Number::from(beyond_f64_precision),
Number::from(beyond_f64_precision)
);
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
let precise_decimal = Number::from(Decimal::new(123456789012345, 15));
assert_eq!(
precise_decimal,
Number::from(Decimal::new(123456789012345, 15))
);
}
}
#[test]
fn test_underscore_edge_cases() {
assert_eq!(
Number::try_from("1_000_000").unwrap(),
Number::from(1_000_000u64)
);
assert_eq!(
Number::try_from("0x1_a_2_b").unwrap(),
Number::from(0x1a2bu64)
);
assert_eq!(
Number::try_from("0b1010_1010").unwrap(),
Number::from(0b10101010u64)
);
assert_eq!(Number::try_from("0o7_5_5").unwrap(), Number::from(0o755u64));
assert_eq!(
Number::try_from("0xff_ee_dd").unwrap(),
Number::from(0xffeedd_u64)
);
assert_eq!(
Number::try_from("0o1_2_3_4").unwrap(),
Number::from(0o1234u64)
);
assert_eq!(
Number::try_from("0b1111_0000_1010_0101").unwrap(),
Number::from(0b1111000010100101u64)
);
assert!(Number::try_from("1_000u32").is_err());
assert!(Number::try_from("0xff_00u32").is_err());
#[cfg(feature = "decimal")]
assert!(
Number::try_from("1_234.567_8")
.unwrap()
.try_get_decimal()
.is_some()
);
#[cfg(not(feature = "decimal"))]
assert!(
Number::try_from("1_234.567_8")
.unwrap()
.try_get_f64()
.is_some()
);
}
#[test]
fn test_whitespace_handling() {
assert_eq!(Number::try_from(" 42 ").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("\t\n42\r\n").unwrap(), Number::from(42u64));
assert_eq!(
Number::try_from(" \t 42 \r \n ").unwrap(),
Number::from(42u64)
);
assert_eq!(Number::try_from(" 42").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("42 ").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("\t42").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("42\n").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("\r42").unwrap(), Number::from(42u64));
assert_eq!(
Number::try_from(" \t\r\n42\r\n\t ").unwrap(),
Number::from(42u64)
);
assert_eq!(Number::try_from(" -42 ").unwrap(), Number::from(-42i64));
assert_eq!(Number::try_from("\t-42\n").unwrap(), Number::from(-42i64));
#[cfg(feature = "decimal")]
assert!(
Number::try_from(" 3.16 ")
.unwrap()
.try_get_decimal()
.is_some()
);
#[cfg(not(feature = "decimal"))]
assert!(
Number::try_from(" 3.16 ")
.unwrap()
.try_get_f64()
.is_some()
);
}
#[test]
fn test_sign_handling() {
assert_eq!(Number::try_from("+42").unwrap(), Number::from(42u64));
assert_eq!(Number::try_from("+0").unwrap(), Number::from(0u64));
assert_eq!(Number::try_from("+255").unwrap(), Number::from(255u64));
assert_eq!(Number::try_from("+0xff").unwrap(), Number::from(255u64));
assert_eq!(Number::try_from("+0o77").unwrap(), Number::from(63u64));
assert_eq!(Number::try_from("+0b1010").unwrap(), Number::from(10u64));
#[cfg(feature = "decimal")]
assert!(
Number::try_from("+3.16")
.unwrap()
.try_get_decimal()
.is_some()
);
#[cfg(not(feature = "decimal"))]
assert!(Number::try_from("+3.16").unwrap().try_get_f64().is_some());
assert_eq!(Number::try_from("+1e2").unwrap(), Number::from(100u64));
#[cfg(feature = "decimal")]
assert!(
Number::try_from("+1.5e-2")
.unwrap()
.try_get_decimal()
.is_some()
);
#[cfg(not(feature = "decimal"))]
assert!(Number::try_from("+1.5e-2").unwrap().try_get_f64().is_some());
assert!(Number::try_from("+42u32").is_err());
assert!(Number::try_from("+42i64").is_err());
}
#[test]
fn test_complex_scientific_notation() {
assert!(Number::try_from("1e100").is_ok());
assert!(Number::try_from("1e308").is_ok());
assert!(Number::try_from("1e-100").is_ok());
assert!(Number::try_from("1e-308").is_ok());
#[cfg(feature = "decimal")]
{
assert!(
Number::try_from("123.456e-10")
.unwrap()
.try_get_decimal()
.is_some()
);
assert!(
Number::try_from("999.999e+20")
.unwrap()
.try_get_decimal()
.is_some()
);
}
#[cfg(not(feature = "decimal"))]
{
assert!(
Number::try_from("123.456e-10")
.unwrap()
.try_get_f64()
.is_some()
);
assert!(
Number::try_from("999.999e+20")
.unwrap()
.try_get_f64()
.is_some()
);
}
assert_eq!(Number::try_from("1.0e2").unwrap(), Number::from(100u64));
assert_eq!(Number::try_from("1.2e1").unwrap(), Number::from(12u64));
assert_eq!(Number::try_from("5.0e0").unwrap(), Number::from(5u64));
assert_eq!(
Number::try_from("1_000e3").unwrap(),
Number::from(1_000_000u64)
);
#[cfg(feature = "decimal")]
assert!(
Number::try_from("1.234_5e-2")
.unwrap()
.try_get_decimal()
.is_some()
);
#[cfg(not(feature = "decimal"))]
assert!(
Number::try_from("1.234_5e-2")
.unwrap()
.try_get_f64()
.is_some()
);
}
#[test]
fn test_case_sensitivity() {
assert_eq!(Number::try_from("0xff").unwrap(), Number::from(255u64));
assert_eq!(Number::try_from("0xFF").unwrap(), Number::from(255u64));
assert_eq!(Number::try_from("0xaA").unwrap(), Number::from(170u64));
assert_eq!(Number::try_from("0XFF").unwrap(), Number::from(255u64));
assert_eq!(Number::try_from("0o77").unwrap(), Number::from(63u64));
assert_eq!(Number::try_from("0O77").unwrap(), Number::from(63u64));
assert_eq!(Number::try_from("0b1010").unwrap(), Number::from(10u64));
assert_eq!(Number::try_from("0B1010").unwrap(), Number::from(10u64));
assert_eq!(Number::try_from("1e2").unwrap(), Number::from(100u64));
assert_eq!(Number::try_from("1E2").unwrap(), Number::from(100u64));
assert!(
Number::try_from("inf")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_infinite())
);
assert!(
Number::try_from("INF")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_infinite())
);
assert!(
Number::try_from("Inf")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_infinite())
);
assert!(
Number::try_from("infinity")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_infinite())
);
assert!(
Number::try_from("INFINITY")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_infinite())
);
assert!(
Number::try_from("nan")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_nan())
);
assert!(
Number::try_from("NaN")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_nan())
);
assert!(
Number::try_from("NAN")
.unwrap()
.try_get_f64()
.is_some_and(|f| f.is_nan())
);
assert!(Number::try_from("42U64").is_err());
assert!(Number::try_from("42I64").is_err());
assert!(Number::try_from("3.16F64").is_err());
}
#[test]
fn test_no_panic_extreme_inputs() {
let _result = Number::try_from("1".repeat(10000).as_str());
let _result = Number::try_from("0.".repeat(1000).as_str());
let _result = Number::try_from(format!("1e{}", "9".repeat(100)).as_str());
let _result = Number::try_from(format!("1e-{}", "9".repeat(100)).as_str());
let _result = Number::try_from("x".repeat(10000).as_str());
let _result = Number::try_from(format!("0x{}", "g".repeat(1000)).as_str());
let _result = Number::try_from(format!("{}_", "1".repeat(1000)).as_str());
}