Number.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. use std::f64::{INFINITY, NAN};
  2. use js_sys::*;
  3. use wasm_bindgen::prelude::*;
  4. use wasm_bindgen::JsCast;
  5. use wasm_bindgen_test::*;
  6. #[wasm_bindgen(module = "tests/wasm/Number.js")]
  7. extern "C" {
  8. fn const_epsilon() -> f64;
  9. fn const_max_safe_integer() -> f64;
  10. fn const_max_value() -> f64;
  11. fn const_min_safe_integer() -> f64;
  12. fn const_min_value() -> f64;
  13. fn const_negative_infinity() -> f64;
  14. fn const_positive_infinity() -> f64;
  15. }
  16. #[wasm_bindgen_test]
  17. fn is_finite() {
  18. assert!(Number::is_finite(&42.into()));
  19. assert!(Number::is_finite(&42.1.into()));
  20. assert!(!Number::is_finite(&"42".into()));
  21. assert!(!Number::is_finite(&NAN.into()));
  22. assert!(!Number::is_finite(&INFINITY.into()));
  23. }
  24. #[wasm_bindgen_test]
  25. fn is_integer() {
  26. assert!(Number::is_integer(&42.into()));
  27. assert!(!Number::is_integer(&42.1.into()));
  28. }
  29. #[wasm_bindgen_test]
  30. fn is_nan() {
  31. assert!(Number::is_nan(&NAN.into()));
  32. assert!(!Number::is_nan(&JsValue::TRUE));
  33. assert!(!Number::is_nan(&JsValue::NULL));
  34. assert!(!Number::is_nan(&37.into()));
  35. assert!(!Number::is_nan(&"37".into()));
  36. assert!(!Number::is_nan(&"37.37".into()));
  37. assert!(!Number::is_nan(&"".into()));
  38. assert!(!Number::is_nan(&" ".into()));
  39. // These would all return true with the global isNaN()
  40. assert!(!Number::is_nan(&"NaN".into()));
  41. assert!(!Number::is_nan(&JsValue::UNDEFINED));
  42. assert!(!Number::is_nan(&"blabla".into()));
  43. }
  44. #[wasm_bindgen_test]
  45. fn is_safe_integer() {
  46. assert_eq!(Number::is_safe_integer(&42.into()), true);
  47. assert_eq!(
  48. Number::is_safe_integer(&(Math::pow(2., 53.) - 1.).into()),
  49. true
  50. );
  51. assert_eq!(Number::is_safe_integer(&Math::pow(2., 53.).into()), false);
  52. assert_eq!(Number::is_safe_integer(&"42".into()), false);
  53. assert_eq!(Number::is_safe_integer(&42.1.into()), false);
  54. assert_eq!(Number::is_safe_integer(&NAN.into()), false);
  55. assert_eq!(Number::is_safe_integer(&INFINITY.into()), false);
  56. }
  57. #[allow(deprecated)]
  58. #[wasm_bindgen_test]
  59. fn new() {
  60. let n = Number::new(&JsValue::from(42));
  61. let v = JsValue::from(n);
  62. assert!(v.is_object());
  63. assert_eq!(Number::from(v).value_of(), 42.);
  64. }
  65. #[wasm_bindgen_test]
  66. fn parse_int_float() {
  67. assert_eq!(Number::parse_int("42", 10), 42.);
  68. assert_eq!(Number::parse_int("42", 16), 66.); // 0x42 == 66
  69. assert!(Number::parse_int("invalid int", 10).is_nan());
  70. assert_eq!(Number::parse_float("123456.789"), 123456.789);
  71. assert!(Number::parse_float("invalid float").is_nan());
  72. }
  73. #[wasm_bindgen_test]
  74. fn to_locale_string() {
  75. let number = Number::from(1234.45);
  76. assert_eq!(number.to_locale_string("en-US"), "1,234.45");
  77. // TODO: these tests seems to be system dependent, disable for now
  78. // assert_eq!(wasm.to_locale_string(number, "de-DE"), "1,234.45");
  79. // assert_eq!(wasm.to_locale_string(number, "zh-Hans-CN-u-nu-hanidec"), "1,234.45");
  80. }
  81. #[wasm_bindgen_test]
  82. fn to_precision() {
  83. assert_eq!(Number::from(0.1).to_precision(3).unwrap(), "0.100");
  84. assert!(Number::from(10).to_precision(101).is_err());
  85. }
  86. #[wasm_bindgen_test]
  87. fn to_string() {
  88. assert_eq!(Number::from(42).to_string(10).unwrap(), "42");
  89. assert_eq!(Number::from(233).to_string(16).unwrap(), "e9");
  90. assert!(Number::from(100).to_string(100).is_err());
  91. }
  92. #[wasm_bindgen_test]
  93. fn value_of() {
  94. assert_eq!(Number::from(42).value_of(), 42.);
  95. }
  96. #[wasm_bindgen_test]
  97. fn to_fixed() {
  98. assert_eq!(Number::from(123.456).to_fixed(2).unwrap(), "123.46");
  99. assert!(Number::from(10).to_fixed(101).is_err());
  100. }
  101. #[wasm_bindgen_test]
  102. fn to_exponential() {
  103. assert_eq!(Number::from(123456).to_exponential(2).unwrap(), "1.23e+5");
  104. assert!(Number::from(10).to_exponential(101).is_err());
  105. }
  106. #[allow(deprecated)]
  107. #[wasm_bindgen_test]
  108. fn number_inheritance() {
  109. let n = Number::new(&JsValue::from(42));
  110. assert!(n.is_instance_of::<Number>());
  111. assert!(n.is_instance_of::<Object>());
  112. let _: &Object = n.as_ref();
  113. }
  114. #[wasm_bindgen_test]
  115. fn consts() {
  116. assert_eq!(const_epsilon(), Number::EPSILON, "EPSILON");
  117. assert_eq!(
  118. const_max_safe_integer(),
  119. Number::MAX_SAFE_INTEGER,
  120. "MAX_SAFE_INTEGER"
  121. );
  122. assert_eq!(const_max_value(), Number::MAX_VALUE, "MAX_VALUE");
  123. assert_eq!(
  124. const_min_safe_integer(),
  125. Number::MIN_SAFE_INTEGER,
  126. "MIN_SAFE_INTEGER"
  127. );
  128. assert_eq!(const_min_value(), Number::MIN_VALUE, "MIN_VALUE");
  129. assert_eq!(
  130. const_negative_infinity(),
  131. Number::NEGATIVE_INFINITY,
  132. "NEGATIVE_INFINITY"
  133. );
  134. assert_eq!(
  135. const_positive_infinity(),
  136. Number::POSITIVE_INFINITY,
  137. "POSITIVE_INFINITY"
  138. );
  139. }