use uninum::{Number, num};
#[test]
fn test_is_integer_comprehensive() {
assert!(Number::from(42u64).is_integer());
assert!(Number::from(-42i64).is_integer());
assert!(Number::from(1000u64).is_integer());
assert!(Number::from(-1000i64).is_integer());
assert!(Number::from(u64::from(u32::MAX)).is_integer());
assert!(Number::from(i64::from(i32::MIN)).is_integer());
assert!(Number::from(0u64).is_integer());
assert!(Number::from(i64::MAX).is_integer());
assert!(num!(42.0f64).is_integer());
assert!(num!(42.0f64).is_integer());
assert!(num!(-42.0f64).is_integer());
assert!(num!(-42.0f64).is_integer());
assert!(num!(0.0f64).is_integer());
assert!(num!(0.0f64).is_integer());
assert!(num!(-0.0f64).is_integer());
assert!(num!(-0.0f64).is_integer());
assert!(num!(1e20f64).is_integer());
assert!(num!(1e15f64).is_integer());
assert!(!num!(42.5f64).is_integer());
assert!(!num!(42.5f64).is_integer());
assert!(!num!(0.1f64).is_integer());
assert!(!num!(0.1f64).is_integer());
assert!(!num!(-0.1f64).is_integer());
assert!(!num!(-0.1f64).is_integer());
assert!(!num!(f64::NAN).is_integer());
assert!(!num!(f64::NAN).is_integer());
assert!(!num!(f64::INFINITY).is_integer());
assert!(!num!(f64::INFINITY).is_integer());
assert!(!num!(f64::NEG_INFINITY).is_integer());
assert!(!num!(f64::NEG_INFINITY).is_integer());
let almost_int = num!(42.0 + f64::EPSILON);
let _is_int = almost_int.is_integer();
let tiny = num!(f64::MIN_POSITIVE / 1000.0);
assert!(!tiny.is_integer());
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
assert!(Number::from(Decimal::from(42)).is_integer());
assert!(Number::from(Decimal::from(-42)).is_integer());
assert!(Number::from(Decimal::ZERO).is_integer());
assert!(!Number::from(Decimal::try_from(std::f64::consts::PI).unwrap()).is_integer());
assert!(!Number::from(Decimal::try_from(-2.5).unwrap()).is_integer());
}
}
#[test]
fn test_is_float_comprehensive() {
assert!(!Number::from(42u64).is_float());
assert!(!Number::from(-42i64).is_float());
assert!(!Number::from(1000u64).is_float());
assert!(!Number::from(-1000i64).is_float());
assert!(!Number::from(u64::from(u32::MAX)).is_float());
assert!(!Number::from(i64::from(i32::MIN)).is_float());
assert!(!Number::from(0u64).is_float());
assert!(!Number::from(i64::MAX).is_float());
assert!(num!(42.0f64).is_float());
assert!(num!(42.0f64).is_float());
assert!(num!(-42.0f64).is_float());
assert!(num!(-42.0f64).is_float());
assert!(num!(0.0f64).is_float());
assert!(num!(0.0f64).is_float());
assert!(num!(-0.0f64).is_float());
assert!(num!(-0.0f64).is_float());
assert!(num!(42.5f64).is_float());
assert!(num!(42.5f64).is_float());
assert!(num!(0.1f64).is_float());
assert!(num!(0.1f64).is_float());
assert!(num!(f64::NAN).is_float());
assert!(num!(f64::NAN).is_float());
assert!(num!(f64::INFINITY).is_float());
assert!(num!(f64::INFINITY).is_float());
assert!(num!(f64::NEG_INFINITY).is_float());
assert!(num!(f64::NEG_INFINITY).is_float());
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
assert!(Number::from(Decimal::from(42)).is_float());
assert!(Number::from(Decimal::try_from(std::f64::consts::PI).unwrap()).is_float());
}
}
#[test]
fn test_is_zero_comprehensive() {
assert!(Number::from(0u64).is_zero());
assert!(Number::from(0i64).is_zero());
assert!(Number::from(0u64).is_zero());
assert!(Number::from(0i64).is_zero());
assert!(Number::from(0u64).is_zero());
assert!(Number::from(0i64).is_zero());
assert!(Number::from(0u64).is_zero());
assert!(Number::from(0i64).is_zero());
assert!(!Number::from(1u64).is_zero());
assert!(!Number::from(255u64).is_zero());
assert!(!Number::from(-1i64).is_zero());
assert!(!Number::from(-128i64).is_zero());
assert!(!Number::from(65535u64).is_zero());
assert!(!Number::from(-32768i64).is_zero());
assert!(!Number::from(u64::from(u32::MAX)).is_zero());
assert!(!Number::from(i64::from(i32::MIN)).is_zero());
assert!(!Number::from(u64::MAX).is_zero());
assert!(!Number::from(i64::MIN).is_zero());
assert!(num!(0.0f64).is_zero());
assert!(num!(-0.0f64).is_zero());
assert!(num!(0.0f64).is_zero());
assert!(num!(-0.0f64).is_zero());
assert!(!num!(f64::MIN_POSITIVE).is_zero());
assert!(!num!(f64::MIN_POSITIVE).is_zero());
assert!(!Number::from(-f64::MIN_POSITIVE).is_zero());
assert!(!Number::from(-f64::MIN_POSITIVE).is_zero());
assert!(!num!(f64::MIN_POSITIVE / 2.0).is_zero());
assert!(!num!(f64::MIN_POSITIVE / 2.0).is_zero());
assert!(!num!(f64::NAN).is_zero());
assert!(!num!(f64::INFINITY).is_zero());
assert!(!num!(f64::NEG_INFINITY).is_zero());
assert!(!num!(f64::NAN).is_zero());
assert!(!num!(f64::INFINITY).is_zero());
assert!(!num!(f64::NEG_INFINITY).is_zero());
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
assert!(Number::from(Decimal::ZERO).is_zero());
assert!(!Number::from(Decimal::new(1, 28)).is_zero());
assert!(!Number::from(Decimal::new(-1, 28)).is_zero());
}
}
#[test]
fn test_is_positive_comprehensive() {
assert!(Number::from(1u64).is_positive());
assert!(Number::from(255u64).is_positive());
assert!(Number::from(1000u64).is_positive());
assert!(Number::from(42u64).is_positive());
assert!(Number::from(u64::MAX).is_positive());
assert!(Number::from(1i64).is_positive());
assert!(Number::from(127i64).is_positive());
assert!(Number::from(1000i64).is_positive());
assert!(Number::from(42i64).is_positive());
assert!(Number::from(i64::MAX).is_positive());
assert!(!Number::from(0u64).is_positive());
assert!(!Number::from(0i64).is_positive());
assert!(!Number::from(0u64).is_positive());
assert!(!Number::from(0i64).is_positive());
assert!(!num!(0.0f64).is_positive());
assert!(!num!(-0.0f64).is_positive());
assert!(!num!(0.0f64).is_positive());
assert!(!num!(-0.0f64).is_positive());
assert!(!Number::from(-1i64).is_positive());
assert!(!Number::from(-1000i64).is_positive());
assert!(!Number::from(-42i64).is_positive());
assert!(!Number::from(i64::MIN).is_positive());
assert!(num!(0.1f64).is_positive());
assert!(Number::from(std::f64::consts::PI).is_positive());
assert!(Number::from(0.001f64).is_positive());
assert!(num!(f64::MAX).is_positive());
assert!(num!(f64::MIN_POSITIVE).is_positive());
assert!(!num!(-0.1f64).is_positive());
assert!(!Number::from(-std::f64::consts::PI).is_positive());
assert!(num!(f64::INFINITY).is_positive());
assert!(!num!(f64::NEG_INFINITY).is_positive());
assert!(!num!(f64::NAN).is_positive());
assert!(num!(f64::INFINITY).is_positive());
assert!(!num!(f64::NEG_INFINITY).is_positive());
assert!(!num!(f64::NAN).is_positive());
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
assert!(!Number::from(Decimal::ZERO).is_positive());
assert!(Number::from(Decimal::new(42, 0)).is_positive());
assert!(!Number::from(Decimal::new(-42, 0)).is_positive());
}
}
#[test]
fn test_is_negative_comprehensive() {
assert!(!Number::from(0u64).is_negative());
assert!(!Number::from(1u64).is_negative());
assert!(!Number::from(255u64).is_negative());
assert!(!Number::from(0u64).is_negative());
assert!(!Number::from(65535u64).is_negative());
assert!(!Number::from(0u64).is_negative());
assert!(!Number::from(u64::from(u32::MAX)).is_negative());
assert!(!Number::from(0u64).is_negative());
assert!(!Number::from(u64::MAX).is_negative());
assert!(!Number::from(1i64).is_negative());
assert!(!Number::from(127i64).is_negative());
assert!(!Number::from(1000i64).is_negative());
assert!(!Number::from(42i64).is_negative());
assert!(!Number::from(i64::MAX).is_negative());
assert!(!Number::from(0i64).is_negative());
assert!(!Number::from(0i64).is_negative());
assert!(!Number::from(0i64).is_negative());
assert!(!Number::from(0i64).is_negative());
assert!(!num!(0.0f64).is_negative());
assert!(!num!(-0.0f64).is_negative());
assert!(!num!(0.0f64).is_negative());
assert!(!num!(-0.0f64).is_negative());
assert!(Number::from(-1i64).is_negative());
assert!(Number::from(-128i64).is_negative());
assert!(Number::from(-1000i64).is_negative());
assert!(Number::from(-42i64).is_negative());
assert!(Number::from(i64::MIN).is_negative());
assert!(!num!(0.1f64).is_negative());
assert!(!Number::from(std::f64::consts::PI).is_negative());
assert!(!num!(0.001f64).is_negative());
assert!(!num!(f64::MAX).is_negative());
assert!(num!(-0.1f64).is_negative());
assert!(Number::from(-std::f64::consts::PI).is_negative());
assert!(num!(-0.001f64).is_negative());
assert!(Number::from(-f64::MAX).is_negative());
assert!(!num!(f64::INFINITY).is_negative());
assert!(num!(f64::NEG_INFINITY).is_negative());
assert!(!num!(f64::NAN).is_negative());
assert!(!num!(f64::INFINITY).is_negative());
assert!(num!(f64::NEG_INFINITY).is_negative());
assert!(!num!(f64::NAN).is_negative());
#[cfg(feature = "decimal")]
{
use rust_decimal::Decimal;
assert!(!Number::from(Decimal::ZERO).is_negative());
assert!(!Number::from(Decimal::new(42, 0)).is_negative());
assert!(Number::from(Decimal::new(-42, 0)).is_negative());
}
}
#[test]
fn test_sign_consistency() {
let test_values = vec![
Number::from(0u64),
Number::from(1u64),
Number::from(255u64),
Number::from(0i64),
Number::from(1i64),
Number::from(-1i64),
Number::from(127i64),
Number::from(-128i64),
Number::from(0u64),
Number::from(1u64),
Number::from(65535u64),
Number::from(0i64),
Number::from(1i64),
Number::from(-1i64),
Number::from(32767i64),
Number::from(-32768i64),
Number::from(0u64),
Number::from(1u64),
Number::from(u64::from(u32::MAX)),
Number::from(0i64),
Number::from(1i64),
Number::from(-1i64),
Number::from(i64::from(i32::MAX)),
Number::from(i64::from(i32::MIN)),
Number::from(0u64),
Number::from(1u64),
Number::from(u64::MAX),
Number::from(0i64),
Number::from(1i64),
Number::from(-1i64),
Number::from(i64::MAX),
Number::from(i64::MIN),
num!(0.0f64),
num!(-0.0f64),
num!(1.0f64),
num!(-1.0f64),
num!(f64::MIN),
num!(f64::MAX),
num!(f64::MIN_POSITIVE),
Number::from(-f64::MIN_POSITIVE),
num!(f64::EPSILON),
Number::from(-f64::EPSILON),
num!(f64::NAN),
Number::from(-f64::NAN),
num!(f64::INFINITY),
num!(f64::NEG_INFINITY),
num!(0.0f64),
num!(-0.0f64),
num!(1.0f64),
num!(-1.0f64),
num!(f64::MIN),
num!(f64::MAX),
num!(f64::MIN_POSITIVE),
Number::from(-f64::MIN_POSITIVE),
num!(f64::EPSILON),
Number::from(-f64::EPSILON),
num!(f64::NAN),
Number::from(-f64::NAN),
num!(f64::INFINITY),
num!(f64::NEG_INFINITY),
num!(f64::MIN_POSITIVE / 2.0),
Number::from(-f64::MIN_POSITIVE / 2.0),
num!(f64::MIN_POSITIVE / 2.0),
Number::from(-f64::MIN_POSITIVE / 2.0),
];
for value in test_values {
let is_zero = value.is_zero();
let is_positive = value.is_positive();
let is_negative = value.is_negative();
let is_nan = value.is_nan();
let count = [is_zero, is_positive, is_negative, is_nan]
.iter()
.filter(|&&x| x)
.count();
if is_nan {
assert_eq!(count, 1, "NaN {value:?} should only have is_nan() true");
assert!(!is_zero && !is_positive && !is_negative);
} else {
assert_eq!(
count, 1,
"Value {value:?} should have exactly one sign property, but has {count}"
);
}
if is_zero {
assert!(!is_positive && !is_negative && !is_nan);
assert!(value.is_finite() && !value.is_normal());
}
if is_positive {
assert!(!is_zero && !is_negative && !is_nan);
assert!(value.is_finite() || value.is_pos_inf());
}
if is_negative {
assert!(!is_zero && !is_positive && !is_nan);
assert!(value.is_finite() || value.is_neg_inf());
}
}
}
#[test]
fn test_subnormal_values() {
let subnormal_f64 = num!(f64::MIN_POSITIVE / 2.0);
let subnormal_f64_2 = num!(f64::MIN_POSITIVE / 2.0);
assert!(!subnormal_f64.is_zero());
assert!(subnormal_f64.is_positive());
assert!(!subnormal_f64.is_negative());
assert!(!subnormal_f64_2.is_zero());
assert!(subnormal_f64_2.is_positive());
assert!(!subnormal_f64_2.is_negative());
let neg_subnormal_f64 = Number::from(-f64::MIN_POSITIVE / 2.0);
let neg_subnormal_f64_2 = Number::from(-f64::MIN_POSITIVE / 2.0);
assert!(!neg_subnormal_f64.is_zero());
assert!(!neg_subnormal_f64.is_positive());
assert!(neg_subnormal_f64.is_negative());
assert!(!neg_subnormal_f64_2.is_zero());
assert!(!neg_subnormal_f64_2.is_positive());
assert!(neg_subnormal_f64_2.is_negative());
}
#[test]
fn test_fast_dispatch_methods() {
let int_val = Number::from(42u64);
let float_val = num!(42.5f64);
let zero_val = Number::from(0i64);
assert!(int_val.is_integer());
assert!(!float_val.is_integer());
assert!(!int_val.is_float());
assert!(float_val.is_float());
assert!(!int_val.is_zero());
assert!(!float_val.is_zero());
assert!(zero_val.is_zero());
}