feat: 支持 Date/Map/Set 的 new 运算符

This commit is contained in:
2026-06-08 03:42:47 +08:00
parent c66c3f0f50
commit e991e58297
6 changed files with 344 additions and 130 deletions
+116 -23
View File
@@ -11,35 +11,128 @@ fn eval(vm: &mut Vm, source: &str) -> Result<oxide_types::value::JsValue, String
vm.run(&module)
}
fn str_val(vm: &Vm, val: oxide_types::value::JsValue) -> String {
vm.kernel()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
}
// -- static methods --
#[test]
fn date_now_returns_number() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Date.now()").unwrap();
assert!(result.is_double());
assert!(result.as_double() > 0.0);
}
#[test]
fn date_now_increases() {
let mut vm = Vm::new();
let t1 = eval(&mut vm, "Date.now()").unwrap().as_double();
let t2 = eval(&mut vm, "Date.now()").unwrap().as_double();
assert!(t2 >= t1);
}
#[test]
fn date_parse_returns_nan() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Date.parse('invalid-date')").unwrap();
assert!(result.is_double());
assert!(result.as_double().is_nan());
let r = eval(&mut vm, "Date.now()").unwrap();
assert!(r.is_double() && r.as_double() > 0.0);
}
#[test]
fn date_parse_iso_format() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Date.parse('2020-01-15')").unwrap();
assert!(result.is_double());
assert!(!result.as_double().is_nan());
assert!(result.as_double() > 0.0);
let r = eval(&mut vm, "Date.parse('2020-01-15')").unwrap();
assert!(!r.as_double().is_nan());
}
#[test]
fn date_parse_invalid() {
let mut vm = Vm::new();
let r = eval(&mut vm, "Date.parse('nope')").unwrap();
assert!(r.as_double().is_nan());
}
// -- new Date() constructor via JS --
#[test]
fn date_new_multi_arg() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 0, 15).getFullYear()").unwrap();
assert_eq!(r.as_double(), 2020.0);
}
#[test]
fn date_new_epoch_zero() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(0).getTime()").unwrap();
assert_eq!(r.as_double(), 0.0);
}
#[test]
fn date_new_get_month() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 5, 15).getMonth()").unwrap();
assert_eq!(r.as_double(), 5.0);
}
#[test]
fn date_new_get_date() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 1, 29).getDate()").unwrap();
assert_eq!(r.as_double(), 29.0);
}
#[test]
fn date_new_get_hours_min_sec() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 0, 1, 12, 30, 45).getHours()").unwrap();
assert_eq!(r.as_double(), 12.0);
let r = eval(&mut vm, "new Date(2020, 0, 1, 12, 30, 45).getMinutes()").unwrap();
assert_eq!(r.as_double(), 30.0);
let r = eval(&mut vm, "new Date(2020, 0, 1, 12, 30, 45).getSeconds()").unwrap();
assert_eq!(r.as_double(), 45.0);
}
#[test]
fn date_set_time() {
let mut vm = Vm::new();
let r = eval(&mut vm, "var d = new Date(0); d.setTime(1000); d.getTime()").unwrap();
assert_eq!(r.as_double(), 1000.0);
}
#[test]
fn date_set_full_year() {
let mut vm = Vm::new();
let r = eval(
&mut vm,
"var d = new Date(2020, 0, 1); d.setFullYear(2025); d.getFullYear()",
)
.unwrap();
assert_eq!(r.as_double(), 2025.0);
}
#[test]
fn date_value_of() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 0, 1).valueOf()").unwrap();
assert!(r.as_double() > 0.0);
}
#[test]
fn date_to_iso_string() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 0, 1, 0, 0, 0).toISOString()").unwrap();
let s = str_val(&vm, r);
assert!(s.starts_with("2020-01-01"), "got: {s}");
}
#[test]
fn date_to_json() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(2020, 0, 1).toJSON()").unwrap();
let s = str_val(&vm, r);
assert!(s.starts_with("2020-01-01"), "got: {s}");
}
#[test]
fn date_to_string_not_empty() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(0).toString()").unwrap();
assert!(r.is_string());
}
#[test]
fn date_to_utc_string_not_empty() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Date(0).toUTCString()").unwrap();
assert!(r.is_string());
}