use uninum::{Number, RoundingStrategy, num};
#[test]
fn test_midpoint_nearest_even_basic() {
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(0.0f64),
num!(0.5f64).round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(2.0f64),
num!(1.5f64).round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(2.0f64),
num!(2.5f64).round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(4.0f64),
num!(3.5f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(-0.0f64),
num!(-0.5f64).round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(-2.0f64),
num!(-1.5f64).round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(-2.0f64),
num!(-2.5f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(3.0f64),
num!(3.16f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(4.0f64),
num!(3.86f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(-3.0f64),
num!(-3.16f64).round(0, RoundingStrategy::MidpointNearestEven)
);
}
#[test]
fn test_midpoint_away_from_zero_basic() {
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(1.0f64),
num!(0.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(2.0f64),
num!(1.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(3.0f64),
num!(2.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(4.0f64),
num!(3.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(-1.0f64),
num!(-0.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(-2.0f64),
num!(-1.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(-3.0f64),
num!(-2.5f64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(3.0f64),
num!(3.2f64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(4.0f64),
num!(3.7f64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(-3.0f64),
num!(-3.2f64).round(0, RoundingStrategy::MidpointAwayFromZero)
);
}
#[test]
fn test_midpoint_toward_zero_basic() {
assert_eq!(
num!(0.0f64),
num!(0.5f64).round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
num!(1.0f64),
num!(1.5f64).round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
num!(2.0f64),
num!(2.5f64).round(0, RoundingStrategy::MidpointTowardZero)
);
assert_eq!(
num!(-0.0f64),
num!(-0.5f64).round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
num!(-1.0f64),
num!(-1.5f64).round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
num!(-2.0f64),
num!(-2.5f64).round(0, RoundingStrategy::MidpointTowardZero)
);
assert_eq!(
num!(4.0f64),
num!(3.7f64).round(0, RoundingStrategy::MidpointTowardZero)
);
assert_eq!(
num!(-4.0f64),
num!(-3.7f64).round(0, RoundingStrategy::MidpointTowardZero)
);
}
#[test]
fn test_to_zero_basic() {
assert_eq!(
num!(3.0f64),
num!(3.16f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(3.0f64),
num!(3.99f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(-3.0f64),
num!(-3.16f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(-3.0f64),
num!(-3.99f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(0.0f64),
num!(0.5f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(1.0f64),
num!(1.5f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(-0.0f64),
num!(-0.5f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
num!(-1.0f64),
num!(-1.5f64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::ToZero)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::ToZero)
);
}
#[test]
fn test_away_from_zero_basic() {
assert_eq!(
num!(4.0f64),
num!(3.01f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(4.0f64),
num!(3.99f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(-4.0f64),
num!(-3.01f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(-4.0f64),
num!(-3.99f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(1.0f64),
num!(0.5f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(2.0f64),
num!(1.5f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(-1.0f64),
num!(-0.5f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
num!(-2.0f64),
num!(-1.5f64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::AwayFromZero)
);
}
#[test]
fn test_floor_basic() {
assert_eq!(
num!(3.0f64),
num!(3.16f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(3.0f64),
num!(3.99f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(-4.0f64),
num!(-3.16f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(-4.0f64),
num!(-3.01f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(num!(0.0f64), num!(0.5f64).round(0, RoundingStrategy::Floor));
assert_eq!(num!(1.0f64), num!(1.5f64).round(0, RoundingStrategy::Floor));
assert_eq!(
num!(-1.0f64),
num!(-0.5f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(-2.0f64),
num!(-1.5f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::Floor)
);
}
#[test]
fn test_ceil_basic() {
assert_eq!(num!(4.0f64), num!(3.01f64).round(0, RoundingStrategy::Ceil));
assert_eq!(num!(4.0f64), num!(3.99f64).round(0, RoundingStrategy::Ceil));
assert_eq!(
num!(-3.0f64),
num!(-3.99f64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(
num!(-3.0f64),
num!(-3.01f64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(num!(1.0f64), num!(0.5f64).round(0, RoundingStrategy::Ceil));
assert_eq!(num!(2.0f64), num!(1.5f64).round(0, RoundingStrategy::Ceil));
assert_eq!(
num!(-0.0f64),
num!(-0.5f64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(
num!(-1.0f64),
num!(-1.5f64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(
Number::from(42_u64),
Number::from(42_u64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(
Number::from(-42_i64),
Number::from(-42_i64).round(0, RoundingStrategy::Ceil)
);
}
#[test]
fn test_decimal_precision_midpoint_nearest_even() {
assert_eq!(
num!(1.12f64),
num!(1.125f64).round(2, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(1.14f64),
num!(1.135f64).round(2, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(1.12f64),
num!(1.115f64).round(2, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(1.2f64),
num!(1.25f64).round(1, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
num!(1.4f64),
num!(1.35f64).round(1, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(-1.12f64),
num!(-1.125f64).round(2, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(-1.14f64),
num!(-1.135f64).round(2, RoundingStrategy::MidpointNearestEven)
);
}
#[test]
fn test_decimal_precision_midpoint_away_from_zero() {
assert_eq!(
num!(1.13f64),
num!(1.125f64).round(2, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(1.14f64),
num!(1.135f64).round(2, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(1.3f64),
num!(1.25f64).round(1, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
num!(1.4f64),
num!(1.35f64).round(1, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(-1.13f64),
num!(-1.125f64).round(2, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
num!(-1.14f64),
num!(-1.135f64).round(2, RoundingStrategy::MidpointAwayFromZero)
);
}
#[test]
fn test_decimal_precision_other_strategies() {
let test_val = num!(1.125f64);
assert_eq!(
num!(1.12f64),
test_val.round(2, RoundingStrategy::MidpointTowardZero)
);
assert_eq!(num!(1.12f64), test_val.round(2, RoundingStrategy::ToZero));
assert_eq!(
num!(1.13f64),
test_val.round(2, RoundingStrategy::AwayFromZero)
);
assert_eq!(num!(1.12f64), test_val.round(2, RoundingStrategy::Floor));
assert_eq!(num!(1.13f64), test_val.round(2, RoundingStrategy::Ceil));
}
#[test]
fn test_special_float_values() {
let strategies = [
RoundingStrategy::MidpointNearestEven,
RoundingStrategy::MidpointAwayFromZero,
RoundingStrategy::MidpointTowardZero,
RoundingStrategy::ToZero,
RoundingStrategy::AwayFromZero,
RoundingStrategy::Floor,
RoundingStrategy::Ceil,
];
for strategy in strategies {
assert!(num!(f64::NAN).round(0, strategy).is_nan());
assert!(num!(f64::NAN).round(2, strategy).is_nan());
assert_eq!(num!(f64::INFINITY), num!(f64::INFINITY).round(0, strategy));
assert_eq!(
num!(f64::NEG_INFINITY),
num!(f64::NEG_INFINITY).round(0, strategy)
);
assert_eq!(num!(f64::INFINITY), num!(f64::INFINITY).round(2, strategy));
assert_eq!(
num!(f64::NEG_INFINITY),
num!(f64::NEG_INFINITY).round(2, strategy)
);
assert_eq!(num!(0.0f64), num!(0.0f64).round(0, strategy));
assert_eq!(num!(-0.0f64), num!(-0.0f64).round(0, strategy));
assert_eq!(num!(0.0f64), num!(0.0f64).round(2, strategy));
}
}
#[test]
fn test_type_preservation() {
let u32_val = Number::from(42_u64);
let i32_val = Number::from(-42_i64);
let u64_val = Number::from(1000_u64);
let i64_val = Number::from(-1000_i64);
let strategies = [
RoundingStrategy::MidpointNearestEven,
RoundingStrategy::MidpointAwayFromZero,
RoundingStrategy::MidpointTowardZero,
RoundingStrategy::ToZero,
RoundingStrategy::AwayFromZero,
RoundingStrategy::Floor,
RoundingStrategy::Ceil,
];
for strategy in strategies {
assert_eq!(u32_val, u32_val.round(0, strategy));
assert_eq!(i32_val, i32_val.round(0, strategy));
assert_eq!(u64_val, u64_val.round(0, strategy));
assert_eq!(i64_val, i64_val.round(0, strategy));
}
let f64_val = num!(3.16f64);
for strategy in strategies {
if f64_val.round(0, strategy).try_get_f64().is_some() {
} else {
panic!("F64 type not preserved for strategy {strategy:?}");
}
}
}
#[test]
fn test_integer_rounding_with_fractional_places_promotes_to_f64() {
let unsigned = Number::from(42_u64);
let rounded_unsigned = unsigned.round(2, RoundingStrategy::MidpointNearestEven);
assert!(rounded_unsigned.try_get_f64().is_some());
assert_eq!(rounded_unsigned.try_get_f64().unwrap(), 42.0);
let signed = Number::from(-7_i64);
let rounded_signed = signed.round(3, RoundingStrategy::Floor);
assert!(rounded_signed.try_get_f64().is_some());
assert_eq!(rounded_signed.try_get_f64().unwrap(), -7.0);
}
#[cfg(feature = "decimal")]
#[test]
fn test_decimal_type_comprehensive() {
use rust_decimal::Decimal;
let decimal_125 = Number::from(Decimal::new(125, 2)); assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_125.round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_125.round(0, RoundingStrategy::MidpointAwayFromZero)
);
assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_125.round(0, RoundingStrategy::MidpointTowardZero)
);
assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_125.round(0, RoundingStrategy::ToZero)
);
assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_125.round(0, RoundingStrategy::AwayFromZero)
);
assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_125.round(0, RoundingStrategy::Floor)
);
assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_125.round(0, RoundingStrategy::Ceil)
);
let decimal_15 = Number::from(Decimal::new(15, 1)); assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_15.round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_15.round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_15.round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_15.round(0, RoundingStrategy::ToZero)
); assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_15.round(0, RoundingStrategy::AwayFromZero)
); assert_eq!(
Number::from(Decimal::new(1, 0)),
decimal_15.round(0, RoundingStrategy::Floor)
); assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_15.round(0, RoundingStrategy::Ceil)
);
let decimal_25 = Number::from(Decimal::new(25, 1)); assert_eq!(
Number::from(Decimal::new(2, 0)),
decimal_25.round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
Number::from(Decimal::new(3, 0)),
decimal_25.round(0, RoundingStrategy::MidpointAwayFromZero)
);
let neg_decimal_15 = Number::from(Decimal::new(-15, 1)); assert_eq!(
Number::from(Decimal::new(-2, 0)),
neg_decimal_15.round(0, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
Number::from(Decimal::new(-2, 0)),
neg_decimal_15.round(0, RoundingStrategy::MidpointAwayFromZero)
); assert_eq!(
Number::from(Decimal::new(-1, 0)),
neg_decimal_15.round(0, RoundingStrategy::MidpointTowardZero)
); assert_eq!(
Number::from(Decimal::new(-2, 0)),
neg_decimal_15.round(0, RoundingStrategy::Floor)
); assert_eq!(
Number::from(Decimal::new(-1, 0)),
neg_decimal_15.round(0, RoundingStrategy::Ceil)
);
let decimal_1125 = Number::from(Decimal::new(1125, 3)); assert_eq!(
Number::from(Decimal::new(112, 2)),
decimal_1125.round(2, RoundingStrategy::MidpointNearestEven)
); assert_eq!(
Number::from(Decimal::new(113, 2)),
decimal_1125.round(2, RoundingStrategy::MidpointAwayFromZero)
); }
#[test]
fn test_consistency_across_types() {
let f64_val = num!(3.5f64);
let strategies = [
RoundingStrategy::MidpointNearestEven,
RoundingStrategy::MidpointAwayFromZero,
RoundingStrategy::Floor,
RoundingStrategy::Ceil,
];
for strategy in strategies {
let f64_result = f64_val.round(0, strategy);
if let Some(f64_wrapper) = f64_result.try_get_f64() {
let val = f64_wrapper;
match strategy {
RoundingStrategy::Floor => assert_eq!(val, 3.0),
_ => assert_eq!(val, 4.0),
}
}
}
}
#[test]
fn test_boundary_cases() {
assert_eq!(
num!(1.0f64),
num!(1.4999999f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(2.0f64),
num!(1.5000001f64).round(0, RoundingStrategy::MidpointNearestEven)
);
assert_eq!(
num!(0.0f64),
num!(0.0001f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(1.0f64),
num!(0.0001f64).round(0, RoundingStrategy::Ceil)
);
assert_eq!(
num!(1000000.0f64),
num!(1000000.1f64).round(0, RoundingStrategy::Floor)
);
assert_eq!(
num!(1000001.0f64),
num!(1000000.1f64).round(0, RoundingStrategy::Ceil)
);
}
#[test]
fn test_zero_decimal_places_edge_cases() {
let test_values = [
0.1, 0.5, 0.9, 1.1, 1.5, 1.9, -0.1, -0.5, -0.9, -1.1, -1.5, -1.9,
];
for val in test_values {
let num_val = num!(val);
let _ = num_val.round(0, RoundingStrategy::MidpointNearestEven);
let _ = num_val.round(0, RoundingStrategy::MidpointAwayFromZero);
let _ = num_val.round(0, RoundingStrategy::MidpointTowardZero);
let _ = num_val.round(0, RoundingStrategy::ToZero);
let _ = num_val.round(0, RoundingStrategy::AwayFromZero);
let _ = num_val.round(0, RoundingStrategy::Floor);
let _ = num_val.round(0, RoundingStrategy::Ceil);
}
}