use uninum::Number;
#[test]
fn test_basic_addition() {
assert_eq!(
Number::from(10u64) + Number::from(20u64),
Number::from(30u64)
);
assert_eq!(
Number::from(-10i64) + Number::from(20i64),
Number::from(10i64)
);
assert_eq!(Number::from(10.5) + Number::from(2.5), Number::from(13.0));
assert_eq!(Number::from(10u64) + Number::from(2.5), Number::from(12.5));
assert_eq!(
Number::from(-5i64) + Number::from(10u64),
Number::from(5i64)
);
}
#[test]
fn test_overflow_promotion() {
let result = Number::from(i64::MAX) + Number::from(1i64);
assert!(result.try_get_i64().is_none());
let result = Number::from(u64::MAX) + Number::from(1u64);
assert!(result.try_get_u64().is_none());
assert!(result.is_finite());
assert!(!result.is_nan());
}
#[test]
fn test_primitive_operations() {
let num = Number::from(10u64);
assert_eq!(&num + 5, Number::from(15u64));
assert_eq!(5 + &num, Number::from(15u64));
assert_eq!(&num + 5.5, Number::from(15.5));
let a = Number::from(10u64);
let b = Number::from(20u64);
assert_eq!(&a + &b, Number::from(30u64));
assert_eq!(a, Number::from(10u64));
assert_eq!(b, Number::from(20u64));
}
#[test]
fn test_special_float_values() {
let inf = Number::from(f64::INFINITY);
let neg_inf = Number::from(f64::NEG_INFINITY);
let nan = Number::from(f64::NAN);
let normal = Number::from(42);
assert!((inf.clone() + normal.clone()).is_pos_inf());
assert!((neg_inf.clone() + normal.clone()).is_neg_inf());
assert!((nan.clone() + normal.clone()).is_nan());
assert!((nan.clone() + inf.clone()).is_nan());
assert!((inf.clone() + neg_inf.clone()).is_nan());
}
#[test]
fn test_zero_handling() {
assert_eq!(Number::from(0u64) + Number::from(0u64), Number::from(0u64));
assert_eq!(Number::from(0i64) + Number::from(0i64), Number::from(0i64));
let pos_zero = Number::from(0.0);
let neg_zero = Number::from(-0.0);
let result = pos_zero.clone() + pos_zero.clone();
if let Some(f) = result.try_get_f64() {
assert!(f == 0.0 && f.is_sign_positive());
}
let result = neg_zero.clone() + neg_zero.clone();
if let Some(f) = result.try_get_f64() {
assert!(f == 0.0 && f.is_sign_negative());
}
assert_eq!(
Number::from(42i64) + Number::from(-42i64),
Number::from(0i64)
);
}
#[cfg(feature = "decimal")]
#[test]
fn test_decimal_precision() {
use rust_decimal::Decimal;
let a = Number::from(Decimal::new(12345, 4)); let b = Number::from(Decimal::new(67890, 4)); let sum = a + b;
if let Some(d) = sum.try_get_decimal() {
assert_eq!(d.to_string(), "8.0235");
}
let max_dec = Number::from(Decimal::MAX);
let overflow = max_dec.clone() + max_dec;
assert!(overflow.try_get_decimal().is_none()); assert!(overflow.is_finite()); }
#[test]
fn test_mathematical_properties() {
let a = Number::from(10);
let b = Number::from(20);
let c = Number::from(30);
assert_eq!(a.clone() + b.clone(), b.clone() + a.clone());
assert_eq!(
(a.clone() + b.clone()) + c.clone(),
a.clone() + (b.clone() + c.clone())
);
let x = Number::from(5u64);
let y = Number::from(-3i64);
let z = Number::from(2.5);
assert_eq!(
(x.clone() + y.clone()) + z.clone(),
x.clone() + (y.clone() + z.clone())
);
}
#[test]
fn test_extreme_values() {
let tiny = Number::from(f64::MIN_POSITIVE);
let sum = tiny.clone() + tiny;
if let Some(f) = sum.try_get_f64() {
assert_eq!(f, f64::MIN_POSITIVE * 2.0);
}
let large = Number::from(1e308);
let small = Number::from(1e-308);
let sum = large + small;
if let Some(f) = sum.try_get_f64() {
assert_eq!(f, 1e308);
}
let max_safe = Number::from(9007199254740991.0);
let one = Number::from(1.0);
let sum = max_safe + one;
if let Some(f) = sum.try_get_f64() {
assert_eq!(f, 9007199254740992.0);
}
}
#[test]
fn test_compound_operations() {
let result = Number::from(10) + Number::from(5) + Number::from(3);
assert_eq!(result, Number::from(18));
let a = Number::from(u64::MAX / 2);
let b = Number::from(u64::MAX / 2);
let c = Number::from(10u64);
let result = a + b + c;
assert!(result.try_get_u64().is_none());
assert!(result.is_finite());
}