From e4899d23788b4d16814ff4a64977785feed1c69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Wed, 29 May 2024 12:11:59 +0200 Subject: [PATCH] Allow alternative era names Temporal doesn't specify concrete era names, so tests shouldn't assert for example that the era code of the current Gregorian era is `"ce"`. We still want to validate the era names somehow however, so allow alternative era names using the era codes from the "Intl era and monthCode" proposal. --- harness/temporalHelpers.js | 107 +++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/harness/temporalHelpers.js b/harness/temporalHelpers.js index d7860f3573..441904d03c 100644 --- a/harness/temporalHelpers.js +++ b/harness/temporalHelpers.js @@ -54,6 +54,95 @@ var TemporalHelpers = { { month: 12, monthCode: "M12", daysInMonth: 31 } ], + /* + * List of known calendar eras and their possible aliases. + * + * https://tc39.es/proposal-intl-era-monthcode/#table-eras + */ + CalendarEras: { + buddhist: [ + { era: "buddhist", aliases: ["be"] }, + ], + chinese: [ + { era: "chinese" }, + ], + coptic: [ + { era: "coptic" }, + { era: "coptic-inverse" }, + ], + dangi: [ + { era: "dangi" }, + ], + ethiopic: [ + { era: "ethiopic", aliases: ["incar"] }, + { era: "ethioaa", aliases: ["ethiopic-amete-alem", "mundi"] }, + ], + ethioaa: [ + { era: "ethioaa", aliases: ["ethiopic-amete-alem", "mundi"] }, + ], + gregory: [ + { era: "gregory", aliases: ["ce", "ad"] }, + { era: "gregory-inverse", aliases: ["bc", "bce"] }, + ], + hebrew: [ + { era: "hebrew", aliases: ["am"] }, + ], + indian: [ + { era: "indian", aliases: ["saka"] }, + ], + islamic: [ + { era: "islamic", aliases: ["ah"] }, + ], + "islamic-civil": [ + { era: "islamic-civil", aliases: ["islamicc", "ah"] }, + ], + "islamic-rgsa": [ + { era: "islamic-rgsa", aliases: ["ah"] }, + ], + "islamic-tbla": [ + { era: "islamic-tbla", aliases: ["ah"] }, + ], + "islamic-umalqura": [ + { era: "islamic-umalqura", aliases: ["ah"] }, + ], + japanese: [ + { era: "heisei" }, + { era: "japanese", aliases: ["gregory", "ad", "ce"] }, + { era: "japanese-inverse", aliases: ["gregory-inverse", "bc", "bce"] }, + { era: "meiji" }, + { era: "reiwa" }, + { era: "showa" }, + { era: "taisho" }, + ], + persian: [ + { era: "persian", aliases: ["ap"] }, + ], + roc: [ + { era: "roc", aliases: ["minguo"] }, + { era: "roc-inverse", aliases: ["before-roc"] }, + ], + }, + + /* + * Return the canonical era code. + */ + canonicalizeEraInCalendar(temporalObject, eraName) { + if (eraName === undefined) { + return undefined; + } + assert.sameValue(typeof eraName, "string"); + + let calendarId = temporalObject.calendarId; + assert(Object.hasOwn(TemporalHelpers.CalendarEras, calendarId)); + + for (let {era, aliases = []} of TemporalHelpers.CalendarEras[calendarId]) { + if (era === eraName || aliases.includes(eraName)) { + return era; + } + } + throw new Test262Error(`Unsupported era name: ${eraName}`); + }, + /* * assertDuration(duration, years, ..., nanoseconds[, description]): * @@ -132,7 +221,11 @@ var TemporalHelpers = { assertPlainDate(date, year, month, monthCode, day, description = "", era = undefined, eraYear = undefined) { const prefix = description ? `${description}: ` : ""; assert(date instanceof Temporal.PlainDate, `${prefix}instanceof`); - assert.sameValue(date.era, era, `${prefix}era result:`); + assert.sameValue( + TemporalHelpers.canonicalizeEraInCalendar(date, date.era), + TemporalHelpers.canonicalizeEraInCalendar(date, era), + `${prefix}era result:` + ); assert.sameValue(date.eraYear, eraYear, `${prefix}eraYear result:`); assert.sameValue(date.year, year, `${prefix}year result:`); assert.sameValue(date.month, month, `${prefix}month result:`); @@ -151,7 +244,11 @@ var TemporalHelpers = { assertPlainDateTime(datetime, year, month, monthCode, day, hour, minute, second, millisecond, microsecond, nanosecond, description = "", era = undefined, eraYear = undefined) { const prefix = description ? `${description}: ` : ""; assert(datetime instanceof Temporal.PlainDateTime, `${prefix}instanceof`); - assert.sameValue(datetime.era, era, `${prefix}era result:`); + assert.sameValue( + TemporalHelpers.canonicalizeEraInCalendar(datetime, datetime.era), + TemporalHelpers.canonicalizeEraInCalendar(datetime, era), + `${prefix}era result:` + ); assert.sameValue(datetime.eraYear, eraYear, `${prefix}eraYear result:`); assert.sameValue(datetime.year, year, `${prefix}year result:`); assert.sameValue(datetime.month, month, `${prefix}month result:`); @@ -242,7 +339,11 @@ var TemporalHelpers = { assertPlainYearMonth(yearMonth, year, month, monthCode, description = "", era = undefined, eraYear = undefined, referenceISODay = 1) { const prefix = description ? `${description}: ` : ""; assert(yearMonth instanceof Temporal.PlainYearMonth, `${prefix}instanceof`); - assert.sameValue(yearMonth.era, era, `${prefix}era result:`); + assert.sameValue( + TemporalHelpers.canonicalizeEraInCalendar(yearMonth, yearMonth.era), + TemporalHelpers.canonicalizeEraInCalendar(yearMonth, era), + `${prefix}era result:` + ); assert.sameValue(yearMonth.eraYear, eraYear, `${prefix}eraYear result:`); assert.sameValue(yearMonth.year, year, `${prefix}year result:`); assert.sameValue(yearMonth.month, month, `${prefix}month result:`);