Source code
Revision control
Copy as Markdown
Other Tools
use crate::{error, Decimal, Error, Integer};
// Expect a floating point error less than the smallest allowed value of 0.001
const ABSERR: f64 = 0.000_1_f64;
#[test]
fn test_display() {
for (expected, input) in [
("0.1", 100),
("-0.1", -100),
("0.01", 10),
("-0.01", -10),
("0.001", 1),
("-0.001", -1),
("0.12", 120),
("-0.12", -120),
("0.124", 124),
("-0.124", -124),
("0.125", 125),
("-0.125", -125),
("0.126", 126),
("-0.126", -126),
] {
let decimal = Decimal::from_integer_scaled_1000(Integer::constant(input));
assert_eq!(expected, decimal.to_string());
}
assert_eq!("0.0", Decimal::ZERO.to_string());
assert_eq!("-999999999999.999", Decimal::MIN.to_string());
assert_eq!("999999999999.999", Decimal::MAX.to_string());
}
#[test]
fn test_into_f64() {
for (expected, input) in [
(0.0, 0),
(0.001, 1),
(0.01, 10),
(0.1, 100),
(1.0, 1000),
(10.0, 10000),
(0.123, 123),
(-0.001, -1),
(-0.01, -10),
(-0.1, -100),
(-1.0, -1000),
(-10.0, -10000),
(-0.123, -123),
] {
assert!(
(expected - f64::from(Decimal::from_integer_scaled_1000(input.into()))).abs() < ABSERR
);
}
assert!((-999_999_999_999.999 - f64::from(Decimal::MIN)).abs() < ABSERR);
assert!((999_999_999_999.999 - f64::from(Decimal::MAX)).abs() < ABSERR);
}
#[test]
fn test_try_from_f64() {
for (expected, input) in [
(Err(error::Repr::NaN), f64::NAN),
(Err(error::Repr::OutOfRange), f64::INFINITY),
(Err(error::Repr::OutOfRange), f64::NEG_INFINITY),
(Err(error::Repr::OutOfRange), 2_f64.powi(65)),
(Err(error::Repr::OutOfRange), -(2_f64.powi(65))),
(Err(error::Repr::OutOfRange), -1_000_000_000_000.0),
(Err(error::Repr::OutOfRange), 1_000_000_000_000.0),
(Ok(Decimal::MIN), -999_999_999_999.999),
(Ok(Decimal::MIN), -999_999_999_999.999_1),
(Err(error::Repr::OutOfRange), -999_999_999_999.999_5),
(Ok(Decimal::MAX), 999_999_999_999.999),
(Ok(Decimal::MAX), 999_999_999_999.999_1),
(Err(error::Repr::OutOfRange), 999_999_999_999.999_5),
(Ok(Decimal::ZERO), 0.0),
(Ok(Decimal::ZERO), -0.0),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(123))),
0.1234,
),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(124))),
0.1235,
),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(124))),
0.1236,
),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(-123))),
-0.1234,
),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(-124))),
-0.1235,
),
(
Ok(Decimal::from_integer_scaled_1000(Integer::constant(-124))),
-0.1236,
),
] {
assert_eq!(expected.map_err(Error::from), Decimal::try_from(input));
}
}