Validate required methods of Temporal Calendar protocol

Checking whether an object implements the Calendar protocol is now done by
means of HasProperty operations for each of the required methods unless
the object already has the Calendar brand.

Discussion:
https://github.com/tc39/proposal-temporal/issues/2104#issuecomment-1409549753

Corresponding normative PR:
https://github.com/tc39/proposal-temporal/pull/2485
This commit is contained in:
Philip Chimento 2023-01-27 18:30:11 -08:00 committed by Philip Chimento
parent d6a24fe906
commit 33865c5339
190 changed files with 3422 additions and 303 deletions

View File

@ -1464,6 +1464,34 @@ var TemporalHelpers = {
* objectName is used in the log.
*/
calendarObserver(calls, objectName, methodOverrides = {}) {
function removeExtraHasPropertyChecks(objectName, calls) {
// Inserting the tracking calendar into the return values of methods
// that we chain up into the ISO calendar for, causes extra HasProperty
// checks, which we observe. This removes them so that we don't leak
// implementation details of the helper into the test code.
assert.sameValue(calls.pop(), `has ${objectName}.yearOfWeek`);
assert.sameValue(calls.pop(), `has ${objectName}.yearMonthFromFields`);
assert.sameValue(calls.pop(), `has ${objectName}.year`);
assert.sameValue(calls.pop(), `has ${objectName}.weekOfYear`);
assert.sameValue(calls.pop(), `has ${objectName}.monthsInYear`);
assert.sameValue(calls.pop(), `has ${objectName}.monthDayFromFields`);
assert.sameValue(calls.pop(), `has ${objectName}.monthCode`);
assert.sameValue(calls.pop(), `has ${objectName}.month`);
assert.sameValue(calls.pop(), `has ${objectName}.mergeFields`);
assert.sameValue(calls.pop(), `has ${objectName}.inLeapYear`);
assert.sameValue(calls.pop(), `has ${objectName}.id`);
assert.sameValue(calls.pop(), `has ${objectName}.fields`);
assert.sameValue(calls.pop(), `has ${objectName}.daysInYear`);
assert.sameValue(calls.pop(), `has ${objectName}.daysInWeek`);
assert.sameValue(calls.pop(), `has ${objectName}.daysInMonth`);
assert.sameValue(calls.pop(), `has ${objectName}.dayOfYear`);
assert.sameValue(calls.pop(), `has ${objectName}.dayOfWeek`);
assert.sameValue(calls.pop(), `has ${objectName}.day`);
assert.sameValue(calls.pop(), `has ${objectName}.dateUntil`);
assert.sameValue(calls.pop(), `has ${objectName}.dateFromFields`);
assert.sameValue(calls.pop(), `has ${objectName}.dateAdd`);
}
const iso8601 = new Temporal.Calendar("iso8601");
const trackingMethods = {
dateFromFields(...args) {
@ -1475,7 +1503,9 @@ var TemporalHelpers = {
const originalResult = iso8601.dateFromFields(...args);
// Replace the calendar in the result with the call-tracking calendar
const {isoYear, isoMonth, isoDay} = originalResult.getISOFields();
return new Temporal.PlainDate(isoYear, isoMonth, isoDay, this);
const result = new Temporal.PlainDate(isoYear, isoMonth, isoDay, this);
removeExtraHasPropertyChecks(objectName, calls);
return result;
},
yearMonthFromFields(...args) {
calls.push(`call ${objectName}.yearMonthFromFields`);
@ -1486,7 +1516,9 @@ var TemporalHelpers = {
const originalResult = iso8601.yearMonthFromFields(...args);
// Replace the calendar in the result with the call-tracking calendar
const {isoYear, isoMonth, isoDay} = originalResult.getISOFields();
return new Temporal.PlainYearMonth(isoYear, isoMonth, this, isoDay);
const result = new Temporal.PlainYearMonth(isoYear, isoMonth, this, isoDay);
removeExtraHasPropertyChecks(objectName, calls);
return result;
},
monthDayFromFields(...args) {
calls.push(`call ${objectName}.monthDayFromFields`);
@ -1497,7 +1529,9 @@ var TemporalHelpers = {
const originalResult = iso8601.monthDayFromFields(...args);
// Replace the calendar in the result with the call-tracking calendar
const {isoYear, isoMonth, isoDay} = originalResult.getISOFields();
return new Temporal.PlainMonthDay(isoMonth, isoDay, this, isoYear);
const result = new Temporal.PlainMonthDay(isoMonth, isoDay, this, isoYear);
removeExtraHasPropertyChecks(objectName, calls);
return result;
},
dateAdd(...args) {
calls.push(`call ${objectName}.dateAdd`);
@ -1507,12 +1541,34 @@ var TemporalHelpers = {
}
const originalResult = iso8601.dateAdd(...args);
const {isoYear, isoMonth, isoDay} = originalResult.getISOFields();
return new Temporal.PlainDate(isoYear, isoMonth, isoDay, this);
const result = new Temporal.PlainDate(isoYear, isoMonth, isoDay, this);
removeExtraHasPropertyChecks(objectName, calls);
return result;
},
id: "iso8601",
};
// Automatically generate the other methods that don't need any custom code
["toString", "dateUntil", "era", "eraYear", "year", "month", "monthCode", "day", "daysInMonth", "fields", "mergeFields"].forEach((methodName) => {
[
"dateUntil",
"day",
"dayOfWeek",
"dayOfYear",
"daysInMonth",
"daysInWeek",
"daysInYear",
"era",
"eraYear",
"fields",
"inLeapYear",
"mergeFields",
"month",
"monthCode",
"monthsInYear",
"toString",
"weekOfYear",
"year",
"yearOfWeek",
].forEach((methodName) => {
trackingMethods[methodName] = function (...args) {
calls.push(`call ${formatPropertyName(methodName, objectName)}`);
if (methodName in methodOverrides) {

View File

@ -3,9 +3,33 @@
/*---
esid: sec-temporal.calendar.from
description: Converting a plain object to Temporal.Calendar gives the same object
description: >
Converting an object implementing the Calendar protocol to Temporal.Calendar
gives the same object
features: [Temporal]
---*/
const custom = { id: "custom-calendar" };
const custom = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "custom-calendar",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
assert.sameValue(Temporal.Calendar.from(custom), custom);

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -24,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -9,8 +9,29 @@ features: [Temporal]
---*/
const expected = [
// ToTemporalDate → GetTemporalCalendarWithISODefault
// ToTemporalDate → GetTemporalCalendarSlotValueWithISODefault
"get date.calendar",
"has date.calendar.dateAdd",
"has date.calendar.dateFromFields",
"has date.calendar.dateUntil",
"has date.calendar.day",
"has date.calendar.dayOfWeek",
"has date.calendar.dayOfYear",
"has date.calendar.daysInMonth",
"has date.calendar.daysInWeek",
"has date.calendar.daysInYear",
"has date.calendar.fields",
"has date.calendar.id",
"has date.calendar.inLeapYear",
"has date.calendar.mergeFields",
"has date.calendar.month",
"has date.calendar.monthCode",
"has date.calendar.monthDayFromFields",
"has date.calendar.monthsInYear",
"has date.calendar.weekOfYear",
"has date.calendar.year",
"has date.calendar.yearMonthFromFields",
"has date.calendar.yearOfWeek",
// ToTemporalDate → CalendarFields
"get date.calendar.fields",
"call date.calendar.fields",

View File

@ -18,7 +18,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -29,8 +28,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -9,8 +9,29 @@ features: [Temporal]
---*/
const expected = [
// ToTemporalDate 1 → GetTemporalCalendarWithISODefault
// ToTemporalDate 1 → GetTemporalCalendarSlotValueWithISODefault
"get one.calendar",
"has one.calendar.dateAdd",
"has one.calendar.dateFromFields",
"has one.calendar.dateUntil",
"has one.calendar.day",
"has one.calendar.dayOfWeek",
"has one.calendar.dayOfYear",
"has one.calendar.daysInMonth",
"has one.calendar.daysInWeek",
"has one.calendar.daysInYear",
"has one.calendar.fields",
"has one.calendar.id",
"has one.calendar.inLeapYear",
"has one.calendar.mergeFields",
"has one.calendar.month",
"has one.calendar.monthCode",
"has one.calendar.monthDayFromFields",
"has one.calendar.monthsInYear",
"has one.calendar.weekOfYear",
"has one.calendar.year",
"has one.calendar.yearMonthFromFields",
"has one.calendar.yearOfWeek",
// ToTemporalDate 1 → CalendarFields
"get one.calendar.fields",
"call one.calendar.fields",
@ -30,8 +51,29 @@ const expected = [
// ToTemporalDate 1 → CalendarDateFromFields
"get one.calendar.dateFromFields",
"call one.calendar.dateFromFields",
// ToTemporalDate 2 → GetTemporalCalendarWithISODefault
// ToTemporalDate 2 → GetTemporalCalendarSlotValueWithISODefault
"get two.calendar",
"has two.calendar.dateAdd",
"has two.calendar.dateFromFields",
"has two.calendar.dateUntil",
"has two.calendar.day",
"has two.calendar.dayOfWeek",
"has two.calendar.dayOfYear",
"has two.calendar.daysInMonth",
"has two.calendar.daysInWeek",
"has two.calendar.daysInYear",
"has two.calendar.fields",
"has two.calendar.id",
"has two.calendar.inLeapYear",
"has two.calendar.mergeFields",
"has two.calendar.month",
"has two.calendar.monthCode",
"has two.calendar.monthDayFromFields",
"has two.calendar.monthsInYear",
"has two.calendar.weekOfYear",
"has two.calendar.year",
"has two.calendar.yearMonthFromFields",
"has two.calendar.yearOfWeek",
// ToTemporalDate 2 → CalendarFields
"get two.calendar.fields",
"call two.calendar.fields",

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -88,6 +88,27 @@ actual.splice(0); // clear
const expectedOpsForPlainRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",
@ -153,6 +174,27 @@ actual.splice(0); // clear
const expectedOpsForZonedRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",

View File

@ -71,6 +71,27 @@ actual.splice(0); // clear
const expectedOpsForPlainRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
// PrepareTemporalFields
@ -135,6 +156,27 @@ actual.splice(0); // clear
const expectedOpsForZonedRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
// PrepareTemporalFields

View File

@ -18,7 +18,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -28,7 +27,8 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.PlainDate, "Temporal.PlainDate, object"],
[Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"],
[Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"],

View File

@ -48,6 +48,27 @@ const expectedOpsForPlainRelativeTo = [
"call options.largestUnit.toString",
"get options.relativeTo",
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",
@ -230,6 +251,27 @@ const expectedOpsForZonedRelativeTo = [
"call options.largestUnit.toString",
"get options.relativeTo",
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",

View File

@ -18,7 +18,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -28,7 +27,8 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.PlainDate, "Temporal.PlainDate, object"],
[Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"],
[Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"],

View File

@ -71,6 +71,27 @@ actual.splice(0); // clear
const expectedOpsForPlainRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
// PrepareTemporalFields
@ -135,6 +156,27 @@ actual.splice(0); // clear
const expectedOpsForZonedRelativeTo = expected.concat([
// ToRelativeTemporalObject
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
// PrepareTemporalFields

View File

@ -18,7 +18,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -28,7 +27,8 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.PlainDate, "Temporal.PlainDate, object"],
[Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"],
[Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"],

View File

@ -36,6 +36,27 @@ const expectedOpsForPlainRelativeTo = [
// ToRelativeTemporalObject
"get options.relativeTo",
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",
@ -143,6 +164,27 @@ const expectedOpsForZonedRelativeTo = [
// ToRelativeTemporalObject
"get options.relativeTo",
"get options.relativeTo.calendar",
"has options.relativeTo.calendar.dateAdd",
"has options.relativeTo.calendar.dateFromFields",
"has options.relativeTo.calendar.dateUntil",
"has options.relativeTo.calendar.day",
"has options.relativeTo.calendar.dayOfWeek",
"has options.relativeTo.calendar.dayOfYear",
"has options.relativeTo.calendar.daysInMonth",
"has options.relativeTo.calendar.daysInWeek",
"has options.relativeTo.calendar.daysInYear",
"has options.relativeTo.calendar.fields",
"has options.relativeTo.calendar.id",
"has options.relativeTo.calendar.inLeapYear",
"has options.relativeTo.calendar.mergeFields",
"has options.relativeTo.calendar.month",
"has options.relativeTo.calendar.monthCode",
"has options.relativeTo.calendar.monthDayFromFields",
"has options.relativeTo.calendar.monthsInYear",
"has options.relativeTo.calendar.weekOfYear",
"has options.relativeTo.calendar.year",
"has options.relativeTo.calendar.yearMonthFromFields",
"has options.relativeTo.calendar.yearOfWeek",
"get options.relativeTo.calendar.fields",
"call options.relativeTo.calendar.fields",
"get options.relativeTo.day",

View File

@ -18,7 +18,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -28,7 +27,8 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.PlainDate, "Temporal.PlainDate, object"],
[Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"],
[Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"],

View File

@ -17,7 +17,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -26,6 +25,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -24,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -17,6 +17,27 @@ const expected = [
];
const calendar = function() {};
calendar.dateAdd = () => {};
calendar.dateFromFields = () => {};
calendar.dateUntil = () => {};
calendar.day = () => {};
calendar.dayOfWeek = () => {};
calendar.dayOfYear = () => {};
calendar.daysInMonth = () => {};
calendar.daysInWeek = () => {};
calendar.daysInYear = () => {};
calendar.fields = () => {};
calendar.id = "test-calendar";
calendar.inLeapYear = () => {};
calendar.mergeFields = () => {};
calendar.month = () => {};
calendar.monthCode = () => {};
calendar.monthDayFromFields = () => {};
calendar.monthsInYear = () => {};
calendar.weekOfYear = () => {};
calendar.year = () => {};
calendar.yearMonthFromFields = () => {};
calendar.yearOfWeek = () => {};
const timeZone = TemporalHelpers.timeZoneObserver(actual, "timeZone", {
getOffsetNanosecondsFor(instant) {

View File

@ -9,6 +9,29 @@ features: [Proxy, Temporal]
---*/
const actual = [];
const expected = [
"has calendar.dateAdd",
"has calendar.dateFromFields",
"has calendar.dateUntil",
"has calendar.day",
"has calendar.dayOfWeek",
"has calendar.dayOfYear",
"has calendar.daysInMonth",
"has calendar.daysInWeek",
"has calendar.daysInYear",
"has calendar.fields",
"has calendar.id",
"has calendar.inLeapYear",
"has calendar.mergeFields",
"has calendar.month",
"has calendar.monthCode",
"has calendar.monthDayFromFields",
"has calendar.monthsInYear",
"has calendar.weekOfYear",
"has calendar.year",
"has calendar.yearMonthFromFields",
"has calendar.yearOfWeek",
];
const calendar = TemporalHelpers.calendarObserver(actual, "calendar", {
toString: "iso8601",
@ -23,4 +46,4 @@ Object.defineProperty(Temporal.Calendar, 'from', {
Temporal.Now.plainDateTime(calendar);
assert.compareArray(actual, [], 'no observable operations should be invoked');
assert.compareArray(actual, expected, 'order of observable operations');

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -24,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -14,6 +14,27 @@ const expected = [
];
const calendar = function() {};
calendar.dateAdd = () => {};
calendar.dateFromFields = () => {};
calendar.dateUntil = () => {};
calendar.day = () => {};
calendar.dayOfWeek = () => {};
calendar.dayOfYear = () => {};
calendar.daysInMonth = () => {};
calendar.daysInWeek = () => {};
calendar.daysInYear = () => {};
calendar.fields = () => {};
calendar.id = "test-calendar";
calendar.inLeapYear = () => {};
calendar.mergeFields = () => {};
calendar.month = () => {};
calendar.monthCode = () => {};
calendar.monthDayFromFields = () => {};
calendar.monthsInYear = () => {};
calendar.weekOfYear = () => {};
calendar.year = () => {};
calendar.yearMonthFromFields = () => {};
calendar.yearOfWeek = () => {};
const timeZone = TemporalHelpers.timeZoneObserver(actual, "timeZone", {
getOffsetNanosecondsFor(instant) {

View File

@ -9,6 +9,29 @@ features: [Proxy, Temporal]
---*/
const actual = [];
const expected = [
"has calendar.dateAdd",
"has calendar.dateFromFields",
"has calendar.dateUntil",
"has calendar.day",
"has calendar.dayOfWeek",
"has calendar.dayOfYear",
"has calendar.daysInMonth",
"has calendar.daysInWeek",
"has calendar.daysInYear",
"has calendar.fields",
"has calendar.id",
"has calendar.inLeapYear",
"has calendar.mergeFields",
"has calendar.month",
"has calendar.monthCode",
"has calendar.monthDayFromFields",
"has calendar.monthsInYear",
"has calendar.weekOfYear",
"has calendar.year",
"has calendar.yearMonthFromFields",
"has calendar.yearOfWeek",
];
const calendar = TemporalHelpers.calendarObserver(actual, "calendar", {
toString: "iso8601",
@ -23,4 +46,4 @@ Object.defineProperty(Temporal.Calendar, 'from', {
Temporal.Now.zonedDateTime(calendar);
assert.compareArray(actual, [], 'no observable operations should be invoked');
assert.compareArray(actual, expected, 'order of observable operations');

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -24,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -23,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -26,8 +25,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -24,8 +24,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -10,6 +10,27 @@ features: [Temporal]
const expected = [
"get fields.calendar",
"has fields.calendar.dateAdd",
"has fields.calendar.dateFromFields",
"has fields.calendar.dateUntil",
"has fields.calendar.day",
"has fields.calendar.dayOfWeek",
"has fields.calendar.dayOfYear",
"has fields.calendar.daysInMonth",
"has fields.calendar.daysInWeek",
"has fields.calendar.daysInYear",
"has fields.calendar.fields",
"has fields.calendar.id",
"has fields.calendar.inLeapYear",
"has fields.calendar.mergeFields",
"has fields.calendar.month",
"has fields.calendar.monthCode",
"has fields.calendar.monthDayFromFields",
"has fields.calendar.monthsInYear",
"has fields.calendar.weekOfYear",
"has fields.calendar.year",
"has fields.calendar.yearMonthFromFields",
"has fields.calendar.yearOfWeek",
"get fields.calendar.fields",
"call fields.calendar.fields",
"get fields.day",

View File

@ -11,6 +11,28 @@ const instance = new Temporal.PlainDate(2000, 5, 2);
assert.sameValue(instance.equals({ year: 2000, month: 5, day: 2 }), true, "same date");
assert.sameValue(instance.equals({ year: 2000, month: 5, day: 4 }), false, "different date");
const calendar = { id: "a" };
const calendar = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "a",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
assert.sameValue(instance.withCalendar(calendar).equals({ year: 2000, month: 5, day: 2 }),
false, "different calendar");

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -11,5 +11,27 @@ const instance = new Temporal.PlainDate(2000, 5, 2);
assert.sameValue(instance.equals("2000-05-02"), true, "same date");
assert.sameValue(instance.equals("2000-05-04"), false, "different date");
const calendar = { id: "a" };
const calendar = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "a",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
assert.sameValue(instance.withCalendar(calendar).equals("2000-05-02"), false, "different calendar");

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -7,8 +7,52 @@ description: RangeError thrown if calendars' id properties do not match
features: [Temporal]
---*/
const calendar1 = { id: "A" };
const calendar2 = { id: "B" };
const calendar1 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "A",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const calendar2 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "B",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const plainDate1 = new Temporal.PlainDate(2000, 1, 1, calendar1);
const plainDate2 = new Temporal.PlainDate(2000, 1, 1, calendar2);

View File

@ -11,6 +11,27 @@ features: [Temporal]
const expected = [
// ToTemporalDate
"get other.calendar",
"has other.calendar.dateAdd",
"has other.calendar.dateFromFields",
"has other.calendar.dateUntil",
"has other.calendar.day",
"has other.calendar.dayOfWeek",
"has other.calendar.dayOfYear",
"has other.calendar.daysInMonth",
"has other.calendar.daysInWeek",
"has other.calendar.daysInYear",
"has other.calendar.fields",
"has other.calendar.id",
"has other.calendar.inLeapYear",
"has other.calendar.mergeFields",
"has other.calendar.month",
"has other.calendar.monthCode",
"has other.calendar.monthDayFromFields",
"has other.calendar.monthsInYear",
"has other.calendar.weekOfYear",
"has other.calendar.year",
"has other.calendar.yearMonthFromFields",
"has other.calendar.yearOfWeek",
"get other.calendar.fields",
"call other.calendar.fields",
"get other.day",

View File

@ -16,7 +16,27 @@ const customCalendar = {
},
toString() {
TemporalHelpers.assertUnreachable('toString should not be called');
}
},
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const date = new Temporal.PlainDate(2000, 5, 2, customCalendar);
[

View File

@ -7,12 +7,35 @@ description: If calendarName is "always", the calendar ID should be included.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "2000-05-02[u-ca=iso8601]", "built-in ISO"],
[[{ id: "custom" }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "2000-05-02[u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "2000-05-02[u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -7,12 +7,35 @@ description: If calendarName is "auto", "iso8601" should be omitted.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "2000-05-02", "built-in ISO"],
[[{ id: "custom" }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -9,12 +9,35 @@ description: >
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "2000-05-02[!u-ca=iso8601]", "built-in ISO"],
[[{ id: "custom" }], "2000-05-02[!u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "2000-05-02[!u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "2000-05-02[!u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "2000-05-02[!u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "2000-05-02[!u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "2000-05-02[!u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "2000-05-02[!u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "2000-05-02[!u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -7,12 +7,35 @@ description: If calendarName is "never", the calendar ID should be omitted.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "2000-05-02", "built-in ISO"],
[[{ id: "custom" }], "2000-05-02", "custom"],
[[{ id: "iso8601" }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "2000-05-02", "custom with caps id"],
[[{ id: "\u0131so8601" }], "2000-05-02", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "2000-05-02", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "2000-05-02", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "2000-05-02", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -14,12 +14,35 @@ info: |
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "2000-05-02", "built-in ISO"],
[[{ id: "custom" }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "2000-05-02[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "2000-05-02", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "2000-05-02[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "2000-05-02[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -17,6 +17,26 @@ features: [Temporal]
const calendar = {
id: "custom",
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const date = new Temporal.PlainDate(2000, 5, 2, calendar);

View File

@ -8,7 +8,27 @@ features: [Temporal]
---*/
const calendar = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "custom",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const date1 = new Temporal.PlainDate(2000, 5, 2);
const date2 = new Temporal.PlainDate(2000, 5, 2, calendar);

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -7,8 +7,52 @@ description: RangeError thrown if calendars' id properties do not match
features: [Temporal]
---*/
const calendar1 = { id: "A" };
const calendar2 = { id: "B" };
const calendar1 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "A",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const calendar2 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "B",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const plainDate1 = new Temporal.PlainDate(2000, 1, 1, calendar1);
const plainDate2 = new Temporal.PlainDate(2000, 1, 1, calendar2);

View File

@ -11,6 +11,27 @@ features: [Temporal]
const expected = [
// ToTemporalDate
"get other.calendar",
"has other.calendar.dateAdd",
"has other.calendar.dateFromFields",
"has other.calendar.dateUntil",
"has other.calendar.day",
"has other.calendar.dayOfWeek",
"has other.calendar.dayOfYear",
"has other.calendar.daysInMonth",
"has other.calendar.daysInWeek",
"has other.calendar.daysInYear",
"has other.calendar.fields",
"has other.calendar.id",
"has other.calendar.inLeapYear",
"has other.calendar.mergeFields",
"has other.calendar.month",
"has other.calendar.monthCode",
"has other.calendar.monthDayFromFields",
"has other.calendar.monthsInYear",
"has other.calendar.weekOfYear",
"has other.calendar.year",
"has other.calendar.yearMonthFromFields",
"has other.calendar.yearOfWeek",
"get other.calendar.fields",
"call other.calendar.fields",
"get other.day",

View File

@ -7,7 +7,29 @@ description: Calendar names are case-insensitive
features: [Temporal]
---*/
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "iSo8601";
const result = instance.withCalendar(arg);

View File

@ -7,7 +7,29 @@ description: A number is converted to a string, then to Temporal.Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = 19761118;

View File

@ -7,7 +7,29 @@ description: Leap second is a valid ISO string for Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "2016-12-31T23:59:60";
const result = instance.withCalendar(arg);

View File

@ -7,7 +7,29 @@ description: A calendar ID is valid input for Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "iso8601";

View File

@ -31,7 +31,29 @@ const zonedDateTime = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UT
},
});
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const result = instance.withCalendar(arg);
assert.sameValue(result.getISOFields().calendar, calendar, "Temporal object coerced to calendar");

View File

@ -9,7 +9,29 @@ description: >
features: [BigInt, Symbol, Temporal]
---*/
const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" });
const instance = new Temporal.PlainDate(1976, 11, 18, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const rangeErrorTests = [
[null, "null"],
@ -17,7 +39,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -26,6 +47,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -15,7 +15,24 @@ const customCalendar = {
month() { return 2; },
monthCode() { return "M02"; },
day() { return 5; },
id: "custom-calendar",
toString() { return "custom-calendar"; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
TemporalHelpers.checkSubclassingIgnored(

View File

@ -23,6 +23,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -15,7 +15,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [calendar, description] of rangeErrorTests) {
@ -26,8 +25,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -4,11 +4,12 @@
/*---
esid: sec-temporal.plaindatetime.compare
description: Calendar is not taken into account for the comparison.
includes: [temporalHelpers.js]
features: [Temporal]
---*/
const calendar1 = { toString() { throw new Test262Error("should not call calendar1.toString") } };
const calendar2 = { toString() { throw new Test262Error("should not call calendar2.toString") } };
const calendar1 = TemporalHelpers.calendarThrowEverything();
const calendar2 = TemporalHelpers.calendarThrowEverything();
const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar1);
const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar1);
const dt3 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar1);

View File

@ -24,8 +24,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -9,8 +9,29 @@ features: [Temporal]
---*/
const expected = [
// GetTemporalCalendarWithISODefault
// GetTemporalCalendarSlotValueWithISODefault
"get fields.calendar",
"has fields.calendar.dateAdd",
"has fields.calendar.dateFromFields",
"has fields.calendar.dateUntil",
"has fields.calendar.day",
"has fields.calendar.dayOfWeek",
"has fields.calendar.dayOfYear",
"has fields.calendar.daysInMonth",
"has fields.calendar.daysInWeek",
"has fields.calendar.daysInYear",
"has fields.calendar.fields",
"has fields.calendar.id",
"has fields.calendar.inLeapYear",
"has fields.calendar.mergeFields",
"has fields.calendar.month",
"has fields.calendar.monthCode",
"has fields.calendar.monthDayFromFields",
"has fields.calendar.monthsInYear",
"has fields.calendar.weekOfYear",
"has fields.calendar.year",
"has fields.calendar.yearMonthFromFields",
"has fields.calendar.yearOfWeek",
// CalendarFields
"get fields.calendar.fields",
"call fields.calendar.fields",

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -11,7 +11,28 @@ features: [Temporal]
const actual = [];
function makeCalendar(id, objectName) {
const calendar = {};
const calendar = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
TemporalHelpers.observeProperty(actual, calendar, "id", id, objectName);
return calendar;
}
@ -36,10 +57,50 @@ assert.sameValue(dt1.equals(dt3), false, "different calendar string");
assert.compareArray(actual, ["get calendar1.id", "get calendar3.id"]);
const calendar4 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
get id() { TemporalHelpers.assertUnreachable('should not get calendar4.id'); },
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const calendar5 = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
get id() { TemporalHelpers.assertUnreachable('should not get calendar5.id'); },
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const dt4 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar4);
const dt5 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar4);

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -8,7 +8,29 @@ features: [Temporal]
---*/
const dt1 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0);
const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, { id: "custom" });
const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "custom",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
assert.throws(
RangeError,

View File

@ -11,6 +11,27 @@ features: [Temporal]
const expected = [
// ToTemporalDateTime
"get other.calendar",
"has other.calendar.dateAdd",
"has other.calendar.dateFromFields",
"has other.calendar.dateUntil",
"has other.calendar.day",
"has other.calendar.dayOfWeek",
"has other.calendar.dayOfYear",
"has other.calendar.daysInMonth",
"has other.calendar.daysInWeek",
"has other.calendar.daysInYear",
"has other.calendar.fields",
"has other.calendar.id",
"has other.calendar.inLeapYear",
"has other.calendar.mergeFields",
"has other.calendar.month",
"has other.calendar.monthCode",
"has other.calendar.monthDayFromFields",
"has other.calendar.monthsInYear",
"has other.calendar.weekOfYear",
"has other.calendar.year",
"has other.calendar.yearMonthFromFields",
"has other.calendar.yearOfWeek",
"get other.calendar.fields",
"call other.calendar.fields",
"get other.day",

View File

@ -16,7 +16,27 @@ const customCalendar = {
},
toString() {
TemporalHelpers.assertUnreachable('toString should not be called');
}
},
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const date = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, customCalendar);
[

View File

@ -7,12 +7,35 @@ description: If calendarName is "always", the calendar ID should be included.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "1976-11-18T15:23:00[u-ca=iso8601]", "built-in ISO"],
[[{ id: "custom" }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "1976-11-18T15:23:00[u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -7,12 +7,35 @@ description: If calendarName is "auto", "iso8601" should be omitted.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "1976-11-18T15:23:00", "built-in ISO"],
[[{ id: "custom" }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -9,12 +9,35 @@ description: >
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "1976-11-18T15:23:00[!u-ca=iso8601]", "built-in ISO"],
[[{ id: "custom" }], "1976-11-18T15:23:00[!u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "1976-11-18T15:23:00[!u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "1976-11-18T15:23:00[!u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "1976-11-18T15:23:00[!u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "1976-11-18T15:23:00[!u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "1976-11-18T15:23:00[!u-ca=iso8601]", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "1976-11-18T15:23:00[!u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "1976-11-18T15:23:00[!u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -7,12 +7,35 @@ description: If calendarName is "never", the calendar ID should be omitted.
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "1976-11-18T15:23:00", "built-in ISO"],
[[{ id: "custom" }], "1976-11-18T15:23:00", "custom"],
[[{ id: "iso8601" }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "1976-11-18T15:23:00", "custom with caps id"],
[[{ id: "\u0131so8601" }], "1976-11-18T15:23:00", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "1976-11-18T15:23:00", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "1976-11-18T15:23:00", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "1976-11-18T15:23:00", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -14,12 +14,35 @@ info: |
features: [Temporal]
---*/
const calendarMethods = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const tests = [
[[], "1976-11-18T15:23:00", "built-in ISO"],
[[{ id: "custom" }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601" }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601" }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601" }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
[[{ id: "custom", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=custom]", "custom"],
[[{ id: "iso8601", ...calendarMethods }], "1976-11-18T15:23:00", "custom with iso8601 id"],
[[{ id: "ISO8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=ISO8601]", "custom with caps id"],
[[{ id: "\u0131so8601", ...calendarMethods }], "1976-11-18T15:23:00[u-ca=\u0131so8601]", "custom with dotless i id"],
];
for (const [args, expected, description] of tests) {

View File

@ -17,6 +17,26 @@ features: [Temporal]
const calendar = {
id: "custom",
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar);

View File

@ -8,7 +8,27 @@ features: [Temporal]
---*/
const calendar = {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "custom",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const datetime1 = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0);
const datetime2 = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0, calendar);

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -8,7 +8,29 @@ features: [Temporal]
---*/
const dt1 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0);
const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, { id: "custom" });
const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "custom",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
assert.throws(
RangeError,

View File

@ -11,6 +11,27 @@ features: [Temporal]
const expected = [
// ToTemporalDateTime
"get other.calendar",
"has other.calendar.dateAdd",
"has other.calendar.dateFromFields",
"has other.calendar.dateUntil",
"has other.calendar.day",
"has other.calendar.dayOfWeek",
"has other.calendar.dayOfYear",
"has other.calendar.daysInMonth",
"has other.calendar.daysInWeek",
"has other.calendar.daysInYear",
"has other.calendar.fields",
"has other.calendar.id",
"has other.calendar.inLeapYear",
"has other.calendar.mergeFields",
"has other.calendar.month",
"has other.calendar.monthCode",
"has other.calendar.monthDayFromFields",
"has other.calendar.monthsInYear",
"has other.calendar.weekOfYear",
"has other.calendar.year",
"has other.calendar.yearMonthFromFields",
"has other.calendar.yearOfWeek",
"get other.calendar.fields",
"call other.calendar.fields",
"get other.day",

View File

@ -9,7 +9,28 @@ includes: [temporalHelpers.js]
---*/
const calendar = {
toString() { return "something special"; }
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "something special",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
toString() { return "something special"; },
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar);
const result = dt.withCalendar("iso8601");

View File

@ -7,7 +7,29 @@ description: Calendar names are case-insensitive
features: [Temporal]
---*/
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "iSo8601";
const result = instance.withCalendar(arg);

View File

@ -7,7 +7,29 @@ description: A number is converted to a string, then to Temporal.Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = 19761118;

View File

@ -7,7 +7,29 @@ description: Leap second is a valid ISO string for Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "2016-12-31T23:59:60";
const result = instance.withCalendar(arg);

View File

@ -7,7 +7,29 @@ description: A calendar ID is valid input for Calendar
features: [Temporal]
---*/
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const arg = "iso8601";

View File

@ -31,7 +31,29 @@ const zonedDateTime = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UT
},
});
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const result = instance.withCalendar(arg);
assert.sameValue(result.getISOFields().calendar, calendar, "Temporal object coerced to calendar");

View File

@ -9,7 +9,29 @@ description: >
features: [BigInt, Symbol, Temporal]
---*/
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" });
const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, {
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
id: "replace-me",
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
});
const rangeErrorTests = [
[null, "null"],
@ -17,7 +39,6 @@ const rangeErrorTests = [
["", "empty string"],
[1, "number that doesn't convert to a valid ISO string"],
[1n, "bigint"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
];
for (const [arg, description] of rangeErrorTests) {
@ -26,6 +47,9 @@ for (const [arg, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
];
for (const [arg, description] of typeErrorTests) {

View File

@ -15,7 +15,24 @@ const customCalendar = {
month() { return 2; },
monthCode() { return "M02"; },
day() { return 5; },
id: "custom-calendar",
toString() { return "custom-calendar"; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
TemporalHelpers.checkSubclassingIgnored(

View File

@ -16,7 +16,23 @@ const cal = {
year() { return 2008; },
month() { return 9; },
monthCode() { return "M09"; },
day() { return 6; }
day() { return 6; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0);
assert.sameValue(pdt.calendarId, "iso8601", "PlainDateTime with ISO calendar");

View File

@ -10,7 +10,27 @@ includes: [temporalHelpers.js]
const cal1 = {
id: "this is a string",
toString() { return "this is another string"; }
toString() { return "this is another string"; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
day() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
month() {},
monthCode() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
year() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const cal2 = {
id: "this is a string",
@ -20,7 +40,23 @@ const cal2 = {
year() { return 2008; },
month() { return 9; },
monthCode() { return "M09"; },
day() { return 6; }
day() { return 6; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal1);
const pd = new Temporal.PlainDate(2010, 11, 12, cal2);

View File

@ -20,7 +20,23 @@ const cal = {
year() { return 2008; },
month() { return 9; },
monthCode() { return "M09"; },
day() { return 6; }
day() { return 6; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal);
const pd = new Temporal.PlainDate(2010, 11, 12, cal);

View File

@ -16,7 +16,23 @@ const cal = {
year() { return 2008; },
month() { return 9; },
monthCode() { return "M09"; },
day() { return 6; }
day() { return 6; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal);
const pd = new Temporal.PlainDate(2010, 11, 12);

View File

@ -27,8 +27,9 @@ for (const [calendar, description] of rangeErrorTests) {
const typeErrorTests = [
[Symbol(), "symbol"],
[{}, "plain object"], // TypeError due to missing dateFromFields()
[Temporal.Calendar, "Temporal.Calendar, object"], // ditto
[{}, "plain object that doesn't implement the protocol"],
[new Temporal.TimeZone("UTC"), "time zone instance"],
[Temporal.Calendar, "Temporal.Calendar, object"],
[Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields()
];

View File

@ -16,7 +16,23 @@ const cal = {
year() { return 2008; },
month() { return 9; },
monthCode() { return "M09"; },
day() { return 6; }
day() { return 6; },
dateAdd() {},
dateFromFields() {},
dateUntil() {},
dayOfWeek() {},
dayOfYear() {},
daysInMonth() {},
daysInWeek() {},
daysInYear() {},
fields() {},
inLeapYear() {},
mergeFields() {},
monthDayFromFields() {},
monthsInYear() {},
weekOfYear() {},
yearMonthFromFields() {},
yearOfWeek() {},
};
const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal);
const shifted = dt.withPlainDate("2010-11-12");

Some files were not shown because too many files have changed in this diff Show More