feat: 新增 to_integer_or_infinity/to_length/same_value_zero 三个 ES 抽象操作辅助函数,修复 objects_keys/create/defineProperty/assign/getOwnPropertyNames 五个方法的 TypeError 处理

This commit is contained in:
爱特每羊队
2026-06-27 14:42:16 +08:00
parent 78ecac5911
commit 5f8123f1f3
6 changed files with 270 additions and 36 deletions
@@ -0,0 +1,82 @@
use oxide_runtime_api::{same_value_zero, to_integer_or_infinity, to_length};
use oxide_types::value::JsValue;
#[test]
fn test_to_integer_or_infinity_nan() {
assert_eq!(to_integer_or_infinity(JsValue::float(f64::NAN)), 0.0);
}
#[test]
fn test_to_integer_or_infinity_zero() {
assert_eq!(to_integer_or_infinity(JsValue::float(0.0)), 0.0);
assert_eq!(to_integer_or_infinity(JsValue::float(-0.0)), 0.0);
}
#[test]
fn test_to_integer_or_infinity_infinity() {
assert_eq!(to_integer_or_infinity(JsValue::float(f64::INFINITY)), f64::INFINITY);
assert_eq!(to_integer_or_infinity(JsValue::float(f64::NEG_INFINITY)), f64::NEG_INFINITY);
}
#[test]
fn test_to_integer_or_infinity_truncation() {
assert_eq!(to_integer_or_infinity(JsValue::float(3.7)), 3.0);
assert_eq!(to_integer_or_infinity(JsValue::float(-3.7)), -3.0);
}
#[test]
fn test_to_integer_or_infinity_int() {
assert_eq!(to_integer_or_infinity(JsValue::int(42)), 42.0);
}
#[test]
fn test_to_length_nan() {
assert_eq!(to_length(JsValue::float(f64::NAN)), 0);
}
#[test]
fn test_to_length_negative() {
assert_eq!(to_length(JsValue::float(-1.0)), 0);
assert_eq!(to_length(JsValue::int(-42)), 0);
}
#[test]
fn test_to_length_positive() {
assert_eq!(to_length(JsValue::float(100.0)), 100);
assert_eq!(to_length(JsValue::int(999)), 999);
}
#[test]
fn test_to_length_overflow_clamp() {
assert_eq!(to_length(JsValue::float(1e100)), 9_007_199_254_740_991);
}
#[test]
fn test_same_value_zero_nan() {
assert!(same_value_zero(JsValue::float(f64::NAN), JsValue::float(f64::NAN)));
}
#[test]
fn test_same_value_zero_positive_and_negative_zero() {
assert!(same_value_zero(JsValue::float(0.0), JsValue::float(-0.0)));
assert!(same_value_zero(JsValue::float(-0.0), JsValue::float(0.0)));
}
#[test]
fn test_same_value_zero_equal_numbers() {
assert!(same_value_zero(JsValue::float(42.0), JsValue::float(42.0)));
assert!(same_value_zero(JsValue::int(42), JsValue::int(42)));
assert!(same_value_zero(JsValue::int(42), JsValue::float(42.0)));
}
#[test]
fn test_same_value_zero_different_numbers() {
assert!(!same_value_zero(JsValue::float(1.0), JsValue::float(2.0)));
}
#[test]
fn test_same_value_zero_null_undefined() {
assert!(same_value_zero(JsValue::null(), JsValue::null()));
assert!(same_value_zero(JsValue::undefined(), JsValue::undefined()));
assert!(!same_value_zero(JsValue::null(), JsValue::undefined()));
}