feat: Temporal.PlainTime equals/compare 比较语义

This commit is contained in:
2026-08-17 02:34:30 +08:00
parent 34eddb9c7f
commit 9657cce311
3 changed files with 98 additions and 1 deletions
@@ -624,7 +624,10 @@ pub fn bind_temporal(core: &Arc<KernelCore>, session: &KernelSession, global: &m
world,
plain_time_ctor,
core,
&[("from", oxide_builtins::temporal::plain_time_from::<crate::vm::Vm> as *const (), 1)],
&[
("from", oxide_builtins::temporal::plain_time_from::<crate::vm::Vm> as *const (), 1),
("compare", oxide_builtins::temporal::plain_time_compare::<crate::vm::Vm> as *const (), 2),
],
);
let plain_time_proto_ptr = world.plain_time_proto.as_ptr() as *mut JsObject;
@@ -688,6 +691,7 @@ pub fn bind_temporal(core: &Arc<KernelCore>, session: &KernelSession, global: &m
0,
),
("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),
],
);
bind_well_known_data_property(
@@ -617,6 +617,57 @@ fn plain_time_range_validation() {
assert_eq!(str_val(&vm, r), "RangeError");
}
#[test]
fn plain_time_equals_same_and_different_fields() {
let mut vm = Vm::new();
let r = eval(&mut vm, "new Temporal.PlainTime(12, 30, 5).equals(new Temporal.PlainTime(12, 30, 5))").unwrap();
assert!(r.as_bool());
let r = eval(&mut vm, "new Temporal.PlainTime(12, 30, 5).equals(new Temporal.PlainTime(12, 30, 6))").unwrap();
assert!(!r.as_bool());
let r = eval(&mut vm, "new Temporal.PlainTime(12, 30, 5).equals('12:30:05')").unwrap();
assert!(r.as_bool());
}
#[test]
fn plain_time_equals_invalid_argument_throws() {
let mut vm = Vm::new();
let r = eval(&mut vm, "try { new Temporal.PlainTime(12).equals(42) } catch (e) { e.constructor.name }").unwrap();
assert_eq!(str_val(&vm, r), "TypeError");
let r = eval(
&mut vm,
"try { Temporal.PlainTime.prototype.equals.call({}) } catch (e) { e.constructor.name }",
)
.unwrap();
assert_eq!(str_val(&vm, r), "TypeError");
}
#[test]
fn plain_time_compare_epoch_order() {
let mut vm = Vm::new();
assert_eq!(
num(
&mut vm,
"Temporal.PlainTime.compare(new Temporal.PlainTime(12, 30), new Temporal.PlainTime(13, 30))"
),
-1.0
);
assert_eq!(
num(
&mut vm,
"Temporal.PlainTime.compare(new Temporal.PlainTime(12, 30), new Temporal.PlainTime(12, 30))"
),
0.0
);
assert_eq!(
num(
&mut vm,
"Temporal.PlainTime.compare(new Temporal.PlainTime(13, 30), new Temporal.PlainTime(12, 30))"
),
1.0
);
assert_eq!(num(&mut vm, "Temporal.PlainTime.compare('23:59', '00:00')"), 1.0);
}
// -- Temporal.PlainDateTime --
#[test]