fix: Number 静态方法 ToNumber 转换、格式化方法精度/边界修复、常量属性描述符

This commit is contained in:
爱特每羊队
2026-06-27 22:46:48 +08:00
parent 14dc4d04c6
commit db8aa7025e
3 changed files with 155 additions and 39 deletions
@@ -0,0 +1,65 @@
use oxide_runtime_api::to_number;
use oxide_types::value::JsValue;
#[test]
fn is_nan_nan_returns_true() {
assert!(to_number(JsValue::float(f64::NAN)).is_nan());
}
#[test]
fn is_nan_number_123_returns_false() {
assert!(!to_number(JsValue::int(123)).is_nan());
}
#[test]
fn is_nan_undefined_returns_true() {
assert!(to_number(JsValue::undefined()).is_nan());
}
#[test]
fn is_finite_number_42_returns_true() {
assert!(to_number(JsValue::int(42)).is_finite());
}
#[test]
fn is_finite_infinity_returns_false() {
assert!(!to_number(JsValue::float(f64::INFINITY)).is_finite());
}
#[test]
fn is_integer_non_number_float_nan() {
let val = JsValue::undefined();
assert!(!val.is_int() && !val.is_double());
}
#[test]
fn is_integer_int_42() {
let val = JsValue::int(42);
assert!(val.is_int());
let n = to_number(val);
assert!(n.trunc() == n && n.is_finite());
}
#[test]
fn is_integer_double_fractional() {
let val = JsValue::float(42.5);
assert!(val.is_double());
let n = to_number(val);
assert!(!(n.trunc() == n && n.is_finite()));
}
#[test]
fn is_safe_integer_max_value() {
let val = JsValue::float(9007199254740991f64);
let n = to_number(val);
assert!(n.trunc() == n && n.is_finite());
assert!(n >= -9007199254740991i64 as f64 && n <= 9007199254740991i64 as f64);
}
#[test]
fn is_safe_integer_overflow() {
let val = JsValue::float(9007199254740992f64);
let n = to_number(val);
assert!(n.trunc() == n && n.is_finite());
assert!(!(n >= -9007199254740991i64 as f64 && n <= 9007199254740991i64 as f64));
}