| use std::f64::{INFINITY, NAN}; |
| |
| use js_sys::*; |
| use wasm_bindgen::prelude::*; |
| use wasm_bindgen::JsCast; |
| use wasm_bindgen_test::*; |
| |
| #[wasm_bindgen(module = "tests/wasm/Number.js")] |
| extern "C" { |
| fn const_epsilon() -> f64; |
| fn const_max_safe_integer() -> f64; |
| fn const_max_value() -> f64; |
| fn const_min_safe_integer() -> f64; |
| fn const_min_value() -> f64; |
| fn const_negative_infinity() -> f64; |
| fn const_positive_infinity() -> f64; |
| } |
| |
| #[wasm_bindgen_test] |
| fn is_finite() { |
| assert!(Number::is_finite(&42.into())); |
| assert!(Number::is_finite(&42.1.into())); |
| assert!(!Number::is_finite(&"42".into())); |
| assert!(!Number::is_finite(&NAN.into())); |
| assert!(!Number::is_finite(&INFINITY.into())); |
| } |
| |
| #[wasm_bindgen_test] |
| fn is_integer() { |
| assert!(Number::is_integer(&42.into())); |
| assert!(!Number::is_integer(&42.1.into())); |
| } |
| |
| #[wasm_bindgen_test] |
| fn is_nan() { |
| assert!(Number::is_nan(&NAN.into())); |
| |
| assert!(!Number::is_nan(&JsValue::TRUE)); |
| assert!(!Number::is_nan(&JsValue::NULL)); |
| assert!(!Number::is_nan(&37.into())); |
| assert!(!Number::is_nan(&"37".into())); |
| assert!(!Number::is_nan(&"37.37".into())); |
| assert!(!Number::is_nan(&"".into())); |
| assert!(!Number::is_nan(&" ".into())); |
| |
| // These would all return true with the global isNaN() |
| assert!(!Number::is_nan(&"NaN".into())); |
| assert!(!Number::is_nan(&JsValue::UNDEFINED)); |
| assert!(!Number::is_nan(&"blabla".into())); |
| } |
| |
| #[wasm_bindgen_test] |
| fn is_safe_integer() { |
| assert_eq!(Number::is_safe_integer(&42.into()), true); |
| assert_eq!( |
| Number::is_safe_integer(&(Math::pow(2., 53.) - 1.).into()), |
| true |
| ); |
| assert_eq!(Number::is_safe_integer(&Math::pow(2., 53.).into()), false); |
| assert_eq!(Number::is_safe_integer(&"42".into()), false); |
| assert_eq!(Number::is_safe_integer(&42.1.into()), false); |
| assert_eq!(Number::is_safe_integer(&NAN.into()), false); |
| assert_eq!(Number::is_safe_integer(&INFINITY.into()), false); |
| } |
| |
| #[allow(deprecated)] |
| #[wasm_bindgen_test] |
| fn new() { |
| let n = Number::new(&JsValue::from(42)); |
| let v = JsValue::from(n); |
| assert!(v.is_object()); |
| assert_eq!(Number::from(v).value_of(), 42.); |
| } |
| |
| #[wasm_bindgen_test] |
| fn parse_int_float() { |
| assert_eq!(Number::parse_int("42", 10), 42.); |
| assert_eq!(Number::parse_int("42", 16), 66.); // 0x42 == 66 |
| assert!(Number::parse_int("invalid int", 10).is_nan()); |
| |
| assert_eq!(Number::parse_float("123456.789"), 123456.789); |
| assert!(Number::parse_float("invalid float").is_nan()); |
| } |
| |
| #[wasm_bindgen_test] |
| fn to_locale_string() { |
| let number = Number::from(1234.45); |
| assert_eq!(number.to_locale_string("en-US"), "1,234.45"); |
| // TODO: these tests seems to be system dependent, disable for now |
| // assert_eq!(wasm.to_locale_string(number, "de-DE"), "1,234.45"); |
| // assert_eq!(wasm.to_locale_string(number, "zh-Hans-CN-u-nu-hanidec"), "1,234.45"); |
| } |
| |
| #[wasm_bindgen_test] |
| fn to_precision() { |
| assert_eq!(Number::from(0.1).to_precision(3).unwrap(), "0.100"); |
| assert!(Number::from(10).to_precision(101).is_err()); |
| } |
| |
| #[wasm_bindgen_test] |
| fn to_string() { |
| assert_eq!(Number::from(42).to_string(10).unwrap(), "42"); |
| assert_eq!(Number::from(233).to_string(16).unwrap(), "e9"); |
| assert!(Number::from(100).to_string(100).is_err()); |
| } |
| |
| #[wasm_bindgen_test] |
| fn value_of() { |
| assert_eq!(Number::from(42).value_of(), 42.); |
| } |
| |
| #[wasm_bindgen_test] |
| fn to_fixed() { |
| assert_eq!(Number::from(123.456).to_fixed(2).unwrap(), "123.46"); |
| assert!(Number::from(10).to_fixed(101).is_err()); |
| } |
| |
| #[wasm_bindgen_test] |
| fn to_exponential() { |
| assert_eq!(Number::from(123456).to_exponential(2).unwrap(), "1.23e+5"); |
| assert!(Number::from(10).to_exponential(101).is_err()); |
| } |
| |
| #[allow(deprecated)] |
| #[wasm_bindgen_test] |
| fn number_inheritance() { |
| let n = Number::new(&JsValue::from(42)); |
| assert!(n.is_instance_of::<Number>()); |
| assert!(n.is_instance_of::<Object>()); |
| let _: &Object = n.as_ref(); |
| } |
| |
| #[wasm_bindgen_test] |
| fn consts() { |
| assert_eq!(const_epsilon(), Number::EPSILON, "EPSILON"); |
| assert_eq!( |
| const_max_safe_integer(), |
| Number::MAX_SAFE_INTEGER, |
| "MAX_SAFE_INTEGER" |
| ); |
| assert_eq!(const_max_value(), Number::MAX_VALUE, "MAX_VALUE"); |
| assert_eq!( |
| const_min_safe_integer(), |
| Number::MIN_SAFE_INTEGER, |
| "MIN_SAFE_INTEGER" |
| ); |
| assert_eq!(const_min_value(), Number::MIN_VALUE, "MIN_VALUE"); |
| assert_eq!( |
| const_negative_infinity(), |
| Number::NEGATIVE_INFINITY, |
| "NEGATIVE_INFINITY" |
| ); |
| assert_eq!( |
| const_positive_infinity(), |
| Number::POSITIVE_INFINITY, |
| "POSITIVE_INFINITY" |
| ); |
| } |