feat: Temporal.PlainTime until/since 差值计算

This commit is contained in:
2026-08-17 02:40:21 +08:00
parent 9657cce311
commit 46cfc2724a
3 changed files with 84 additions and 0 deletions
@@ -692,6 +692,8 @@ pub fn bind_temporal(core: &Arc<KernelCore>, session: &KernelSession, global: &m
),
("valueOf", oxide_builtins::temporal::plain_time_value_of::<crate::vm::Vm> as *const (), 0),
("equals", oxide_builtins::temporal::plain_time_equals::<crate::vm::Vm> as *const (), 1),
("until", oxide_builtins::temporal::plain_time_until::<crate::vm::Vm> as *const (), 1),
("since", oxide_builtins::temporal::plain_time_since::<crate::vm::Vm> as *const (), 1),
],
);
bind_well_known_data_property(
@@ -668,6 +668,44 @@ fn plain_time_compare_epoch_order() {
assert_eq!(num(&mut vm, "Temporal.PlainTime.compare('23:59', '00:00')"), 1.0);
}
#[test]
fn plain_time_until_since_normal() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Temporal.PlainTime(12, 30).until(new Temporal.PlainTime(13, 30)).toString()").unwrap();
assert_eq!(str_val(&vm, r), "PT1H");
let r = eval(&mut vm, "new Temporal.PlainTime(13, 30).since(new Temporal.PlainTime(12, 30)).toString()").unwrap();
assert_eq!(str_val(&vm, r), "PT1H");
let r = eval(
&mut vm,
"new Temporal.PlainTime(12, 30).until(new Temporal.PlainTime(13, 30, 5, 500)).toString()",
)
.unwrap();
assert_eq!(str_val(&vm, r), "PT1H5.5S");
}
#[test]
fn plain_time_until_since_options_and_direction() {
let mut vm = Vm::new();
let r = eval(
&mut vm,
"new Temporal.PlainTime(12, 30).until(new Temporal.PlainTime(13, 35), { largestUnit: 'minute' }).toString()",
)
.unwrap();
assert_eq!(str_val(&vm, r), "PT65M");
let r = eval(
&mut vm,
"new Temporal.PlainTime(12, 30).since(new Temporal.PlainTime(13, 35), { largestUnit: 'minute' }).toString()",
)
.unwrap();
assert_eq!(str_val(&vm, r), "-PT65M");
let r = eval(
&mut vm,
"new Temporal.PlainTime(12, 30).until(new Temporal.PlainTime(13, 30), { smallestUnit: 'hour' }).toString()",
)
.unwrap();
assert_eq!(str_val(&vm, r), "PT1H");
}
// -- Temporal.PlainDateTime --
#[test]