use crate::builtins::format::{format_c_number, CFormatKind};
pub struct ToCanonical;
impl ToCanonical {
pub fn format_number(n: &crate::value::TNumber) -> String {
format_c_number(n, CFormatKind::JavaScriptOrJson)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::value::TNumber;
use bigdecimal::BigDecimal;
use num_bigint::BigInt;
use std::str::FromStr;
#[test]
fn format_number_integers() {
assert_eq!(ToCanonical::format_number(&TNumber::Int(42)), "42");
assert_eq!(ToCanonical::format_number(&TNumber::Int(-7)), "-7");
assert_eq!(
ToCanonical::format_number(&TNumber::Long(i64::MAX)),
"9223372036854775807"
);
assert_eq!(
ToCanonical::format_number(&TNumber::BigInt(
BigInt::parse_bytes(b"123456789012345678901234567890", 10).unwrap()
)),
"123456789012345678901234567890"
);
}
#[test]
fn format_number_integral_doubles() {
assert_eq!(ToCanonical::format_number(&TNumber::Double(40.0)), "40");
assert_eq!(ToCanonical::format_number(&TNumber::Float(1.5)), "1.5");
assert_eq!(ToCanonical::format_number(&TNumber::Double(3.5)), "3.5");
}
#[test]
fn format_number_large_double_no_exponent() {
assert_eq!(
ToCanonical::format_number(&TNumber::Double(1e8)),
"100000000"
);
}
#[test]
fn format_number_special_doubles() {
assert_eq!(
ToCanonical::format_number(&TNumber::Double(f64::INFINITY)),
"Infinity"
);
assert_eq!(
ToCanonical::format_number(&TNumber::Double(f64::NEG_INFINITY)),
"-Infinity"
);
assert_eq!(
ToCanonical::format_number(&TNumber::Double(f64::NAN)),
"NaN"
);
}
#[test]
fn format_number_big_decimal_strips_trailing_zeros() {
assert_eq!(
ToCanonical::format_number(&TNumber::Decimal(BigDecimal::from_str("1.50").unwrap())),
"1.5"
);
assert_eq!(
ToCanonical::format_number(&TNumber::Decimal(BigDecimal::from_str("100.000").unwrap())),
"100"
);
}
}