#![cfg(feature = "decimal")]
use rust_decimal::Decimal;
use uninum::{Number, num};
#[test]
fn test_decimal_pool_common_values() {
let zero1 = Number::from(Decimal::ZERO);
let zero2 = Number::from(Decimal::ZERO);
assert_eq!(zero1, zero2);
let one1 = Number::from(Decimal::ONE);
let one2 = Number::from(Decimal::ONE);
assert_eq!(one1, one2);
let neg_one1 = Number::from(Decimal::NEGATIVE_ONE);
let neg_one2 = Number::from(Decimal::NEGATIVE_ONE);
assert_eq!(neg_one1, neg_one2);
let two1 = Number::from(Decimal::TWO);
let two2 = Number::from(Decimal::TWO);
assert_eq!(two1, two2);
let ten1 = Number::from(Decimal::TEN);
let ten2 = Number::from(Decimal::TEN);
assert_eq!(ten1, ten2);
}
#[test]
fn test_decimal_pool_uncommon_values() {
let custom1 = Number::from(Decimal::new(12345, 2)); let custom2 = Number::from(Decimal::new(12345, 2));
assert_eq!(custom1, custom2);
let pi = Number::from(Decimal::try_from(std::f64::consts::PI).unwrap());
let pi2 = Number::from(Decimal::try_from(std::f64::consts::PI).unwrap());
assert_eq!(pi, pi2);
}
#[test]
fn test_decimal_pool_arithmetic_operations() {
let a = Number::from(Decimal::from(100));
let b = Number::from(Decimal::from(200));
let sum = &a + &b;
assert_eq!(sum, Number::from(Decimal::from(300)));
let diff = &b - &a;
assert_eq!(diff, Number::from(Decimal::from(100)));
let product = &a * &b;
assert_eq!(product, Number::from(Decimal::from(20000)));
let quotient = &b / &a;
assert_eq!(quotient, Number::from(Decimal::from(2)));
}
#[test]
fn test_decimal_pool_mixed_operations() {
let decimal = Number::from(Decimal::from(100));
let int = Number::from(50u64);
let float = num!(25.0);
let result1 = &decimal + ∫
assert_eq!(result1, Number::from(Decimal::from(150)));
let result2 = &decimal - ∫
assert_eq!(result2, Number::from(Decimal::from(50)));
let result3 = &decimal * ∫
assert_eq!(result3, Number::from(Decimal::from(5000)));
let result4 = &decimal / ∫
assert_eq!(result4, Number::from(Decimal::from(2)));
let result5 = &decimal + &float;
assert_eq!(result5, Number::from(Decimal::from(125)));
}
#[test]
fn test_decimal_pool_special_values() {
let zero = Number::from(Decimal::ZERO);
let one = Number::from(Decimal::ONE);
let result = &one / &zero;
assert!(result.is_infinite());
let result = &zero / &zero;
assert!(result.is_nan());
let large = Number::from(Decimal::from(i64::MAX));
let result = &large + &large;
assert!(result.try_get_decimal().is_some() || result.try_get_f64().is_some());
}
#[test]
fn test_decimal_pool_precision() {
let a = Number::from(Decimal::new(1, 1)); let b = Number::from(Decimal::new(2, 1)); let c = Number::from(Decimal::new(3, 1));
let sum = &a + &b;
assert_eq!(sum, c);
let high_precision = Number::from(Decimal::new(123_456_789, 8)); let result = &high_precision * &Number::from(Decimal::from(2));
assert_eq!(result, Number::from(Decimal::new(246_913_578, 8)));
}
#[test]
fn test_decimal_pool_comparison() {
let a = Number::from(Decimal::from(100));
let b = Number::from(Decimal::from(200));
let c = Number::from(Decimal::from(100));
assert!(a < b);
assert!(b > a);
assert!(a == c);
assert!(a <= c);
assert!(a >= c);
assert!(a != b);
}
#[test]
fn test_decimal_pool_conversion() {
let decimal = Number::from(Decimal::from(42));
assert!(decimal.try_get_decimal().is_some());
assert_eq!(decimal.try_get_u64(), None);
assert_eq!(decimal.try_get_f64(), None);
assert!(decimal.is_integer()); assert!(decimal.is_float());
let int_decimal = Number::from(Decimal::from(42));
assert!(int_decimal.is_integer());
let frac_decimal = Number::from(Decimal::new(425, 1)); assert!(!frac_decimal.is_integer()); }
#[test]
fn test_decimal_pool_thread_safety() {
use std::thread;
let handles: Vec<_> = (0..10)
.map(|i| {
thread::spawn(move || {
let decimal = Number::from(Decimal::from(i));
let result = &decimal + &Number::from(Decimal::from(100));
assert_eq!(result, Number::from(Decimal::from(100 + i)));
})
})
.collect();
for handle in handles {
handle.join().unwrap();
}
}
#[test]
fn test_decimal_pool_large_numbers() {
let large1 = Number::from(Decimal::from(u64::MAX));
let large2 = Number::from(Decimal::from(u64::MAX));
assert_eq!(large1, large2);
let one = Number::from(Decimal::ONE);
let result = &large1 + &one;
assert!(result.try_get_decimal().is_some() || result.try_get_f64().is_some());
}
#[test]
fn test_decimal_pool_negative_numbers() {
let neg_one = Number::from(Decimal::NEGATIVE_ONE);
let neg_hundred = Number::from(Decimal::from(-100));
assert!(neg_one.is_negative());
assert!(neg_hundred.is_negative());
assert!(!neg_one.is_positive());
assert!(!neg_hundred.is_positive());
let result = &neg_one + &neg_hundred;
assert_eq!(result, Number::from(Decimal::from(-101)));
let result = &neg_hundred - &neg_one;
assert_eq!(result, Number::from(Decimal::from(-99)));
}