use core::default::Default;
use core::str::FromStr;
use scientific::{Decimals, Digits, Precision, RoundHalfAwayFromZero as RHAFZ, Scientific};
#[test]
fn truncate() {
assert_eq!(
&Scientific::from_str("5453.23265346")
.unwrap()
.truncate(Default::default()),
&Scientific::from_str("5453").unwrap(),
);
assert_eq!(
&Scientific::from_str("5453.23265346")
.unwrap()
.truncate(Decimals(-2)),
&Scientific::from_str("5400").unwrap(),
);
assert_eq!(
&Scientific::from_str("5453.23265346")
.unwrap()
.truncate(Decimals(2)),
&Scientific::from_str("5453.23").unwrap(),
);
assert_eq!(
&Scientific::from_str("5453.23265346")
.unwrap()
.truncate(Digits(2)),
&Scientific::from_str("5400").unwrap(),
);
}
#[test]
fn round() {
const TESTS: [(&str, Precision, &str); 7] = [
("5453.23265346", Digits(2), "5500"),
("5453.23265346", Digits(3), "5450"),
("5453.23265346", Decimals(-5), "0"),
("5453.23265346", Decimals(-4), "10000"),
("5453.23265346", Decimals(-3), "5000"),
("5453.23265346", Decimals(0), "5453"),
("5453.23265346", Decimals(3), "5453.233"),
];
for (base, precision, result) in TESTS {
assert_eq!(
Scientific::from_str(base).unwrap().round(precision, RHAFZ),
Scientific::from_str(result).unwrap(),
);
}
}
#[test]
fn round_rpsp() {
const TESTS: [(&str, Precision, &str); 29] = [
("0.00", Decimals(-1), "0"),
("0.01", Decimals(-1), "1"),
("0.10", Decimals(-1), "1"),
("20.00", Decimals(-1), "20"),
("20.01", Decimals(-1), "21"),
("20.10", Decimals(-1), "21"),
("20.90", Decimals(-1), "21"),
("21.00", Decimals(-1), "21"),
("21.50", Decimals(-1), "21"),
("21.90", Decimals(-1), "21"),
("22.00", Decimals(-1), "22"),
("22.50", Decimals(-1), "22"),
("22.90", Decimals(-1), "22"),
("23.00", Decimals(-1), "23"),
("23.50", Decimals(-1), "23"),
("23.90", Decimals(-1), "23"),
("24.00", Decimals(-1), "24"),
("24.50", Decimals(-1), "24"),
("24.90", Decimals(-1), "24"),
("25.00", Decimals(-1), "25"),
("25.01", Decimals(-1), "26"),
("25.10", Decimals(-1), "26"),
("25.90", Decimals(-1), "26"),
("26.00", Decimals(-1), "26"),
("26.50", Decimals(-1), "26"),
("26.90", Decimals(-1), "26"),
("29.00", Decimals(-1), "29"),
("29.50", Decimals(-1), "29"),
("29.90", Decimals(-1), "29"),
];
for (base, precision, result) in TESTS {
let rounded = Scientific::from_str(base).unwrap().round_rpsp(precision);
assert_eq!(
rounded,
Scientific::from_str(result).unwrap(),
"{base} {precision:?} => {result} != {rounded}"
);
}
}
#[test]
fn raw_parts() {
let n1 = Scientific::from_string("12.34e10".to_string()).unwrap();
let n2 = Scientific::from_raw_parts(
n1.is_sign_negative(),
n1.as_raw_mantissa().to_vec(),
n1.exponent(),
);
assert_eq!(Ok(n1), n2);
}
#[test]
fn test_make_writeable() {
let n1 = Scientific::from_string("7.77777".to_string()).unwrap();
let mut n2 = n1.round(Decimals(3), RHAFZ);
let n3 = &n1 - &n2;
assert_eq!(n3, Scientific::from_string("-0.00023".to_string()).unwrap());
n2.round_assign(Decimals(2), RHAFZ);
assert_eq!(n2, Scientific::from_string("7.78".to_string()).unwrap());
}