feat: PlainDate toString 支持日历选项与六位年号

This commit is contained in:
2026-10-15 17:08:08 +00:00
parent 5d4ed8908c
commit 6bc85aa9b1
5 changed files with 123 additions and 42 deletions
@@ -513,6 +513,64 @@ fn plain_date_to_string() {
assert_eq!(str_val(&vm, r), "2024-01-05");
}
#[test]
fn plain_date_to_string_honors_calendar_name() {
let mut vm = Vm::new();
let r = eval(
&mut vm,
"(() => {
const d = new Temporal.PlainDate(2000, 5, 2);
const auto = d.toString({ calendarName: 'auto' });
const always = d.toString({ calendarName: 'always' });
const critical = d.toString({ calendarName: 'critical' });
const never = d.toString({ calendarName: 'never' });
const badValue = (() => { try { d.toString({ calendarName: 'ALWAYS' }); return false; }
catch (e) { return e instanceof RangeError; } })();
const badOptions = (() => { try { d.toString(null); return false; }
catch (e) { return e instanceof TypeError; } })();
return [auto, always, critical, never, badValue, badOptions].join('|');
})()",
)
.unwrap();
assert_eq!(
str_val(&vm, r),
"2000-05-02|2000-05-02[u-ca=iso8601]|2000-05-02[!u-ca=iso8601]|2000-05-02|true|true"
);
}
#[test]
fn plain_date_serializes_extended_years() {
let mut vm = Vm::new();
let r = eval(
&mut vm,
"[new Temporal.PlainDate(-100000, 12, 3).toString(),
new Temporal.PlainDate(-10000, 4, 5).toString(),
new Temporal.PlainDate(-1, 8, 7).toString(),
new Temporal.PlainDate(0, 6, 5).toString(),
new Temporal.PlainDate(10000, 6, 7).toString(),
new Temporal.PlainDate(100000, 8, 9).toJSON()].join('|')",
)
.unwrap();
assert_eq!(
str_val(&vm, r),
"-100000-12-03|-010000-04-05|-000001-08-07|0000-06-05|+010000-06-07|+100000-08-09"
);
}
#[test]
fn plain_date_constructor_accepts_cldr_calendar_aliases() {
let mut vm = Vm::new();
// CLDR 别名归一到规范小写 ID:ethiopic-amete-alem → ethioaa、islamicc → islamic-civil。
let r = eval(
&mut vm,
"Temporal.PlainDate.from({ year: 2000, month: 5, day: 2, calendar: 'ethiopic-amete-alem' }).calendarId + ',' +
Temporal.PlainDate.from({ year: 2000, month: 5, day: 2, calendar: 'islamicc' }).calendarId + ',' +
Temporal.PlainDate.from({ year: 2000, month: 5, day: 2, calendar: 'ETHIOpic-TANA-alem' }).calendarId",
)
.unwrap();
assert_eq!(str_val(&vm, r), "ethioaa,islamic-civil,ethiopic");
}
#[test]
fn plain_date_requires_new() {
let mut vm = Vm::new();
@@ -3243,7 +3301,7 @@ fn plain_month_day_to_plain_date_matrix() {
.unwrap();
assert_eq!(
str_val(&vm, r),
"2002-01-22|TypeError|TypeError|0012-01-22|RangeError|2020-02-29|2023-02-28|2020-02-29|-271821-04-19|RangeError|275760-09-13|RangeError|iso8601|TypeError|2002-01-22"
"2002-01-22|TypeError|TypeError|0012-01-22|RangeError|2020-02-29|2023-02-28|2020-02-29|-271821-04-19|RangeError|+275760-09-13|RangeError|iso8601|TypeError|2002-01-22"
);
}
@@ -3743,7 +3801,7 @@ fn plain_year_month_to_plain_date_matrix() {
.unwrap();
assert_eq!(
str_val(&vm, r),
"2002-01-22|TypeError|TypeError|TypeError|TypeError|2023-02-28|1998-06-30|2000-05-01|2000-05-01|-271821-04-19|RangeError|275760-09-13|RangeError|RangeError"
"2002-01-22|TypeError|TypeError|TypeError|TypeError|2023-02-28|1998-06-30|2000-05-01|2000-05-01|-271821-04-19|RangeError|+275760-09-13|RangeError|RangeError"
);
}