uninum 0.1.1

A robust, ergonomic unified number type for Rust with automatic overflow handling, type promotion, and cross-type consistency.
Documentation
use uninum::{Number, num};

#[test]
fn sqrt_of_unsigned_promotes_to_float() {
    let value = Number::from(144u64);
    let result = value.sqrt();

    assert!(result.approx_eq(&num!(12.0), 1e-12, 0.0));
    assert!(result.try_get_f64().is_some());
}

#[test]
fn sqrt_of_negative_i64_is_nan() {
    let value = Number::from(-9i64);
    let result = value.sqrt();

    assert!(result.is_nan());
}

#[test]
fn sqrt_of_f64_matches_native_behavior() {
    let value = Number::from(2.0f64);
    let result = value.sqrt();
    let expected = Number::from(2.0f64.sqrt());

    assert!(result.approx_eq(&expected, 1e-12, 0.0));
}

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

    let decimal = Number::from(Decimal::new(225, 2)); // 2.25
    let result = decimal.sqrt();

    let decimal_value = result.try_get_decimal().expect("expected decimal result");
    assert_eq!(**decimal_value, Decimal::new(15, 1)); // 1.5
}

#[cfg(feature = "decimal")]
#[test]
fn sqrt_of_negative_decimal_is_nan() {
    use rust_decimal::Decimal;
    let decimal = Number::from(Decimal::new(-4, 0));
    let result = decimal.sqrt();

    assert!(result.is_nan());
}