uninum 0.1.1

A robust, ergonomic unified number type for Rust with automatic overflow handling, type promotion, and cross-type consistency.
Documentation
//! Tests for From trait implementations
//!
//! This module tests the From trait implementations for converting
//! primitive types to Number variants.

use uninum::{Number, num};

/// Tests From trait implementations for all numeric types with boundary values
#[test]
fn test_from_implementations_comprehensive() {
    // Test boundary values for unsigned integers
    assert_eq!(Number::from(u32::MIN), Number::from(0u64));
    assert_eq!(Number::from(u32::MAX), Number::from(4294967295u64));
    assert_eq!(Number::from(u64::MIN), Number::from(0u64));
    assert_eq!(
        Number::from(u64::MAX),
        Number::from(18446744073709551615u64)
    );
    assert_eq!(Number::from(usize::MAX), Number::from(usize::MAX as u64));

    // Test boundary values for signed integers
    assert_eq!(Number::from(i32::MIN), Number::from(-2147483648i64));
    assert_eq!(Number::from(i32::MAX), Number::from(2147483647i64));
    assert_eq!(
        Number::from(i64::MIN),
        Number::from(-9223372036854775808i64)
    );
    assert_eq!(Number::from(i64::MAX), Number::from(9223372036854775807i64));
    assert_eq!(Number::from(isize::MIN), Number::from(isize::MIN as i64));
    assert_eq!(Number::from(isize::MAX), Number::from(isize::MAX as i64));

    // Test special f64 float values

    assert_eq!(Number::from(f64::NAN), num!(f64::NAN));
    assert_eq!(Number::from(f64::INFINITY), num!(f64::INFINITY));
    assert_eq!(Number::from(f64::NEG_INFINITY), num!(f64::NEG_INFINITY));
    assert_eq!(Number::from(f64::MIN), num!(f64::MIN));
    assert_eq!(Number::from(f64::MAX), num!(f64::MAX));
    assert_eq!(Number::from(f64::MIN_POSITIVE), num!(f64::MIN_POSITIVE));
    assert_eq!(Number::from(f64::EPSILON), num!(f64::EPSILON));

    // Test zero and negative zero
    assert_eq!(Number::from(0.0f64), num!(0.0));
    assert_eq!(Number::from(-0.0f64), num!(-0.0));
}

/// Tests the float constructors
#[test]
fn test_from_float_constructor() {
    // Use appropriate constructor based on type
    let b = num!(std::f64::consts::PI);

    // Check that it's a float and has the right value
    if let Some(f64_val) = b.try_get_f64() {
        assert!((f64_val - std::f64::consts::PI).abs() < 0.001);
    } else {
        panic!("Expected f64 value");
    }
}

/// Tests the constructor methods (from trait)
#[test]
fn test_constructor_methods_boundary_values() {
    // Test all constructor methods with boundary values
    assert_eq!(Number::from(u32::MIN as u64), Number::from(0u64));
    assert_eq!(Number::from(u32::MAX as u64), Number::from(4294967295u64));
    assert_eq!(Number::from(i32::MIN as i64), Number::from(-2147483648i64));
    assert_eq!(Number::from(i32::MAX as i64), Number::from(2147483647i64));

    assert_eq!(Number::from(u64::MIN), Number::from(0u64));
    assert_eq!(
        Number::from(u64::MAX),
        Number::from(18446744073709551615u64)
    );
    assert_eq!(
        Number::from(i64::MIN),
        Number::from(-9223372036854775808i64)
    );
    assert_eq!(Number::from(i64::MAX), Number::from(9223372036854775807i64));

    // Test float constructors with special values
    assert!(num!(f64::NAN).is_nan());
    assert!(num!(f64::INFINITY).is_infinite());
    assert!(num!(f64::NEG_INFINITY).is_infinite());
}

#[test]
#[cfg(feature = "decimal")]
fn test_from_decimal() {
    use rust_decimal::Decimal;

    // Test From implementation for Decimal
    let decimal_value = Decimal::new(314159, 5); // 3.14159
    let number = Number::from(decimal_value);

    assert!(number.try_get_decimal().is_some());
    if let Some(arc_decimal) = number.try_get_decimal() {
        assert_eq!(**arc_decimal, decimal_value);
    }
}