Update test262 (2021.06.21)
https://bugs.webkit.org/show_bug.cgi?id=241840
Reviewed by Yusuke Suzuki.
* JSTests/test262/config.yaml:
* JSTests/test262/expectations.yaml:
* JSTests/test262/harness/temporalHelpers.js:
* JSTests/test262/latest-changes-summary.txt:
* JSTests/test262/test/:
* JSTests/test262/test262-Revision.txt:
Canonical link: https://commits.webkit.org/251748@main
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@295743 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JSTests/test262/config.yaml b/JSTests/test262/config.yaml
index 81816b1..51ac3d3 100644
--- a/JSTests/test262/config.yaml
+++ b/JSTests/test262/config.yaml
@@ -17,7 +17,6 @@
# https://bugs.webkit.org/show_bug.cgi?id=174931
- regexp-lookbehind
- regexp-v-flag
- - cleanupSome
- resizable-arraybuffer
- import-assertions
- json-modules
@@ -25,6 +24,7 @@
- callable-boundary-realms
- FinalizationRegistry.prototype.cleanupSome
- Intl.DurationFormat
+ - decorators
paths:
- test/built-ins/Temporal/Calendar
- test/built-ins/Temporal/Instant/prototype/toZonedDateTime
diff --git a/JSTests/test262/expectations.yaml b/JSTests/test262/expectations.yaml
index bd07cec..b0a1596 100644
--- a/JSTests/test262/expectations.yaml
+++ b/JSTests/test262/expectations.yaml
@@ -603,6 +603,12 @@
default: 'Test262Error: An initialized binding is not created prior to evaluation Expected a ReferenceError to be thrown but no exception was thrown at all'
test/annexB/language/global-code/switch-dflt-global-skip-early-err.js:
default: "SyntaxError: Cannot declare a function that shadows a let/const/class/function variable 'f' in strict mode."
+test/built-ins/AsyncGeneratorPrototype/return/return-suspendedStart-broken-promise.js:
+ default: 'Error: broken promise'
+ strict mode: 'Error: broken promise'
+test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js:
+ default: 'Test262:AsyncTestFailure:Error: broken promise'
+ strict mode: 'Test262:AsyncTestFailure:Error: broken promise'
test/built-ins/Date/UTC/fp-evaluation-order.js:
default: 'Test262Error: order of operations / precision in MakeTime Expected SameValue(«NaN», «29312») to be true'
strict mode: 'Test262Error: order of operations / precision in MakeTime Expected SameValue(«NaN», «29312») to be true'
@@ -822,6 +828,12 @@
test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js:
default: 'Test262Error: TypeError on wrapping a callable proxy with throwing getOwnPropertyDescriptor trap Expected a TypeError to be thrown but no exception was thrown at all'
strict mode: 'Test262Error: TypeError on wrapping a callable proxy with throwing getOwnPropertyDescriptor trap Expected a TypeError to be thrown but no exception was thrown at all'
+test/built-ins/ShadowRealm/prototype/importValue/throws-if-exportname-not-string.js:
+ default: 'Test262Error: Expected a TypeError but got a Test262Error'
+ strict mode: 'Test262Error: Expected a TypeError but got a Test262Error'
+test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours (first argument) Expected SameValue(«1», «0») to be true'
+ strict mode: 'Test262Error: negative fractional hours (first argument) Expected SameValue(«1», «0») to be true'
test/built-ins/Temporal/Duration/compare/basic.js:
default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option'
strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option'
@@ -867,6 +879,12 @@
test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js:
default: 'TypeError: Right side of assignment cannot be destructured'
strict mode: 'TypeError: Right side of assignment cannot be destructured'
+test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«-799», «-800») to be true'
+ strict mode: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«-799», «-800») to be true'
+test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«-799», «-800») to be true'
+ strict mode: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«-799», «-800») to be true'
test/built-ins/Temporal/Duration/prototype/add/calendar-dateadd-called-with-plaindate-instance.js:
default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option'
strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option'
@@ -942,6 +960,12 @@
test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js:
default: 'Test262Error: undefined does not convert to a valid ISO string Expected a RangeError but got a Error'
strict mode: 'Test262Error: undefined does not convert to a valid ISO string Expected a RangeError but got a Error'
+test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-convert.js:
+ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, tz)')"
+ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, tz)')"
+test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-slots.js:
+ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')"
+ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')"
test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js:
default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
@@ -954,6 +978,9 @@
test/built-ins/Temporal/Duration/prototype/round/year-zero.js:
default: 'Test262Error: reject minus zero as extended year Expected a RangeError but got a Error'
strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError but got a Error'
+test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«799», «800») to be true'
+ strict mode: 'Test262Error: negative fractional hours nanoseconds result Expected SameValue(«799», «800») to be true'
test/built-ins/Temporal/Duration/prototype/subtract/calendar-dateadd-called-with-plaindate-instance.js:
default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option'
strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option'
@@ -1038,9 +1065,15 @@
test/built-ins/Temporal/Duration/prototype/total/unit-plurals-accepted-string.js:
default: 'TypeError: Right hand side of instanceof is not an object'
strict mode: 'TypeError: Right hand side of instanceof is not an object'
+test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours Expected SameValue(«999911555595557201», «999911555595557200») to be true'
+ strict mode: 'Test262Error: negative fractional hours Expected SameValue(«999911555595557201», «999911555595557200») to be true'
test/built-ins/Temporal/Instant/prototype/since/largestunit.js:
default: 'Test262Error: does not include higher units than necessary (largest unit unspecified) nanoseconds result Expected SameValue(«40», «101») to be true'
strict mode: 'Test262Error: does not include higher units than necessary (largest unit unspecified) nanoseconds result Expected SameValue(«40», «101») to be true'
+test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours Expected SameValue(«1000088444404442799», «1000088444404442800») to be true'
+ strict mode: 'Test262Error: negative fractional hours Expected SameValue(«1000088444404442799», «1000088444404442800») to be true'
test/built-ins/Temporal/Instant/prototype/toJSON/timezone-getoffsetnanosecondsfor-not-callable.js:
default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all'
strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all'
@@ -1068,12 +1101,18 @@
test/built-ins/Temporal/PlainTime/from/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js:
default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
+test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours nanosecond result Expected SameValue(«201», «200») to be true'
+ strict mode: 'Test262Error: negative fractional hours nanosecond result Expected SameValue(«201», «200») to be true'
test/built-ins/Temporal/PlainTime/prototype/equals/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js:
default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
test/built-ins/Temporal/PlainTime/prototype/since/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js:
default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
+test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js:
+ default: 'Test262Error: negative fractional hours nanosecond result Expected SameValue(«799», «800») to be true'
+ strict mode: 'Test262Error: negative fractional hours nanosecond result Expected SameValue(«799», «800») to be true'
test/built-ins/Temporal/PlainTime/prototype/until/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js:
default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')"
@@ -1203,6 +1242,9 @@
test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js:
default: 'Test262Error: Expected a RangeError but got a TypeError'
strict mode: 'Test262Error: Expected a RangeError but got a TypeError'
+test/intl402/NumberFormat/test-option-roundingPriority-mixed-options.js:
+ default: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"minimumSignificantDigits":2,"minimumFractionDigits":2,"roundingPriority":"morePrecision","userGrouping":false} is ١٫٠٠; expected ١٫٠.'
+ strict mode: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"minimumSignificantDigits":2,"minimumFractionDigits":2,"roundingPriority":"morePrecision","userGrouping":false} is ١٫٠٠; expected ١٫٠.'
test/intl402/PluralRules/prototype/selectRange/default-en-us.js:
default: "TypeError: pr.selectRange is not a function. (In 'pr.selectRange(102, 201)', 'pr.selectRange' is undefined)"
strict mode: "TypeError: pr.selectRange is not a function. (In 'pr.selectRange(102, 201)', 'pr.selectRange' is undefined)"
diff --git a/JSTests/test262/harness/temporalHelpers.js b/JSTests/test262/harness/temporalHelpers.js
index 963498b..d34fd2d 100644
--- a/JSTests/test262/harness/temporalHelpers.js
+++ b/JSTests/test262/harness/temporalHelpers.js
@@ -252,7 +252,7 @@
* calendar object (so that it doesn't have to call the calendar getter itself
* if it wants to make any assertions about the calendar.)
*/
- checkPlainDateTimeConversionFastPath(func) {
+ checkPlainDateTimeConversionFastPath(func, message = "checkPlainDateTimeConversionFastPath") {
const actual = [];
const expected = [];
@@ -285,7 +285,7 @@
});
func(datetime, calendar);
- assert.compareArray(actual, expected, "property getters not called");
+ assert.compareArray(actual, expected, `${message}: property getters not called`);
},
/*
diff --git a/JSTests/test262/latest-changes-summary.txt b/JSTests/test262/latest-changes-summary.txt
index 2bd51c9..cb7bbc2 100644
--- a/JSTests/test262/latest-changes-summary.txt
+++ b/JSTests/test262/latest-changes-summary.txt
@@ -1,1367 +1,516 @@
-M harness/propertyHelper.js
-M harness/regExpUtils.js
M harness/temporalHelpers.js
-A test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js
-A test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js
-M test/built-ins/Array/prototype/Symbol.unscopables/value.js
-M test/built-ins/Array/prototype/concat/create-species-non-ctor.js
-M test/built-ins/Array/prototype/filter/create-species-non-ctor.js
-M test/built-ins/Array/prototype/map/create-species-non-ctor.js
-M test/built-ins/Array/prototype/slice/create-species-non-ctor.js
-M test/built-ins/Array/prototype/splice/create-species-non-ctor.js
-A test/built-ins/Date/parse/year-zero.js
-A test/built-ins/Date/year-zero.js
-M test/built-ins/Error/constructor.js
-M test/built-ins/Function/prototype/bind/instance-length-tointeger.js
-M test/built-ins/Number/S15.7.1.1_A1.js
-M test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js
-M test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js
-A test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js
-R081 test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js
-A test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js
-M test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js
-A test/built-ins/Temporal/Calendar/from/calendar-number.js
-A test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js
-A test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js
-M test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js
-M test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js
-M test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js
-M test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js
-M test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/day/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/day/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js
-M test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js
+A test/built-ins/AsyncGeneratorPrototype/return/return-state-completed-broken-promise.js
+A test/built-ins/AsyncGeneratorPrototype/return/return-suspendedStart-broken-promise.js
+A test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
+M test/built-ins/NativeErrors/AggregateError/newtarget-proto-custom.js
+R080 test/built-ins/ShadowRealm/prototype/importValue/exportName-tostring.js test/built-ins/ShadowRealm/prototype/importValue/throws-if-exportname-not-string.js
+M test/built-ins/Temporal/Calendar/constructor.js
+A test/built-ins/Temporal/Calendar/prototype/constructor.js
+R100 test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-slots.js
+A test/built-ins/Temporal/Calendar/prototype/dateFromFields/missing-properties.js
+A test/built-ins/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
+A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/day/leap-second.js test/built-ins/Temporal/Calendar/prototype/day/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/day/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/Calendar/prototype/fields/branding.js
+R100 test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-slots.js
M test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js
-A test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js
-A test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/month/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/month/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js
-M test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js
-M test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js
-A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js
-M test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js
+M test/built-ins/Temporal/Calendar/prototype/mergeFields/branding.js
+R100 test/built-ins/Temporal/Calendar/prototype/month/leap-second.js test/built-ins/Temporal/Calendar/prototype/month/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/month/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-slots.js
+R100 test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js test/built-ins/Temporal/Calendar/prototype/monthCode/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding.js
+A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/missing-properties.js
+A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
+R100 test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-slots.js
M test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js
+A test/built-ins/Temporal/Calendar/prototype/toStringTag/prop-desc.js
+R100 test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-slots.js
M test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-number.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/Calendar/prototype/year/leap-second.js
-M test/built-ins/Temporal/Calendar/prototype/year/year-zero.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js
+R100 test/built-ins/Temporal/Calendar/prototype/year/leap-second.js test/built-ins/Temporal/Calendar/prototype/year/argument-leap-second.js
+A test/built-ins/Temporal/Calendar/prototype/year/argument-string-time-separators.js
+A test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-slots.js
M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js
-M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js
-M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js
-A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js
-A test/built-ins/Temporal/Duration/basic.js
-A test/built-ins/Temporal/Duration/call-builtin.js
-A test/built-ins/Temporal/Duration/compare/argument-cast.js
-A test/built-ins/Temporal/Duration/compare/basic.js
-A test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js
-A test/built-ins/Temporal/Duration/compare/options-wrong-type.js
-A test/built-ins/Temporal/Duration/compare/relativeto-hour.js
-A test/built-ins/Temporal/Duration/compare/relativeto-month.js
-A test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js
-A test/built-ins/Temporal/Duration/compare/relativeto-year.js
-A test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js
-A test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js
-A test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js
-A test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js
-M test/built-ins/Temporal/Duration/days-undefined.js
-A test/built-ins/Temporal/Duration/from/argument-duration.js
-M test/built-ins/Temporal/Duration/from/argument-existing-object.js
-A test/built-ins/Temporal/Duration/from/argument-object-invalid.js
-A test/built-ins/Temporal/Duration/from/argument-string-invalid.js
-A test/built-ins/Temporal/Duration/from/argument-string.js
-M test/built-ins/Temporal/Duration/hours-undefined.js
-M test/built-ins/Temporal/Duration/microseconds-undefined.js
-M test/built-ins/Temporal/Duration/milliseconds-undefined.js
-M test/built-ins/Temporal/Duration/minutes-undefined.js
-A test/built-ins/Temporal/Duration/mixed.js
-M test/built-ins/Temporal/Duration/months-undefined.js
-M test/built-ins/Temporal/Duration/nanoseconds-undefined.js
-A test/built-ins/Temporal/Duration/prototype/abs/basic.js
-A test/built-ins/Temporal/Duration/prototype/abs/new-object.js
-A test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js
-A test/built-ins/Temporal/Duration/prototype/add/argument-string.js
-A test/built-ins/Temporal/Duration/prototype/add/basic.js
-M test/built-ins/Temporal/Duration/prototype/add/options-undefined.js
-A test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js
-A test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js
-A test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/blank/basic.js
-A test/built-ins/Temporal/Duration/prototype/negated/basic.js
-A test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js
-A test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js
-A test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js
-A test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js
-A test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js
-A test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js
-M test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js
-A test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.js
-D test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js
-M test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js
-A test/built-ins/Temporal/Duration/prototype/round/smallestunit.js
-A test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js
-A test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js
-A test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js
-A test/built-ins/Temporal/Duration/prototype/subtract/basic.js
-M test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js
-A test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js
-A test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js
-A test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/toJSON/basic.js
-A test/built-ins/Temporal/Duration/prototype/toJSON/options.js
-A test/built-ins/Temporal/Duration/prototype/toString/balance.js
-A test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js
-M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js
-A test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js
-M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js
-M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js
-M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js
-M test/built-ins/Temporal/Duration/prototype/toString/negative-components.js
-A test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js
-A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js
-A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js
-M test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js
-A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js
-A test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js
-M test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js
-M test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js
-A test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js
-M test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js
-A test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js
-A test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js
-A test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js
-A test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js
-A test/built-ins/Temporal/Duration/prototype/valueOf/basic.js
-A test/built-ins/Temporal/Duration/prototype/with/all-negative.js
-A test/built-ins/Temporal/Duration/prototype/with/all-positive.js
-A test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js
-A test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js
-A test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js
-A test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js
-A test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js
+A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/missing-properties.js
+A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
+A test/built-ins/Temporal/Calendar/subclass.js
+M test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/Duration/prototype/add/branding.js
+A test/built-ins/Temporal/Duration/prototype/constructor.js
+M test/built-ins/Temporal/Duration/prototype/round/branding.js
+A test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-convert.js
+A test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-slots.js
+M test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/Duration/prototype/subtract/branding.js
+A test/built-ins/Temporal/Duration/prototype/toStringTag/prop-desc.js
+M test/built-ins/Temporal/Duration/prototype/total/branding.js
M test/built-ins/Temporal/Duration/prototype/with/branding.js
-A test/built-ins/Temporal/Duration/prototype/with/partial-positive.js
-A test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js
-A test/built-ins/Temporal/Duration/prototype/with/sign-replace.js
-M test/built-ins/Temporal/Duration/seconds-undefined.js
-M test/built-ins/Temporal/Duration/weeks-undefined.js
-M test/built-ins/Temporal/Duration/years-undefined.js
-A test/built-ins/Temporal/Instant/compare/argument-object-tostring.js
-A test/built-ins/Temporal/Instant/compare/argument-wrong-type.js
-A test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js
-A test/built-ins/Temporal/Instant/compare/leap-second.js
-M test/built-ins/Temporal/Instant/compare/year-zero.js
-A test/built-ins/Temporal/Instant/from/argument-instant.js
-A test/built-ins/Temporal/Instant/from/argument-object-tostring.js
-A test/built-ins/Temporal/Instant/from/argument-wrong-type.js
-A test/built-ins/Temporal/Instant/from/basic.js
-A test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js
-A test/built-ins/Temporal/Instant/from/leap-second.js
-M test/built-ins/Temporal/Instant/from/year-zero.js
-A test/built-ins/Temporal/Instant/prototype/add/basic.js
+A test/built-ins/Temporal/Duration/subclass.js
+A test/built-ins/Temporal/Instant/compare/argument-string-invalid.js
+A test/built-ins/Temporal/Instant/compare/argument-string-time-separators.js
+M test/built-ins/Temporal/Instant/constructor.js
+A test/built-ins/Temporal/Instant/from/argument-string-invalid.js
+A test/built-ins/Temporal/Instant/from/argument-string-time-separators.js
+A test/built-ins/Temporal/Instant/from/argument-string.js
+M test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js
M test/built-ins/Temporal/Instant/prototype/add/branding.js
-A test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js
-M test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js
-A test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js
-M test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js
-A test/built-ins/Temporal/Instant/prototype/equals/leap-second.js
-M test/built-ins/Temporal/Instant/prototype/equals/year-zero.js
-M test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js
-M test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js
-A test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js
-D test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js
-M test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js
-A test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js
-A test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js
-M test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js
-A test/built-ins/Temporal/Instant/prototype/since/leap-second.js
-A test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js
-M test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/since/year-zero.js
-A test/built-ins/Temporal/Instant/prototype/subtract/basic.js
+A test/built-ins/Temporal/Instant/prototype/constructor.js
+A test/built-ins/Temporal/Instant/prototype/equals/argument-string-invalid.js
+A test/built-ins/Temporal/Instant/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/Instant/prototype/equals/branding.js
+M test/built-ins/Temporal/Instant/prototype/round/branding.js
+A test/built-ins/Temporal/Instant/prototype/since/argument-string-invalid.js
+A test/built-ins/Temporal/Instant/prototype/since/argument-string-time-separators.js
+M test/built-ins/Temporal/Instant/prototype/since/branding.js
+M test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js
M test/built-ins/Temporal/Instant/prototype/subtract/branding.js
-A test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js
-M test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js
-A test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js
-A test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js
-M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js
-A test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js
-M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js
+M test/built-ins/Temporal/Instant/prototype/toJSON/basic.js
+M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js
+M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js
M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js
-M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js
-A test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js
-A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js
-A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js
-A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js
-M test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js
-A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js
-A test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js
-M test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js
-A test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js
-A test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js
-A test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/toString/year-format.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js
-A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js
-A test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js
-A test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js
-M test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/Instant/prototype/until/leap-second.js
-A test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js
-M test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js
-M test/built-ins/Temporal/Instant/prototype/until/year-zero.js
-A test/built-ins/Temporal/Now/plainDate/calendar-number.js
-A test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js
-A test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/plainDateTime/calendar-number.js
-A test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js
-A test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/zonedDateTime/calendar-number.js
-A test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js
-A test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js
-A test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js
-A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js
-A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js
-A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js
-A test/built-ins/Temporal/PlainDate/calendar-number.js
-A test/built-ins/Temporal/PlainDate/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/compare/argument-number.js
-A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDate/compare/leap-second.js
-M test/built-ins/Temporal/PlainDate/compare/year-zero.js
-M test/built-ins/Temporal/PlainDate/from/argument-number.js
+M test/built-ins/Temporal/Instant/prototype/toStringTag/prop-desc.js
+M test/built-ins/Temporal/Instant/prototype/toZonedDateTime/branding.js
+M test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding.js
+A test/built-ins/Temporal/Instant/prototype/until/argument-string-invalid.js
+A test/built-ins/Temporal/Instant/prototype/until/argument-string-time-separators.js
+M test/built-ins/Temporal/Instant/prototype/until/branding.js
+A test/built-ins/Temporal/Instant/prototype/valueOf/basic.js
+A test/built-ins/Temporal/Instant/subclass.js
+A test/built-ins/Temporal/PlainDate/argument-convert.js
+A test/built-ins/Temporal/PlainDate/argument-invalid.js
+M test/built-ins/Temporal/PlainDate/compare/argument-plaindatetime.js
+A test/built-ins/Temporal/PlainDate/compare/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime-slots.js
+A test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime.js
+M test/built-ins/Temporal/PlainDate/constructor.js
+R100 test/built-ins/Temporal/PlainDate/from/leap-second.js test/built-ins/Temporal/PlainDate/from/argument-leap-second.js
M test/built-ins/Temporal/PlainDate/from/argument-plaindate.js
-A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js
-M test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/from/leap-second.js
-A test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js
-R100 test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string.js
-A test/built-ins/Temporal/PlainDate/from/options-wrong-type.js
+A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar.js
+A test/built-ins/Temporal/PlainDate/from/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-slots.js
+A test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime.js
+D test/built-ins/Temporal/PlainDate/from/options-invalid.js
M test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js
-M test/built-ins/Temporal/PlainDate/from/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js
-M test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js
-M test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js
-M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js
-M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js
-M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js
-M test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js
-M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js
-M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js
-M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js
-M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js
-M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js
-M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js
-M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js
-M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js
-M test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js
-A test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js
-M test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js
-A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js
-A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/compare/basic.js
-A test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js
-A test/built-ins/Temporal/PlainDateTime/compare/cast.js
-A test/built-ins/Temporal/PlainDateTime/compare/leap-second.js
-M test/built-ins/Temporal/PlainDateTime/compare/year-zero.js
-A test/built-ins/Temporal/PlainDateTime/constructor-full.js
-A test/built-ins/Temporal/PlainDateTime/datetime-math.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-object.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-string.js
-A test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/from/leap-second.js
-A test/built-ins/Temporal/PlainDateTime/from/limits.js
-A test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js
-M test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js
-M test/built-ins/Temporal/PlainDateTime/from/year-zero.js
-M test/built-ins/Temporal/PlainDateTime/hour-undefined.js
-A test/built-ins/Temporal/PlainDateTime/limits.js
-M test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js
-M test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js
-M test/built-ins/Temporal/PlainDateTime/minute-undefined.js
-M test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js
-M test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js
-M test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js
-A test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js
-M test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js
-M test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.js
-D test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js
-M test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js
-A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js
-M test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js
-M test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js
-M test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js
-A test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js
-M test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js
-M test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js
+M test/built-ins/Temporal/PlainDate/prototype/add/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/add/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/add/custom.js
+D test/built-ins/Temporal/PlainDate/prototype/add/options-invalid.js
+M test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js
+A test/built-ins/Temporal/PlainDate/prototype/constructor.js
+A test/built-ins/Temporal/PlainDate/prototype/dayOfWeek/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/dayOfYear/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/daysInMonth/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/daysInMonth/custom.js
+M test/built-ins/Temporal/PlainDate/prototype/daysInWeek/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/daysInWeek/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/daysInYear/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/daysInYear/custom.js
+R100 test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js test/built-ins/Temporal/PlainDate/prototype/equals/argument-leap-second.js
+A test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainDate/prototype/equals/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/getISOFields/prototype.js
+A test/built-ins/Temporal/PlainDate/prototype/inLeapYear/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/inLeapYear/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/monthsInYear/custom.js
+R100 test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js test/built-ins/Temporal/PlainDate/prototype/since/argument-leap-second.js
+A test/built-ins/Temporal/PlainDate/prototype/since/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainDate/prototype/since/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/since/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/since/custom.js
+D test/built-ins/Temporal/PlainDate/prototype/since/options-invalid.js
+M test/built-ins/Temporal/PlainDate/prototype/subtract/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/subtract/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/subtract/custom.js
+D test/built-ins/Temporal/PlainDate/prototype/subtract/options-invalid.js
+M test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js
+A test/built-ins/Temporal/PlainDate/prototype/toJSON/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-object.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/custom.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/basic.js
+A test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/toString/calendar-tostring.js
+M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-always.js
+M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-auto.js
+M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string.js
+M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-never.js
+M test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js
+A test/built-ins/Temporal/PlainDate/prototype/toStringTag/prop-desc.js
+A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/calendar.js
+A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-getpossibleinstantsfor.js
+R100 test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js test/built-ins/Temporal/PlainDate/prototype/until/argument-leap-second.js
+A test/built-ins/Temporal/PlainDate/prototype/until/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainDate/prototype/until/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/until/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/until/custom.js
+D test/built-ins/Temporal/PlainDate/prototype/until/options-invalid.js
+A test/built-ins/Temporal/PlainDate/prototype/weekOfYear/custom.js
+M test/built-ins/Temporal/PlainDate/prototype/with/branding.js
+A test/built-ins/Temporal/PlainDate/prototype/with/calendar-invalid-return.js
+A test/built-ins/Temporal/PlainDate/prototype/with/custom.js
+D test/built-ins/Temporal/PlainDate/prototype/with/options-invalid.js
+M test/built-ins/Temporal/PlainDate/prototype/with/plaindatelike-invalid.js
+M test/built-ins/Temporal/PlainDate/prototype/withCalendar/basic.js
+M test/built-ins/Temporal/PlainDate/prototype/withCalendar/branding.js
+A test/built-ins/Temporal/PlainDate/subclass.js
+A test/built-ins/Temporal/PlainDateTime/compare/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDateTime/constructor.js
+M test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/PlainDateTime/prototype/add/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/constructor.js
+A test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/custom.js
+A test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/custom.js
+M test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js
+A test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/custom.js
+M test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js
+A test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/custom.js
+M test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js
+A test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/custom.js
+A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDateTime/prototype/equals/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/prototype.js
+A test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/basic.js
+A test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/custom.js
+A test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/custom.js
+M test/built-ins/Temporal/PlainDateTime/prototype/round/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDateTime/prototype/since/branding.js
+M test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/PlainDateTime/prototype/subtract/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/toJSON/basic.js
+M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js
+M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js
M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js
-M test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js
-A test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js
-M test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js
-M test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js
-M test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js
-A test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js
-M test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js
-M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js
-M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.js
-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js
-M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js
-M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js
-M test/built-ins/Temporal/PlainDateTime/second-undefined.js
-A test/built-ins/Temporal/PlainMonthDay/calendar-always.js
-A test/built-ins/Temporal/PlainMonthDay/calendar-number.js
-A test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-number.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainMonthDay/from/leap-second.js
-A test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.js
-M test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js
-M test/built-ins/Temporal/PlainMonthDay/from/year-zero.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js
-M test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js
-M test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js
-M test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js
-A test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js
-M test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainTime/compare/argument-number.js
-M test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/compare/leap-second.js
-M test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js
-M test/built-ins/Temporal/PlainTime/compare/year-zero.js
-A test/built-ins/Temporal/PlainTime/from/argument-number.js
-A test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js
-A test/built-ins/Temporal/PlainTime/from/argument-object.js
-M test/built-ins/Temporal/PlainTime/from/argument-plaintime.js
-A test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js
-M test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/from/leap-second.js
-R100 test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js
-A test/built-ins/Temporal/PlainTime/from/options-wrong-type.js
-A test/built-ins/Temporal/PlainTime/from/overflow-constrain.js
-M test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainTime/from/overflow-reject.js
-M test/built-ins/Temporal/PlainTime/from/year-zero.js
-A test/built-ins/Temporal/PlainTime/negative-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js
-A test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js
-A test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js
-A test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js
-M test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js
-M test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js
-M test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js
-M test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js
-M test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js
-M test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js
-A test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js
-D test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js
-M test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js
-A test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js
-A test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js
-A test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js
-M test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/since/basic.js
-M test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js
-A test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js
-M test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js
-A test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js
-M test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js
-M test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js
-M test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js
-A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js
-A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js
-M test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js
+A test/built-ins/Temporal/PlainDateTime/prototype/toStringTag/prop-desc.js
+M test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainDateTime/prototype/until/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/custom.js
+M test/built-ins/Temporal/PlainDateTime/prototype/with/branding.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding.js
+R100 test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-leap-second.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
+A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding.js
+A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainDateTime/subclass.js
+M test/built-ins/Temporal/PlainMonthDay/constructor.js
+A test/built-ins/Temporal/PlainMonthDay/from/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainMonthDay/prototype/constructor.js
+A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainMonthDay/prototype/equals/branding.js
+A test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/prototype.js
+M test/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding.js
+A test/built-ins/Temporal/PlainMonthDay/prototype/toStringTag/prop-desc.js
+M test/built-ins/Temporal/PlainMonthDay/prototype/with/branding.js
+A test/built-ins/Temporal/PlainMonthDay/subclass.js
+A test/built-ins/Temporal/PlainTime/compare/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainTime/constructor.js
+A test/built-ins/Temporal/PlainTime/from/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/PlainTime/prototype/add/branding.js
+A test/built-ins/Temporal/PlainTime/prototype/calendar/basic.js
+A test/built-ins/Temporal/PlainTime/prototype/constructor.js
+A test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainTime/prototype/equals/branding.js
+A test/built-ins/Temporal/PlainTime/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/PlainTime/prototype/getISOFields/prototype.js
+M test/built-ins/Temporal/PlainTime/prototype/round/branding.js
+A test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainTime/prototype/since/branding.js
+M test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/PlainTime/prototype/subtract/branding.js
+A test/built-ins/Temporal/PlainTime/prototype/toJSON/basic.js
+R100 test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-leap-second.js
+A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/branding.js
M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js
M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js
M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js
-M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js
-M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js
-A test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js
-M test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js
-A test/built-ins/Temporal/PlainTime/prototype/until/basic.js
-M test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js
-A test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js
-A test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js
-M test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js
-A test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js
-M test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js
-A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js
-M test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js
-M test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js
-A test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js
+A test/built-ins/Temporal/PlainTime/prototype/toStringTag/prop-desc.js
+R100 test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-leap-second.js
+A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-missing-properties.js
+A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/branding.js
+A test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainTime/prototype/until/branding.js
+M test/built-ins/Temporal/PlainTime/prototype/with/branding.js
M test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainYearMonth/calendar-always.js
-A test/built-ins/Temporal/PlainYearMonth/calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js
-A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainYearMonth/compare/leap-second.js
-M test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js
-M test/built-ins/Temporal/PlainYearMonth/from/argument-number.js
-M test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js
-A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainYearMonth/from/leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js
-M test/built-ins/Temporal/PlainYearMonth/from/year-zero.js
-M test/built-ins/Temporal/PlainYearMonth/limits.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.js
-A test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js
-M test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js
-A test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js
-A test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js
-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js
-M test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js
-M test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js
-M test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js
-M test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js
-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js
-M test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js
-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.js
-M test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js
-A test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js
-M test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js
-A test/built-ins/Temporal/ZonedDateTime/from/leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/from/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.js
-D test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js
+A test/built-ins/Temporal/PlainTime/subclass.js
+A test/built-ins/Temporal/PlainYearMonth/compare/argument-string-time-separators.js
+A test/built-ins/Temporal/PlainYearMonth/from/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/add/branding.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/constructor.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/equals/branding.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/prototype.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/inLeapYear/basic.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/since/branding.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/branding.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/branding.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/toStringTag/prop-desc.js
+A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-time-separators.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/until/branding.js
+M test/built-ins/Temporal/PlainYearMonth/prototype/with/branding.js
+A test/built-ins/Temporal/PlainYearMonth/subclass.js
+M test/built-ins/Temporal/TimeZone/constructor.js
+A test/built-ins/Temporal/TimeZone/prototype/constructor.js
+A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getInstantFor/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-invalid.js
+A test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getNextTransition/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-invalid.js
+A test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-invalid.js
+A test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-invalid.js
+A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-invalid.js
+A test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-time-separators.js
+M test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/branding.js
+A test/built-ins/Temporal/TimeZone/prototype/toStringTag/prop-desc.js
+A test/built-ins/Temporal/TimeZone/subclass.js
+A test/built-ins/Temporal/ZonedDateTime/compare/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/constructor.js
+A test/built-ins/Temporal/ZonedDateTime/from/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/add/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/constructor.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/daysInYear/basic.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/equals/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/custom.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/prototype.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/inLeapYear/basic.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/round/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/since/branding.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-negative-fractional-units.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/basic.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js
M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js
-M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js
-A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js
-A test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js
-A test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js
-A test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js
-D test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js
-A test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js
-D test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js
-D test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js
-D test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js
-D test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js
-M test/built-ins/TypedArray/prototype/sort/sort-tonumber.js
-A test/built-ins/TypedArrayConstructors/ctors/no-species.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js
-D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js
-D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js
-M test/built-ins/parseInt/15.1.2.2-2-1.js
-A test/harness/temporalHelpers-one-shift-time-zone.js
-A test/intl402/DurationFormat/constructor-locales-invalid.js
-A test/intl402/DurationFormat/constructor-locales-valid.js
-A test/intl402/DurationFormat/constructor-options-defaults.js
-A test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js
-A test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js
-A test/intl402/DurationFormat/constructor-options-invalid.js
-A test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js
-A test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js
-A test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js
-A test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js
-A test/intl402/DurationFormat/constructor-options-order.js
-A test/intl402/DurationFormat/constructor-options-style-invalid.js
-A test/intl402/DurationFormat/constructor-options-style-valid.js
-R100 test/intl402/DurationFormat/instance/extensibility.js test/intl402/DurationFormat/extensibility.js
-R100 test/intl402/DurationFormat/instance/length.js test/intl402/DurationFormat/length.js
-R100 test/intl402/DurationFormat/instance/name.js test/intl402/DurationFormat/name.js
-A test/intl402/DurationFormat/newtarget-undefined.js
-R100 test/intl402/DurationFormat/instance/prop-desc.js test/intl402/DurationFormat/prop-desc.js
-R100 test/intl402/DurationFormat/instance/prototype.js test/intl402/DurationFormat/prototype.js
-A test/intl402/DurationFormat/supportedLocalesOf/basic.js
-A test/intl402/DurationFormat/supportedLocalesOf/branding.js
-A test/intl402/DurationFormat/supportedLocalesOf/length.js
-A test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js
-A test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js
-A test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js
-A test/intl402/DurationFormat/supportedLocalesOf/name.js
-A test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js
-A test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js
-A test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js
-M test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js
-M test/intl402/NumberFormat/constructor-roundingIncrement.js
-A test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js
-M test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js
-M test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js
-M test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-number.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js
-A test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js
-A test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js
-A test/intl402/Temporal/Calendar/prototype/era/leap-second.js
-M test/intl402/Temporal/Calendar/prototype/era/year-zero.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js
-A test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js
-M test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js
-A test/intl402/Temporal/Duration/compare/relativeto-hour.js
-A test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js
-A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js
-A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js
-A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js
-A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
-A test/intl402/Temporal/TimeZone/etc-timezone.js
-R074 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js
-R075 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js
-R075 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js
-R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js
-R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js
-R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js
-R072 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js
-R056 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js
-R055 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js
-R069 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js
-R071 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js
-R069 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js
-A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js
-M test/language/expressions/unary-plus/S11.4.6_A3_T3.js
-M test/language/statements/for-in/S12.6.4_A7_T2.js
\ No newline at end of file
+A test/built-ins/Temporal/ZonedDateTime/prototype/toStringTag/prop-desc.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/until/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/valueOf/basic.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/with/branding.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding.js
+R100 test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-leap-second.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-time-separators.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/branding.js
+A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-separators.js
+M test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/branding.js
+A test/built-ins/Temporal/ZonedDateTime/subclass.js
+A test/intl402/NumberFormat/test-option-roundingPriority-mixed-options.js
+A test/intl402/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
+R100 test/intl402/Temporal/Calendar/prototype/era/leap-second.js test/intl402/Temporal/Calendar/prototype/era/argument-leap-second.js
+A test/intl402/Temporal/Calendar/prototype/era/argument-string-time-separators.js
+A test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-convert.js
+A test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-slots.js
+R100 test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js test/intl402/Temporal/Calendar/prototype/eraYear/argument-leap-second.js
+A test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-time-separators.js
+A test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-convert.js
+A test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-slots.js
+A test/intl402/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
+A test/intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-break-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-case-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-catch-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-class-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-const-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-continue-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-debugger-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped-ext.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-delete-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-do-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-else-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-enum-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-export-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped-ext.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-finally-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-for-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-function-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-if-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-implements-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-import-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-in-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-instanceof-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-interface-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-let-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-new-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-package-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-private-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-protected-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-public-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-return-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-static-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-super-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-switch-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-this-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-throw-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-try-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-typeof-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-var-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-void-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-while-escaped.js
+M test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-with-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-break-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-case-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-catch-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-class-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-const-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-continue-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-debugger-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped-ext.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-default.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-delete-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-do-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-else-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-enum-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-export-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped-ext.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-finally-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-for-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-function-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-if-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-implements-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-import-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-in-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-instanceof-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-interface-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-let-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-new-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-package-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-private-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-protected-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-public-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-return-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-static-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-super-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-switch-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-this-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-throw-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-try-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-typeof-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-var-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-void-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-while-escaped.js
+M test/language/expressions/assignment/dstr/syntax-error-ident-ref-with-escaped.js
+A test/language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
+A test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
+A test/language/expressions/class/elements/field-definition-accessor-no-line-terminator.js
+A test/language/expressions/class/elements/syntax/valid/grammar-field-accessor.js
+M test/language/module-code/early-dup-lex.js
+A test/language/statements/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
+A test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
+A test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
+A test/language/statements/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
+A test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
+A test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
+A test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
+A test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
+A test/language/statements/class/elements/field-definition-accessor-no-line-terminator.js
+A test/language/statements/class/elements/syntax/valid/grammar-field-accessor.js
+M test/language/statements/for/head-const-bound-names-in-stmt.js
+M test/language/statements/for/labelled-fn-stmt-const.js
+M test/language/statements/for-in/S12.6.4_A7_T2.js
+M test/language/statements/function/S14_A5_T1.js
+M test/language/statements/function/S14_A5_T2.js
\ No newline at end of file
diff --git a/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-state-completed-broken-promise.js b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-state-completed-broken-promise.js
new file mode 100644
index 0000000..ca3f605
--- /dev/null
+++ b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-state-completed-broken-promise.js
@@ -0,0 +1,62 @@
+// Copyright (C) 2022 Chengzhong Wu. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-asyncgenerator-prototype-return
+description: >
+ A broken promise should reject the returned promise of
+ AsyncGenerator.prototype.return when the generator is completed.
+info: |
+ AsyncGenerator.prototype.return ( value )
+ ...
+ 8. If state is either suspendedStart or completed, then
+ a. Set generator.[[AsyncGeneratorState]] to awaiting-return.
+ b. Perform ! AsyncGeneratorAwaitReturn(generator).
+ ...
+
+ AsyncGeneratorAwaitReturn ( generator )
+ ...
+ 6. Let promise be Completion(PromiseResolve(%Promise%, completion.[[Value]])).
+ 7. If promiseCompletion is an abrupt completion, then
+ a. Set generator.[[AsyncGeneratorState]] to completed.
+ b. Perform AsyncGeneratorCompleteStep(generator, promiseCompletion, true).
+ c. Perform AsyncGeneratorDrainQueue(generator).
+ d. Return unused.
+ 8. Assert: promiseCompletion.[[Type]] is normal.
+ 9. Let promise be promiseCompletion.[[Value]].
+ ...
+
+flags: [async]
+features: [async-iteration]
+---*/
+
+let unblock;
+let blocking = new Promise(resolve => { unblock = resolve; });
+let unblocked = false;
+var g = async function*() {
+ await blocking;
+ unblocked = true;
+};
+
+var it = g();
+let brokenPromise = Promise.resolve(42);
+Object.defineProperty(brokenPromise, 'constructor', {
+ get: function () {
+ throw new Error('broken promise');
+ }
+});
+
+it.next();
+it.return(brokenPromise)
+ .then(
+ () => {
+ throw new Test262Error("Expected rejection");
+ },
+ err => {
+ assert(unblocked, false, 'return should be rejected before generator is resumed');
+ assert.sameValue(err.message, 'broken promise');
+ }
+ )
+ .then($DONE, $DONE);
+
+unblock();
diff --git a/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedStart-broken-promise.js b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedStart-broken-promise.js
new file mode 100644
index 0000000..993ca81
--- /dev/null
+++ b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedStart-broken-promise.js
@@ -0,0 +1,54 @@
+// Copyright (C) 2022 Chengzhong Wu. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-asyncgenerator-prototype-return
+description: >
+ A broken promise should reject the returned promise of
+ AsyncGenerator.prototype.return when the generator's state is suspendedStart.
+info: |
+ AsyncGenerator.prototype.return ( value )
+ ...
+ 8. If state is either suspendedStart or completed, then
+ a. Set generator.[[AsyncGeneratorState]] to awaiting-return.
+ b. Perform AsyncGeneratorAwaitReturn(_generator_).
+ ...
+
+ AsyncGeneratorAwaitReturn ( generator )
+ ...
+ 6. Let promise be Completion(PromiseResolve(%Promise%, completion.[[Value]])).
+ 7. If promiseCompletion is an abrupt completion, then
+ a. Set generator.[[AsyncGeneratorState]] to completed.
+ b. Perform AsyncGeneratorCompleteStep(generator, promiseCompletion, true).
+ c. Perform AsyncGeneratorDrainQueue(generator).
+ d. Return unused.
+ 8. Assert: promiseCompletion.[[Type]] is normal.
+ 9. Let promise be promiseCompletion.[[Value]].
+ ...
+
+flags: [async]
+features: [async-iteration]
+---*/
+
+var g = async function*() {
+ throw new Test262Error('Generator must not be resumed.');
+};
+
+var it = g();
+let brokenPromise = Promise.resolve(42);
+Object.defineProperty(brokenPromise, 'constructor', {
+ get: function () {
+ throw new Error('broken promise');
+ }
+});
+
+it.return(brokenPromise)
+ .then(
+ () => {
+ throw new Test262Error("Expected rejection");
+ },
+ err => {
+ assert.sameValue(err.message, 'broken promise');
+ }
+ )
+ .then($DONE, $DONE);
diff --git a/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
new file mode 100644
index 0000000..7fc3312
--- /dev/null
+++ b/JSTests/test262/test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-broken-promise-try-catch.js
@@ -0,0 +1,64 @@
+// Copyright (C) 2022 Chengzhong Wu. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-asyncgenerator-prototype-return
+description: >
+ A broken promise should resume the generator and reject with
+ the exception when the generator's state is suspendedYield.
+info: |
+ AsyncGenerator.prototype.return ( value )
+ ...
+ 9. Else if state is suspendedYield, then
+ a. Perform AsyncGeneratorResume(generator, completion).
+ ...
+
+ AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )
+ Resumes the steps defined at AsyncGeneratorStart ( generator, generatorBody )
+ ...
+ 4. Set the code evaluation state of genContext such that when evaluation is resumed for that execution context the following steps will be performed:
+ ...
+ i. Perform AsyncGeneratorDrainQueue(generator).
+ j. Return undefined.
+
+ AsyncGeneratorDrainQueue ( generator )
+ ...
+ 5. Repeat, while done is false,
+ a. Let next be the first element of queue.
+ b. Let completion be Completion(next.[[Completion]]).
+ c. If completion.[[Type]] is return, then
+ i. Set generator.[[AsyncGeneratorState]] to awaiting-return.
+ ii. Perform AsyncGeneratorAwaitReturn(generator).
+ iii. Set done to true.
+ ...
+
+flags: [async]
+features: [async-iteration]
+---*/
+
+let caughtErr;
+var g = async function*() {
+ try {
+ yield;
+ return 'this is never returned';
+ } catch (err) {
+ caughtErr = err;
+ return 1;
+ }
+};
+
+let brokenPromise = Promise.resolve(42);
+Object.defineProperty(brokenPromise, 'constructor', {
+ get: function () {
+ throw new Error('broken promise');
+ }
+});
+
+var it = g();
+it.next().then(() => {
+ return it.return(brokenPromise);
+}).then(ret => {
+ assert.sameValue(caughtErr.message, 'broken promise');
+ assert.sameValue(ret.value, 1, 'returned value');
+ assert.sameValue(ret.done, true, 'iterator is closed');
+}).then($DONE, $DONE);
diff --git a/JSTests/test262/test/built-ins/NativeErrors/AggregateError/newtarget-proto-custom.js b/JSTests/test262/test/built-ins/NativeErrors/AggregateError/newtarget-proto-custom.js
index ddd365f..4dcee27 100644
--- a/JSTests/test262/test/built-ins/NativeErrors/AggregateError/newtarget-proto-custom.js
+++ b/JSTests/test262/test/built-ins/NativeErrors/AggregateError/newtarget-proto-custom.js
@@ -27,7 +27,7 @@
a. Let realm be ? GetFunctionRealm(constructor).
b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
Return proto.
-features: [AggregateError]
+features: [AggregateError, Reflect.construct]
---*/
var custom = { x: 42 };
diff --git a/JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/exportName-tostring.js b/JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/throws-if-exportname-not-string.js
similarity index 80%
rename from JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/exportName-tostring.js
rename to JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/throws-if-exportname-not-string.js
index d60773b..a3c22ba 100644
--- a/JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/exportName-tostring.js
+++ b/JSTests/test262/test/built-ins/ShadowRealm/prototype/importValue/throws-if-exportname-not-string.js
@@ -3,7 +3,7 @@
/*---
esid: sec-shadowrealm.prototype.importvalue
description: >
- ShadowRealm.prototype.importValue coerces exportName to string.
+ ShadowRealm.prototype.importValue throws if exportName is not a string.
features: [ShadowRealm]
---*/
@@ -23,8 +23,8 @@
}
};
-assert.throws(Test262Error, () => {
+assert.throws(TypeError, () => {
r.importValue('', exportName);
});
-assert.sameValue(count, 1);
+assert.sameValue(count, 0);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/constructor.js b/JSTests/test262/test/built-ins/Temporal/Calendar/constructor.js
index 461b9ec..5221ae4 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.Calendar());
+assert.throws(TypeError, () => Temporal.Calendar("iso8601"));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/constructor.js
new file mode 100644
index 0000000..78996f2
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.constructor
+description: Test for Temporal.Calendar.prototype.constructor.
+info: The initial value of Temporal.Calendar.prototype.constructor is %Temporal.Calendar%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.Calendar.prototype, "constructor", {
+ value: Temporal.Calendar,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-time-separators.js
new file mode 100644
index 0000000..909b4ac
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dateadd
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.dateAdd(arg, new Temporal.Duration());
+
+ TemporalHelpers.assertPlainDate(
+ result,
+ 2000, 5, "M05", 2,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..66640fe
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dateadd
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.dateAdd(arg, new Temporal.Duration()));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..81afe45
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dateadd
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.dateAdd(arg, new Temporal.Duration());
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/missing-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/missing-properties.js
new file mode 100644
index 0000000..e1694cc
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/missing-properties.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.datefromfields
+description: Errors due to missing properties on fields object are thrown in the correct order
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const instance = new Temporal.Calendar("iso8601");
+
+const missingDay = {
+ get year() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+ get month() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+ get monthCode() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+};
+assert.throws(TypeError, () => instance.dateFromFields(missingDay), "day should be checked before year and month");
+
+let getMonth = false;
+let getMonthCode = false;
+const missingYearAndMonth = {
+ day: 1,
+ get month() {
+ getMonth = true;
+ },
+ get monthCode() {
+ getMonthCode = true;
+ },
+};
+assert.throws(TypeError, () => instance.dateFromFields(missingYearAndMonth), "year should be checked after fetching but before resolving the month");
+assert(getMonth, "year is fetched after month");
+assert(getMonthCode, "year is fetched after monthCode");
+
+const missingMonth = {
+ day: 1,
+ year: 2000,
+};
+assert.throws(TypeError, () => instance.dateFromFields(missingMonth), "month should be resolved last");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
new file mode 100644
index 0000000..e682993
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
@@ -0,0 +1,68 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.datefromfields
+description: Properties on objects passed to dateFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.day",
+ "get fields.day.valueOf",
+ "call fields.day.valueOf",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("iso8601");
+
+const fields = {
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+ day: 1.7,
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.dateFromFields(arg1, arg2);
+TemporalHelpers.assertPlainDate(result, 1, 1, "M01", 1, "date result");
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-time-separators.js
new file mode 100644
index 0000000..ce4b1b0
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-time-separators.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dateuntil
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const date = new Temporal.PlainDate(2000, 5, 3);
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ TemporalHelpers.assertDuration(
+ instance.dateUntil(arg, date),
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ TemporalHelpers.assertDuration(
+ instance.dateUntil(date, arg),
+ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..b3f3618
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-zoneddatetime-slots.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dateuntil
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19));
+instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-time-separators.js
new file mode 100644
index 0000000..7b1d040
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.day
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.day(arg);
+
+ assert.sameValue(
+ result,
+ 2,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..8018094
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.day
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.day(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..492ed24
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.day
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.day(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-time-separators.js
new file mode 100644
index 0000000..262f525
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofweek
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.dayOfWeek(arg);
+
+ assert.sameValue(
+ result,
+ 2,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..b411625
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofweek
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.dayOfWeek(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..856218e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofweek
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.dayOfWeek(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-time-separators.js
new file mode 100644
index 0000000..5d0f436
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofyear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.dayOfYear(arg);
+
+ assert.sameValue(
+ result,
+ 123,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..81fb544
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofyear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.dayOfYear(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..8738b26
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.dayofyear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.dayOfYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-time-separators.js
new file mode 100644
index 0000000..53b94d8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinmonth
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.daysInMonth(arg);
+
+ assert.sameValue(
+ result,
+ 31,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..db08f30
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinmonth
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.daysInMonth(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..c6a233a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinmonth
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.daysInMonth(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-time-separators.js
new file mode 100644
index 0000000..1e545cf
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinweek
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.daysInWeek(arg);
+
+ assert.sameValue(
+ result,
+ 7,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..aec5f24
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinweek
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.daysInWeek(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..2a96f91
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinweek
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.daysInWeek(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-time-separators.js
new file mode 100644
index 0000000..2ef6c0f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinyear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.daysInYear(arg);
+
+ assert.sameValue(
+ result,
+ 366,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..5fa002c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinyear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.daysInYear(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..44d112e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.daysinyear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.daysInYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/fields/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/fields/branding.js
index bd62883..9b42252 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/fields/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/fields/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof fields, "function");
-assert.throws(TypeError, () => fields.call(undefined), "undefined");
-assert.throws(TypeError, () => fields.call(null), "null");
-assert.throws(TypeError, () => fields.call(true), "true");
-assert.throws(TypeError, () => fields.call(""), "empty string");
-assert.throws(TypeError, () => fields.call(Symbol()), "symbol");
-assert.throws(TypeError, () => fields.call(1), "1");
-assert.throws(TypeError, () => fields.call({}), "plain object");
-assert.throws(TypeError, () => fields.call(Temporal.Calendar), "Temporal.Calendar");
-assert.throws(TypeError, () => fields.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype");
+const args = [[]];
+
+assert.throws(TypeError, () => fields.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => fields.apply(null, args), "null");
+assert.throws(TypeError, () => fields.apply(true, args), "true");
+assert.throws(TypeError, () => fields.apply("", args), "empty string");
+assert.throws(TypeError, () => fields.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => fields.apply(1, args), "1");
+assert.throws(TypeError, () => fields.apply({}, args), "plain object");
+assert.throws(TypeError, () => fields.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => fields.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-time-separators.js
new file mode 100644
index 0000000..a963e6d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.inleapyear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.inLeapYear(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..477767c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.inleapyear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.inLeapYear(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..afc1f70
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.inleapyear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.inLeapYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js
index 003cf49..4cde009 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof inLeapYear, "function");
-const arg = new Temporal.PlainDate(2021, 3, 4);
+const args = [new Temporal.PlainDate(2021, 3, 4)];
-assert.throws(TypeError, () => inLeapYear.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => inLeapYear.call(null, arg), "null");
-assert.throws(TypeError, () => inLeapYear.call(true, arg), "true");
-assert.throws(TypeError, () => inLeapYear.call("", arg), "empty string");
-assert.throws(TypeError, () => inLeapYear.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => inLeapYear.call(1, arg), "1");
-assert.throws(TypeError, () => inLeapYear.call({}, arg), "plain object");
-assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar, arg), "Temporal.Calendar");
-assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype");
+assert.throws(TypeError, () => inLeapYear.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => inLeapYear.apply(null, args), "null");
+assert.throws(TypeError, () => inLeapYear.apply(true, args), "true");
+assert.throws(TypeError, () => inLeapYear.apply("", args), "empty string");
+assert.throws(TypeError, () => inLeapYear.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => inLeapYear.apply(1, args), "1");
+assert.throws(TypeError, () => inLeapYear.apply({}, args), "plain object");
+assert.throws(TypeError, () => inLeapYear.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => inLeapYear.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/branding.js
index 0ef2b3f..a1189bb 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof mergeFields, "function");
-assert.throws(TypeError, () => mergeFields.call(undefined), "undefined");
-assert.throws(TypeError, () => mergeFields.call(null), "null");
-assert.throws(TypeError, () => mergeFields.call(true), "true");
-assert.throws(TypeError, () => mergeFields.call(""), "empty string");
-assert.throws(TypeError, () => mergeFields.call(Symbol()), "symbol");
-assert.throws(TypeError, () => mergeFields.call(1), "1");
-assert.throws(TypeError, () => mergeFields.call({}), "plain object");
-assert.throws(TypeError, () => mergeFields.call(Temporal.Calendar), "Temporal.Calendar");
-assert.throws(TypeError, () => mergeFields.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype");
+const args = [{}, {}];
+
+assert.throws(TypeError, () => mergeFields.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => mergeFields.apply(null, args), "null");
+assert.throws(TypeError, () => mergeFields.apply(true, args), "true");
+assert.throws(TypeError, () => mergeFields.apply("", args), "empty string");
+assert.throws(TypeError, () => mergeFields.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => mergeFields.apply(1, args), "1");
+assert.throws(TypeError, () => mergeFields.apply({}, args), "plain object");
+assert.throws(TypeError, () => mergeFields.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => mergeFields.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-time-separators.js
new file mode 100644
index 0000000..a238e54
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.month
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.month(arg);
+
+ assert.sameValue(
+ result,
+ 5,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..fc454a1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.month
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.month(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..523b92d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.month
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.month(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-time-separators.js
new file mode 100644
index 0000000..942c0ec
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthcode
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.monthCode(arg);
+
+ assert.sameValue(
+ result,
+ "M05",
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..5f19824
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthcode
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.monthCode(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..c1e05a4
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthcode
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.monthCode(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding.js
index 63691c7..05cefbf 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof monthDayFromFields, "function");
-assert.throws(TypeError, () => monthDayFromFields.call(undefined), "undefined");
-assert.throws(TypeError, () => monthDayFromFields.call(null), "null");
-assert.throws(TypeError, () => monthDayFromFields.call(true), "true");
-assert.throws(TypeError, () => monthDayFromFields.call(""), "empty string");
-assert.throws(TypeError, () => monthDayFromFields.call(Symbol()), "symbol");
-assert.throws(TypeError, () => monthDayFromFields.call(1), "1");
-assert.throws(TypeError, () => monthDayFromFields.call({}), "plain object");
-assert.throws(TypeError, () => monthDayFromFields.call(Temporal.Calendar), "Temporal.Calendar");
-assert.throws(TypeError, () => monthDayFromFields.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype");
+const args = [{ monthCode: "M01", day: 1 }];
+
+assert.throws(TypeError, () => monthDayFromFields.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => monthDayFromFields.apply(null, args), "null");
+assert.throws(TypeError, () => monthDayFromFields.apply(true, args), "true");
+assert.throws(TypeError, () => monthDayFromFields.apply("", args), "empty string");
+assert.throws(TypeError, () => monthDayFromFields.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => monthDayFromFields.apply(1, args), "1");
+assert.throws(TypeError, () => monthDayFromFields.apply({}, args), "plain object");
+assert.throws(TypeError, () => monthDayFromFields.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => monthDayFromFields.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/missing-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/missing-properties.js
new file mode 100644
index 0000000..3f7b3ee
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/missing-properties.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthdayfromfields
+description: Errors due to missing properties on fields object are thrown in the correct order
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const instance = new Temporal.Calendar("iso8601");
+
+const missingDay = {
+ get year() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+ get month() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+ get monthCode() {
+ TemporalHelpers.assertUnreachable("day should be checked first");
+ },
+};
+assert.throws(TypeError, () => instance.monthDayFromFields(missingDay), "day should be checked before year and month");
+
+let getMonthCode = false;
+let getYear = false;
+const monthWithoutYear = {
+ day: 1,
+ month: 5,
+ get monthCode() {
+ getMonthCode = true;
+ },
+ get year() {
+ getYear = true;
+ },
+};
+assert.throws(TypeError, () => instance.monthDayFromFields(monthWithoutYear), "year/month should be checked after fetching but before resolving the month code");
+assert(getMonthCode, "year/month is checked after fetching monthCode");
+assert(getYear, "year/month is fetched after fetching month");
+
+assert.throws(TypeError, () => instance.monthDayFromFields({ day: 1 }), "month should be resolved last");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
new file mode 100644
index 0000000..d8e5eb4
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
@@ -0,0 +1,68 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthdayfromfields
+description: Properties on objects passed to monthDayFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.day",
+ "get fields.day.valueOf",
+ "call fields.day.valueOf",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("iso8601");
+
+const fields = {
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+ day: 1.7,
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.monthDayFromFields(arg1, arg2);
+TemporalHelpers.assertPlainMonthDay(result, "M01", 1, "monthDay result");
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-time-separators.js
new file mode 100644
index 0000000..aa8a24f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthsinyear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.monthsInYear(arg);
+
+ assert.sameValue(
+ result,
+ 12,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..a5050bb
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthsinyear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.monthsInYear(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..c3d9394
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthsinyear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.monthsInYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js
index 4d16a00..8db1850 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof monthsInYear, "function");
-const arg = new Temporal.PlainDate(2021, 3, 4);
+const args = [new Temporal.PlainDate(2021, 3, 4)];
-assert.throws(TypeError, () => monthsInYear.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => monthsInYear.call(null, arg), "null");
-assert.throws(TypeError, () => monthsInYear.call(true, arg), "true");
-assert.throws(TypeError, () => monthsInYear.call("", arg), "empty string");
-assert.throws(TypeError, () => monthsInYear.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => monthsInYear.call(1, arg), "1");
-assert.throws(TypeError, () => monthsInYear.call({}, arg), "plain object");
-assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar, arg), "Temporal.Calendar");
-assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype");
+assert.throws(TypeError, () => monthsInYear.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => monthsInYear.apply(null, args), "null");
+assert.throws(TypeError, () => monthsInYear.apply(true, args), "true");
+assert.throws(TypeError, () => monthsInYear.apply("", args), "empty string");
+assert.throws(TypeError, () => monthsInYear.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => monthsInYear.apply(1, args), "1");
+assert.throws(TypeError, () => monthsInYear.apply({}, args), "plain object");
+assert.throws(TypeError, () => monthsInYear.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => monthsInYear.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..a1a6b83
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.Calendar
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.Calendar.prototype, Symbol.toStringTag, {
+ value: "Temporal.Calendar",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-time-separators.js
new file mode 100644
index 0000000..5ab5184
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.weekofyear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.weekOfYear(arg);
+
+ assert.sameValue(
+ result,
+ 18,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..1a09253
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.weekofyear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.weekOfYear(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..e185350
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.weekofyear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.weekOfYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js
index d6b5a0f..dc217ea 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof weekOfYear, "function");
-const arg = new Temporal.PlainDate(2021, 7, 20);
+const args = [new Temporal.PlainDate(2021, 7, 20)];
-assert.throws(TypeError, () => weekOfYear.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => weekOfYear.call(null, arg), "null");
-assert.throws(TypeError, () => weekOfYear.call(true, arg), "true");
-assert.throws(TypeError, () => weekOfYear.call("", arg), "empty string");
-assert.throws(TypeError, () => weekOfYear.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => weekOfYear.call(1, arg), "1");
-assert.throws(TypeError, () => weekOfYear.call({}, arg), "plain object");
-assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar, arg), "Temporal.Calendar");
-assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype");
+assert.throws(TypeError, () => weekOfYear.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => weekOfYear.apply(null, args), "null");
+assert.throws(TypeError, () => weekOfYear.apply(true, args), "true");
+assert.throws(TypeError, () => weekOfYear.apply("", args), "empty string");
+assert.throws(TypeError, () => weekOfYear.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => weekOfYear.apply(1, args), "1");
+assert.throws(TypeError, () => weekOfYear.apply({}, args), "plain object");
+assert.throws(TypeError, () => weekOfYear.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => weekOfYear.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-time-separators.js
new file mode 100644
index 0000000..7e2aa42
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.year
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.year(arg);
+
+ assert.sameValue(
+ result,
+ 2000,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..1d5119c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.year
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.year(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..5436a91
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.year
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.year(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js
index 7212b7f..8fdd4c9 100644
--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof yearMonthFromFields, "function");
-const arg = { year: 2021, month: 1 };
+const args = [{ year: 2021, month: 1 }];
-assert.throws(TypeError, () => yearMonthFromFields.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => yearMonthFromFields.call(null, arg), "null");
-assert.throws(TypeError, () => yearMonthFromFields.call(true, arg), "true");
-assert.throws(TypeError, () => yearMonthFromFields.call("", arg), "empty string");
-assert.throws(TypeError, () => yearMonthFromFields.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => yearMonthFromFields.call(1, arg), "1");
-assert.throws(TypeError, () => yearMonthFromFields.call({}, arg), "plain object");
-assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar, arg), "Temporal.Calendar");
-assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype");
+assert.throws(TypeError, () => yearMonthFromFields.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => yearMonthFromFields.apply(null, args), "null");
+assert.throws(TypeError, () => yearMonthFromFields.apply(true, args), "true");
+assert.throws(TypeError, () => yearMonthFromFields.apply("", args), "empty string");
+assert.throws(TypeError, () => yearMonthFromFields.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => yearMonthFromFields.apply(1, args), "1");
+assert.throws(TypeError, () => yearMonthFromFields.apply({}, args), "plain object");
+assert.throws(TypeError, () => yearMonthFromFields.apply(Temporal.Calendar, args), "Temporal.Calendar");
+assert.throws(TypeError, () => yearMonthFromFields.apply(Temporal.Calendar.prototype, args), "Temporal.Calendar.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/missing-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/missing-properties.js
new file mode 100644
index 0000000..d8fb8e2
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/missing-properties.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.yearmonthfromfields
+description: Errors due to missing properties on fields object are thrown in the correct order
+features: [Temporal]
+---*/
+
+const instance = new Temporal.Calendar("iso8601");
+
+let getMonth = false;
+let getMonthCode = false;
+const missingYearAndMonth = {
+ get month() {
+ getMonth = true;
+ },
+ get monthCode() {
+ getMonthCode = true;
+ },
+};
+assert.throws(TypeError, () => instance.yearMonthFromFields(missingYearAndMonth), "year should be checked after fetching but before resolving the month");
+assert(getMonth, "year is fetched after month");
+assert(getMonthCode, "year is fetched after monthCode");
+
+assert.throws(TypeError, () => instance.yearMonthFromFields({ year: 2000 }), "month should be resolved last");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
new file mode 100644
index 0000000..f9cd798
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
@@ -0,0 +1,64 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.yearmonthfromfields
+description: Properties on objects passed to yearMonthFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("iso8601");
+
+const fields = {
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.yearMonthFromFields(arg1, arg2);
+TemporalHelpers.assertPlainYearMonth(result, 1, 1, "M01", "yearMonth result");
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/subclass.js b/JSTests/test262/test/built-ins/Temporal/Calendar/subclass.js
new file mode 100644
index 0000000..e127b012
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Calendar/subclass.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar
+description: Test for Temporal.Calendar subclassing.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+}
+
+const instance = new CustomCalendar("iso8601");
+assert.sameValue(instance.toString(), "iso8601");
+assert.sameValue(Object.getPrototypeOf(instance), CustomCalendar.prototype, "Instance of CustomCalendar");
+assert(instance instanceof CustomCalendar, "Instance of CustomCalendar");
+assert(instance instanceof Temporal.Calendar, "Instance of Temporal.Calendar");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js
index d5552da..b120807 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-string-negative-fractional-units.js
@@ -7,13 +7,13 @@
features: [Temporal]
---*/
-const expectedHours = new Temporal.Duration(0, 0, 0, 0, -24, -34, -4, -404, -442, -799);
+const expectedHours = new Temporal.Duration(0, 0, 0, 0, -24, -34, -4, -404, -442, -800);
const resultHours1 = Temporal.Duration.compare("-PT24.567890123H", expectedHours);
assert.sameValue(resultHours1, 0, "negative fractional hours (first argument)");
const resultHours2 = Temporal.Duration.compare(expectedHours, "-PT24.567890123H");
assert.sameValue(resultHours2, 0, "negative fractional hours (second argument)");
-const expectedMinutes = new Temporal.Duration(0, 0, 0, 0, 0, -1440, -34, -73, -407, -379);
+const expectedMinutes = new Temporal.Duration(0, 0, 0, 0, 0, -1440, -34, -73, -407, -380);
const resultMinutes1 = Temporal.Duration.compare("-PT1440.567890123M", expectedMinutes);
assert.sameValue(resultMinutes1, 0, "negative fractional minutes (first argument)");
const resultMinutes2 = Temporal.Duration.compare("-PT1440.567890123M", expectedMinutes);
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js
index b9d66b3..0374db1 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-negative-fractional-units.js
@@ -9,7 +9,7 @@
---*/
const resultHours = Temporal.Duration.from("-PT24.567890123H");
-TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, -24, -34, -4, -404, -442, -799, "negative fractional hours");
+TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, -24, -34, -4, -404, -442, -800, "negative fractional hours");
const resultMinutes = Temporal.Duration.from("-PT1440.567890123M");
-TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, -1440, -34, -73, -407, -379, "negative fractional minutes");
+TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, -1440, -34, -73, -407, -380, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js
index 8c4b038..e0e0e56 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.Duration();
const resultHours = instance.add("-PT24.567890123H");
-TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, -24, -34, -4, -404, -442, -799, "negative fractional hours");
+TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, -24, -34, -4, -404, -442, -800, "negative fractional hours");
const resultMinutes = instance.add("-PT1440.567890123M");
-TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, -1440, -34, -73, -407, -379, "negative fractional minutes");
+TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, -1440, -34, -73, -407, -380, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/branding.js
index e311bd4..efc325d 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.Duration), "Temporal.Duration");
-assert.throws(TypeError, () => add.call(Temporal.Duration.prototype), "Temporal.Duration.prototype");
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.Duration, args), "Temporal.Duration");
+assert.throws(TypeError, () => add.apply(Temporal.Duration.prototype, args), "Temporal.Duration.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/constructor.js
new file mode 100644
index 0000000..38cd1d6
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.duration.prototype.constructor
+description: Test for Temporal.Duration.prototype.constructor.
+info: The initial value of Temporal.Duration.prototype.constructor is %Temporal.Duration%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.Duration.prototype, "constructor", {
+ value: Temporal.Duration,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/branding.js
index 503b77f..8b5bc66 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof round, "function");
-assert.throws(TypeError, () => round.call(undefined), "undefined");
-assert.throws(TypeError, () => round.call(null), "null");
-assert.throws(TypeError, () => round.call(true), "true");
-assert.throws(TypeError, () => round.call(""), "empty string");
-assert.throws(TypeError, () => round.call(Symbol()), "symbol");
-assert.throws(TypeError, () => round.call(1), "1");
-assert.throws(TypeError, () => round.call({}), "plain object");
-assert.throws(TypeError, () => round.call(Temporal.Duration), "Temporal.Duration");
-assert.throws(TypeError, () => round.call(Temporal.Duration.prototype), "Temporal.Duration.prototype");
+const args = ["hour"];
+
+assert.throws(TypeError, () => round.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => round.apply(null, args), "null");
+assert.throws(TypeError, () => round.apply(true, args), "true");
+assert.throws(TypeError, () => round.apply("", args), "empty string");
+assert.throws(TypeError, () => round.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => round.apply(1, args), "1");
+assert.throws(TypeError, () => round.apply({}, args), "plain object");
+assert.throws(TypeError, () => round.apply(Temporal.Duration, args), "Temporal.Duration");
+assert.throws(TypeError, () => round.apply(Temporal.Duration.prototype, args), "Temporal.Duration.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-convert.js
new file mode 100644
index 0000000..1113fd3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.duration.prototype.round
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Duration(0, 0, 0, 365);
+
+assert.throws(Test262Error, () => instance.round({ relativeTo: arg, largestUnit: "years" }));
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-slots.js
new file mode 100644
index 0000000..dfb3364
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.duration.prototype.round
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Duration(0, 0, 0, 365);
+instance.round({ relativeTo: arg, largestUnit: "years" });
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js
index 3c940f2..ed93599 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.Duration();
const resultHours = instance.subtract("-PT24.567890123H");
-TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, 24, 34, 4, 404, 442, 799, "negative fractional hours");
+TemporalHelpers.assertDuration(resultHours, 0, 0, 0, 0, 24, 34, 4, 404, 442, 800, "negative fractional hours");
const resultMinutes = instance.subtract("-PT1440.567890123M");
-TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, 1440, 34, 73, 407, 379, "negative fractional minutes");
+TemporalHelpers.assertDuration(resultMinutes, 0, 0, 0, 0, 0, 1440, 34, 73, 407, 380, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/branding.js
index e9264d8..f9dca06 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.Duration), "Temporal.Duration");
-assert.throws(TypeError, () => subtract.call(Temporal.Duration.prototype), "Temporal.Duration.prototype");
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.Duration, args), "Temporal.Duration");
+assert.throws(TypeError, () => subtract.apply(Temporal.Duration.prototype, args), "Temporal.Duration.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..39e847f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.duration.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.Duration
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.Duration.prototype, Symbol.toStringTag, {
+ value: "Temporal.Duration",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/branding.js
index a6841b0b..325012a 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof total, "function");
-assert.throws(TypeError, () => total.call(undefined), "undefined");
-assert.throws(TypeError, () => total.call(null), "null");
-assert.throws(TypeError, () => total.call(true), "true");
-assert.throws(TypeError, () => total.call(""), "empty string");
-assert.throws(TypeError, () => total.call(Symbol()), "symbol");
-assert.throws(TypeError, () => total.call(1), "1");
-assert.throws(TypeError, () => total.call({}), "plain object");
-assert.throws(TypeError, () => total.call(Temporal.Duration), "Temporal.Duration");
-assert.throws(TypeError, () => total.call(Temporal.Duration.prototype), "Temporal.Duration.prototype");
+const args = ["hour"];
+
+assert.throws(TypeError, () => total.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => total.apply(null, args), "null");
+assert.throws(TypeError, () => total.apply(true, args), "true");
+assert.throws(TypeError, () => total.apply("", args), "empty string");
+assert.throws(TypeError, () => total.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => total.apply(1, args), "1");
+assert.throws(TypeError, () => total.apply({}, args), "plain object");
+assert.throws(TypeError, () => total.apply(Temporal.Duration, args), "Temporal.Duration");
+assert.throws(TypeError, () => total.apply(Temporal.Duration.prototype, args), "Temporal.Duration.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js
index b04b2fe..3df3c4f 100644
--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof with_, "function");
-const arg = { years: 3 };
+const args = [{ years: 3 }];
-assert.throws(TypeError, () => with_.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => with_.call(null, arg), "null");
-assert.throws(TypeError, () => with_.call(true, arg), "true");
-assert.throws(TypeError, () => with_.call("", arg), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => with_.call(1, arg), "1");
-assert.throws(TypeError, () => with_.call({}, arg), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.Duration, arg), "Temporal.Duration");
-assert.throws(TypeError, () => with_.call(Temporal.Duration.prototype, arg), "Temporal.Duration.prototype");
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.Duration, args), "Temporal.Duration");
+assert.throws(TypeError, () => with_.apply(Temporal.Duration.prototype, args), "Temporal.Duration.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/subclass.js b/JSTests/test262/test/built-ins/Temporal/Duration/subclass.js
new file mode 100644
index 0000000..7363d21
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Duration/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.duration
+description: Test for Temporal.Duration subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomDuration extends Temporal.Duration {
+}
+
+const instance = new CustomDuration(1, 1, 0, 1);
+TemporalHelpers.assertDuration(instance, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0);
+assert.sameValue(Object.getPrototypeOf(instance), CustomDuration.prototype, "Instance of CustomDuration");
+assert(instance instanceof CustomDuration, "Instance of CustomDuration");
+assert(instance instanceof Temporal.Duration, "Instance of Temporal.Duration");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-invalid.js
new file mode 100644
index 0000000..1687124
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-invalid.js
@@ -0,0 +1,71 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.compare
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const epoch = new Temporal.Instant(0n);
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => Temporal.Instant.compare(arg, epoch),
+ `"${arg}" should not be a valid ISO string for an Instant (first argument)`
+ );
+ assert.throws(
+ RangeError,
+ () => Temporal.Instant.compare(epoch, arg),
+ `"${arg}" should not be a valid ISO string for an Instant (second argument)`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..82cf3b5
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const epoch = new Temporal.Instant(0n);
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.Instant.compare(arg, epoch),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.Instant.compare(epoch, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/constructor.js b/JSTests/test262/test/built-ins/Temporal/Instant/constructor.js
index ec1d0d7..1b653c8 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.Instant());
+assert.throws(TypeError, () => Temporal.Instant(0n));
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-invalid.js
new file mode 100644
index 0000000..8797b8e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-invalid.js
@@ -0,0 +1,64 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.from
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => Temporal.Instant.from(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-time-separators.js
new file mode 100644
index 0000000..d179983
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string-time-separators.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.from
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.Instant.from(arg);
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 0n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string.js
new file mode 100644
index 0000000..be1af8e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-string.js
@@ -0,0 +1,53 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.from
+description: Various string arguments.
+features: [Temporal]
+---*/
+
+const tests = [
+ ['1976-11-18T15:23z', 217178580000000000n],
+ ['1976-11-18T15:23:30.1Z', 217178610100000000n],
+ ['1976-11-18T15:23:30.12Z', 217178610120000000n],
+ ['1976-11-18T15:23:30.123Z', 217178610123000000n],
+ ['1976-11-18T15:23:30.1234Z', 217178610123400000n],
+ ['1976-11-18T15:23:30.12345Z', 217178610123450000n],
+ ['1976-11-18T15:23:30.123456Z', 217178610123456000n],
+ ['1976-11-18T15:23:30.1234567Z', 217178610123456700n],
+ ['1976-11-18T15:23:30.12345678Z', 217178610123456780n],
+ ['1976-11-18T15:23:30.123456789Z', 217178610123456789n],
+ ['1976-11-18T15:23:30,12Z', 217178610120000000n],
+ ['1976-11-18T15:23:30.12\u221202:00', 217185810120000000n],
+ ['\u2212009999-11-18T15:23:30.12Z', -377677326989880000000n],
+ ['19761118T15:23:30.1+00:00', 217178610100000000n],
+ ['1976-11-18T152330.1+00:00', 217178610100000000n],
+ ['1976-11-18T15:23:30.1+0000', 217178610100000000n],
+ ['1976-11-18T152330.1+0000', 217178610100000000n],
+ ['19761118T15:23:30.1+0000', 217178610100000000n],
+ ['19761118T152330.1+00:00', 217178610100000000n],
+ ['+0019761118T15:23:30.1+00:00', 217178610100000000n],
+ ['+001976-11-18T152330.1+00:00', 217178610100000000n],
+ ['+001976-11-18T15:23:30.1+0000', 217178610100000000n],
+ ['+001976-11-18T152330.1+0000', 217178610100000000n],
+ ['+0019761118T15:23:30.1+0000', 217178610100000000n],
+ ['+0019761118T152330.1+00:00', 217178610100000000n],
+ ['+0019761118T152330.1+0000', 217178610100000000n],
+ ['1976-11-18T15:23:30+00', 217178610000000000n],
+ ['1976-11-18T15Z', 217177200000000000n],
+ ['1976-11-18T15:23:30.123456789Z[u-ca=discord]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[+00]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[+00:00]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[-00]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[-00:00]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[+12]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[UTC]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[Europe/Paris]', 217178610123456789n],
+ ['1976-11-18T15:23:30.123456789Z[NotATimeZone]', 217178610123456789n],
+];
+
+for (const [arg, expected] of tests) {
+ const result = Temporal.Instant.from(arg);
+ assert.sameValue(result.epochNanoseconds, expected, `Instant.from(${arg})`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js
index 9fee0fa..fa7b07b 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/argument-string-negative-fractional-units.js
@@ -10,7 +10,7 @@
const instance = new Temporal.Instant(1_000_000_000_000_000_000n);
const resultHours = instance.add("-PT24.567890123H");
-assert.sameValue(resultHours.epochNanoseconds, 999_911_555_595_557_201n, "negative fractional hours");
+assert.sameValue(resultHours.epochNanoseconds, 999_911_555_595_557_200n, "negative fractional hours");
const resultMinutes = instance.add("-PT1440.567890123M");
-assert.sameValue(resultMinutes.epochNanoseconds, 999_913_565_926_592_621n, "negative fractional minutes");
+assert.sameValue(resultMinutes.epochNanoseconds, 999_913_565_926_592_620n, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js
index cccdbf6..996c907 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof add, "function");
-const arg = new Temporal.Duration(0, 0, 0, 0, 5);
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
-assert.throws(TypeError, () => add.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => add.call(null, arg), "null");
-assert.throws(TypeError, () => add.call(true, arg), "true");
-assert.throws(TypeError, () => add.call("", arg), "empty string");
-assert.throws(TypeError, () => add.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => add.call(1, arg), "1");
-assert.throws(TypeError, () => add.call({}, arg), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.Instant, arg), "Temporal.Instant");
-assert.throws(TypeError, () => add.call(Temporal.Instant.prototype, arg), "Temporal.Instant.prototype");
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => add.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/constructor.js
new file mode 100644
index 0000000..a93677d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.constructor
+description: Test for Temporal.Instant.prototype.constructor.
+info: The initial value of Temporal.Instant.prototype.constructor is %Temporal.Instant%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.Instant.prototype, "constructor", {
+ value: Temporal.Instant,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-invalid.js
new file mode 100644
index 0000000..581de1c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.equals
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.Instant(0n);
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.equals(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..4fb47ea
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.Instant(0n);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/branding.js
index 5aafe30..2a02133 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => equals.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = [new Temporal.Instant(123456n)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => equals.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/branding.js
index 116f31b..7231383 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof round, "function");
-assert.throws(TypeError, () => round.call(undefined), "undefined");
-assert.throws(TypeError, () => round.call(null), "null");
-assert.throws(TypeError, () => round.call(true), "true");
-assert.throws(TypeError, () => round.call(""), "empty string");
-assert.throws(TypeError, () => round.call(Symbol()), "symbol");
-assert.throws(TypeError, () => round.call(1), "1");
-assert.throws(TypeError, () => round.call({}), "plain object");
-assert.throws(TypeError, () => round.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => round.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = ["hour"];
+
+assert.throws(TypeError, () => round.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => round.apply(null, args), "null");
+assert.throws(TypeError, () => round.apply(true, args), "true");
+assert.throws(TypeError, () => round.apply("", args), "empty string");
+assert.throws(TypeError, () => round.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => round.apply(1, args), "1");
+assert.throws(TypeError, () => round.apply({}, args), "plain object");
+assert.throws(TypeError, () => round.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => round.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-invalid.js
new file mode 100644
index 0000000..9ce112b
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.since
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.Instant(0n);
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.since(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..6dbacec
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.Instant(0n);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/branding.js
index 0716c62..87f70cd 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => since.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = [new Temporal.Instant(123456n)];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => since.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js
index 4ae5476..4ccd922 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/argument-string-negative-fractional-units.js
@@ -10,7 +10,7 @@
const instance = new Temporal.Instant(1_000_000_000_000_000_000n);
const resultHours = instance.subtract("-PT24.567890123H");
-assert.sameValue(resultHours.epochNanoseconds, 1_000_088_444_404_442_799n, "negative fractional hours");
+assert.sameValue(resultHours.epochNanoseconds, 1_000_088_444_404_442_800n, "negative fractional hours");
const resultMinutes = instance.subtract("-PT1440.567890123M");
-assert.sameValue(resultMinutes.epochNanoseconds, 1_000_086_434_073_407_379n, "negative fractional minutes");
+assert.sameValue(resultMinutes.epochNanoseconds, 1_000_086_434_073_407_380n, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js
index a7aac12..55c7e45 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js
@@ -11,14 +11,14 @@
assert.sameValue(typeof subtract, "function");
-const arg = new Temporal.Duration(0, 0, 0, 0, 5);
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
-assert.throws(TypeError, () => subtract.call(undefined, arg), "undefined");
-assert.throws(TypeError, () => subtract.call(null, arg), "null");
-assert.throws(TypeError, () => subtract.call(true, arg), "true");
-assert.throws(TypeError, () => subtract.call("", arg), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol(), arg), "symbol");
-assert.throws(TypeError, () => subtract.call(1, arg), "1");
-assert.throws(TypeError, () => subtract.call({}, arg), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.Instant, arg), "Temporal.Instant");
-assert.throws(TypeError, () => subtract.call(Temporal.Instant.prototype, arg), "Temporal.Instant.prototype");
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => subtract.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/basic.js
index 9e65443..fd6ed3d 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/basic.js
@@ -1,16 +1,23 @@
-// Copyright (C) 2020 Igalia, S.L. All rights reserved.
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-temporal.instant.prototype.tojson
-description: Basic tests for toJSON()
-features: [Temporal]
+description: Basic behavior for toJSON
+features: [BigInt, Temporal]
---*/
-const instantBeforeEpoch = Temporal.Instant.from("1963-02-13T10:36:29.123456789+01:00");
-assert.sameValue(instantBeforeEpoch.toJSON(), "1963-02-13T09:36:29.123456789Z");
+const tests = [
+ [new Temporal.Instant(192_258_181_000_000_000n), "1976-02-04T05:03:01Z"],
+ [new Temporal.Instant(0n), "1970-01-01T00:00:00Z"],
+ [new Temporal.Instant(30_000_000_000n), "1970-01-01T00:00:30Z"],
+ [new Temporal.Instant(30_123_400_000n), "1970-01-01T00:00:30.1234Z"],
+];
-const instantAfterEpoch = Temporal.Instant.from("1976-11-18T15:23:30.123456789+01:00");
-assert.sameValue(instantAfterEpoch.toJSON(), "1976-11-18T14:23:30.123456789Z");
-assert.sameValue(instantAfterEpoch.toJSON("+01:00"), "1976-11-18T14:23:30.123456789Z",
- "after epoch with ignored argument");
+const options = new Proxy({}, {
+ get() { throw new Test262Error("should not get properties off argument") }
+});
+for (const [instant, expected] of tests) {
+ assert.sameValue(instant.toJSON(), expected, "toJSON without argument");
+ assert.sameValue(instant.toJSON(options), expected, "toJSON with argument");
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js
index 5e37b7f..6c47829 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js
@@ -7,14 +7,11 @@
features: [BigInt, Temporal]
---*/
-const zeroSeconds = new Temporal.Instant(0n);
-const wholeSeconds = new Temporal.Instant(30_000_000_000n);
-const subSeconds = new Temporal.Instant(30_123_400_000n);
-
const tests = [
- [zeroSeconds, "1970-01-01T00:00:00Z"],
- [wholeSeconds, "1970-01-01T00:00:30Z"],
- [subSeconds, "1970-01-01T00:00:30.1234Z"],
+ [new Temporal.Instant(192_258_181_000_000_000n), "1976-02-04T05:03:01Z"],
+ [new Temporal.Instant(0n), "1970-01-01T00:00:00Z"],
+ [new Temporal.Instant(30_000_000_000n), "1970-01-01T00:00:30Z"],
+ [new Temporal.Instant(30_123_400_000n), "1970-01-01T00:00:30.1234Z"],
];
for (const [instant, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js
index e6ba963..f79500d 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js
@@ -7,10 +7,13 @@
features: [BigInt, Temporal]
---*/
+const fewSeconds = new Temporal.Instant(192_258_181_000_000_000n);
const zeroSeconds = new Temporal.Instant(0n);
const wholeSeconds = new Temporal.Instant(30_000_000_000n);
const subSeconds = new Temporal.Instant(30_123_400_000n);
+assert.sameValue(fewSeconds.toString({ fractionalSecondDigits: 0 }), "1976-02-04T05:03:01Z",
+ "pads parts with 0");
assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1970-01-01T00:00:30Z",
"truncates 4 decimal places to 0");
assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:00.00Z",
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js
index be0fbf7..05b0d85 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js
@@ -16,14 +16,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.Instant(0n);
-const wholeSeconds = new Temporal.Instant(30_000_000_000n);
-const subSeconds = new Temporal.Instant(30_123_400_000n);
-
const tests = [
- [zeroSeconds, "1970-01-01T00:00:00Z"],
- [wholeSeconds, "1970-01-01T00:00:30Z"],
- [subSeconds, "1970-01-01T00:00:30.1234Z"],
+ [new Temporal.Instant(192_258_181_000_000_000n), "1976-02-04T05:03:01Z"],
+ [new Temporal.Instant(0n), "1970-01-01T00:00:00Z"],
+ [new Temporal.Instant(30_000_000_000n), "1970-01-01T00:00:30Z"],
+ [new Temporal.Instant(30_123_400_000n), "1970-01-01T00:00:30.1234Z"],
];
for (const [instant, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toStringTag/prop-desc.js
index 90e55d4..74a41b0 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toStringTag/prop-desc.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toStringTag/prop-desc.js
@@ -8,8 +8,7 @@
features: [Temporal]
---*/
-const { Instant } = Temporal;
-verifyProperty(Instant.prototype, Symbol.toStringTag, {
+verifyProperty(Temporal.Instant.prototype, Symbol.toStringTag, {
value: "Temporal.Instant",
writable: false,
enumerable: false,
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/branding.js
index 71409a3..3c68208 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toZonedDateTime, "function");
-assert.throws(TypeError, () => toZonedDateTime.call(undefined), "undefined");
-assert.throws(TypeError, () => toZonedDateTime.call(null), "null");
-assert.throws(TypeError, () => toZonedDateTime.call(true), "true");
-assert.throws(TypeError, () => toZonedDateTime.call(""), "empty string");
-assert.throws(TypeError, () => toZonedDateTime.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toZonedDateTime.call(1), "1");
-assert.throws(TypeError, () => toZonedDateTime.call({}), "plain object");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = [{ calendar: new Temporal.Calendar("iso8601"), timeZone: new Temporal.TimeZone("UTC") }];
+
+assert.throws(TypeError, () => toZonedDateTime.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toZonedDateTime.apply(null, args), "null");
+assert.throws(TypeError, () => toZonedDateTime.apply(true, args), "true");
+assert.throws(TypeError, () => toZonedDateTime.apply("", args), "empty string");
+assert.throws(TypeError, () => toZonedDateTime.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toZonedDateTime.apply(1, args), "1");
+assert.throws(TypeError, () => toZonedDateTime.apply({}, args), "plain object");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding.js
index 091591a..a5997e2 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toZonedDateTimeISO, "function");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(undefined), "undefined");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(null), "null");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(true), "true");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(""), "empty string");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(1), "1");
-assert.throws(TypeError, () => toZonedDateTimeISO.call({}), "plain object");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => toZonedDateTimeISO.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = [{ timeZone: new Temporal.TimeZone("UTC") }];
+
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(null, args), "null");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(true, args), "true");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply("", args), "empty string");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(1, args), "1");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply({}, args), "plain object");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => toZonedDateTimeISO.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-invalid.js
new file mode 100644
index 0000000..9658525
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.until
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.Instant(0n);
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.until(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..beb1b48
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.Instant(0n);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/branding.js
index 70fb066..6ccbce1 100644
--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.Instant), "Temporal.Instant");
-assert.throws(TypeError, () => until.call(Temporal.Instant.prototype), "Temporal.Instant.prototype");
+const args = [new Temporal.Instant(123456n)];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.Instant, args), "Temporal.Instant");
+assert.throws(TypeError, () => until.apply(Temporal.Instant.prototype, args), "Temporal.Instant.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/valueOf/basic.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/valueOf/basic.js
new file mode 100644
index 0000000..6f4bcea
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/valueOf/basic.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant.prototype.valueof
+description: Basic tests for valueOf().
+features: [Temporal]
+---*/
+
+const instant = new Temporal.Instant(100n);
+const instant2 = new Temporal.Instant(987654321n);
+
+assert.throws(TypeError, () => instant.valueOf(), "valueOf");
+assert.throws(TypeError, () => instant < instant, "<");
+assert.throws(TypeError, () => instant <= instant, "<=");
+assert.throws(TypeError, () => instant > instant, ">");
+assert.throws(TypeError, () => instant >= instant, ">=");
+assert.sameValue(instant === instant, true, "===");
+assert.sameValue(instant === instant2, false, "===");
+assert.sameValue(instant !== instant, false, "!==");
+assert.sameValue(instant !== instant2, true, "!==");
diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/subclass.js b/JSTests/test262/test/built-ins/Temporal/Instant/subclass.js
new file mode 100644
index 0000000..8af21a1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/Instant/subclass.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.instant
+description: Test for Temporal.Instant subclassing.
+features: [Temporal]
+---*/
+
+class CustomInstant extends Temporal.Instant {
+}
+
+const instance = new CustomInstant(0n);
+assert.sameValue(instance.epochNanoseconds, 0n);
+assert.sameValue(Object.getPrototypeOf(instance), CustomInstant.prototype, "Instance of CustomInstant");
+assert(instance instanceof CustomInstant, "Instance of CustomInstant");
+assert(instance instanceof Temporal.Instant, "Instance of Temporal.Instant");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-convert.js
new file mode 100644
index 0000000..0e00a12
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-convert.js
@@ -0,0 +1,53 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate
+description: PlainDate constructor with non-integer arguments.
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(2020.6, 11.7, 24.1),
+ 2020, 11, "M11", 24, "positive fractional");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(-2020.6, 11.7, 24.1),
+ -2020, 11, "M11", 24, "negative fractional");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(undefined, 11, 24),
+ 0, 11, "M11", 24, "undefined");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(null, 11, 24),
+ 0, 11, "M11", 24, "null");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(true, 11, 24),
+ 1, 11, "M11", 24, "boolean");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate("2020.6", "11.7", "24.1"),
+ 2020, 11, "M11", 24, "fractional strings");
+
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate("invalid", 11, 24),
+ 0, 11, "M11", 24, "invalid string");
+
+for (const invalid of [Symbol(), 1n]) {
+ assert.throws(TypeError, () => new Temporal.PlainDate(invalid, 11, 24), `year ${typeof invalid}`);
+ assert.throws(TypeError, () => new Temporal.PlainDate(2020, invalid, 24), `month ${typeof invalid}`);
+ assert.throws(TypeError, () => new Temporal.PlainDate(2020, 11, invalid), `day ${typeof invalid}`);
+}
+
+const actual = [];
+const args = [
+ TemporalHelpers.toPrimitiveObserver(actual, 2020, "year"),
+ TemporalHelpers.toPrimitiveObserver(actual, 11, "month"),
+ TemporalHelpers.toPrimitiveObserver(actual, 24, "day"),
+];
+TemporalHelpers.assertPlainDate(new Temporal.PlainDate(...args),
+ 2020, 11, "M11", 24, "invalid string");
+assert.compareArray(actual, [
+ "get year.valueOf",
+ "call year.valueOf",
+ "get month.valueOf",
+ "call month.valueOf",
+ "get day.valueOf",
+ "call day.valueOf",
+]);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-invalid.js
new file mode 100644
index 0000000..2b9ea5d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/argument-invalid.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate
+description: PlainDate constructor with invalid iso dates
+features: [Temporal]
+---*/
+
+const tests = [
+ [2020, 0, 24],
+ [2020, 13, 24],
+ [2020, -3, 24],
+ [2020, 12, 32],
+ [2020, 2, 30],
+ [2019, 2, 29],
+ [2019, 2, 0],
+ [2019, 2, -20],
+];
+
+for (const [year, month, day] of tests) {
+ assert.throws(RangeError, () => new Temporal.PlainDate(year, month, day),
+ `year=${year}, month=${month}, day=${day}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-plaindatetime.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-plaindatetime.js
index a41d6b0..be83e03 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-plaindatetime.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-plaindatetime.js
@@ -15,14 +15,36 @@
features: [Temporal]
---*/
-const date = new Temporal.PlainDate(2000, 5, 2);
+const sameDate = new Temporal.PlainDate(2000, 5, 2);
+const earlierDate = new Temporal.PlainDate(1920, 7, 3);
+const laterDate = new Temporal.PlainDate(2005, 1, 12);
TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
- const result = Temporal.PlainDate.compare(datetime, date);
- assert.sameValue(result, 0, "comparison result");
-});
+ const result = Temporal.PlainDate.compare(datetime, sameDate);
+ assert.sameValue(result, 0, "First argument, same date: comparison result");
+}, "First argument, same date");
TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
- const result = Temporal.PlainDate.compare(date, datetime);
- assert.sameValue(result, 0, "comparison result");
-});
+ const result = Temporal.PlainDate.compare(datetime, earlierDate);
+ assert.sameValue(result, 1, "First argument, earlier date: comparison result");
+}, "First argument, earlier date");
+
+TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
+ const result = Temporal.PlainDate.compare(datetime, laterDate);
+ assert.sameValue(result, -1, "First argument, later date: comparison result");
+}, "First argument, later date");
+
+TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
+ const result = Temporal.PlainDate.compare(sameDate, datetime);
+ assert.sameValue(result, 0, "Second argument, same date: comparison result");
+}, "Second argument, same date");
+
+TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
+ const result = Temporal.PlainDate.compare(earlierDate, datetime);
+ assert.sameValue(result, -1, "Second argument, earlier date: comparison result");
+}, "Second argument, earlier date");
+
+TemporalHelpers.checkPlainDateTimeConversionFastPath((datetime) => {
+ const result = Temporal.PlainDate.compare(laterDate, datetime);
+ assert.sameValue(result, 1, "Second argument, later date: comparison result");
+}, "Second argument, later date");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..3f9ecb4
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const date = new Temporal.PlainDate(2000, 5, 2);
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.PlainDate.compare(arg, date),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.PlainDate.compare(date, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..cea7713
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.compare
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18));
+Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime.js
new file mode 100644
index 0000000..5decb5a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-zoneddatetime.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.compare
+description: ZonedDateTime is supported.
+features: [Temporal]
+---*/
+
+const zdt = new Temporal.ZonedDateTime(0n, "UTC");
+assert.sameValue(
+ Temporal.PlainDate.compare(zdt, new Temporal.PlainDate(1970, 1, 1)),
+ 0, "same date, ZDT first");
+assert.sameValue(
+ Temporal.PlainDate.compare(new Temporal.PlainDate(1970, 1, 1), zdt),
+ 0, "same date, ZDT second");
+assert.sameValue(
+ Temporal.PlainDate.compare(zdt, new Temporal.PlainDate(1976, 11, 18)),
+ -1, "different date, ZDT first");
+assert.sameValue(
+ Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), zdt),
+ 1, "different date, ZDT second");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/constructor.js
index 67400c0..ba24a20 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.PlainDate());
+assert.throws(TypeError, () => Temporal.PlainDate(1970, 1, 2));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainDate/from/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js
index 6eb685f..5dbdceb 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js
@@ -8,7 +8,8 @@
features: [Temporal]
---*/
-const orig = new Temporal.PlainDate(2000, 5, 2);
+const calendar = new Temporal.Calendar("iso8601");
+const orig = new Temporal.PlainDate(2000, 5, 2, calendar);
const result = Temporal.PlainDate.from(orig);
TemporalHelpers.assertPlainDate(
@@ -17,6 +18,12 @@
"PlainDate is copied"
);
+assert.sameValue(
+ result.calendar,
+ calendar,
+ "Calendar is copied"
+);
+
assert.notSameValue(
result,
orig,
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar.js
new file mode 100644
index 0000000..8747c7e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.from
+description: Property bag is correctly converted into PlainDate
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+const plainDate = Temporal.PlainDate.from({ year: 1976, month: 11, day: 18, calendar });
+TemporalHelpers.assertPlainDate(plainDate, 1976, 11, "M11", 18);
+assert.sameValue(plainDate.calendar, calendar);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-time-separators.js
new file mode 100644
index 0000000..31e8f4b
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-time-separators.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.from
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.PlainDate.from(arg);
+
+ TemporalHelpers.assertPlainDate(
+ result,
+ 2000, 5, "M05", 2,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..658e86c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.from
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainDate(1976, 11, 18);
+
+assert.throws(Test262Error, () => Temporal.PlainDate.from(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..0341c0c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime-slots.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.from
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+Temporal.PlainDate.from(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime.js
new file mode 100644
index 0000000..133ea14
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-zoneddatetime.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.from
+description: A ZonedDateTime object is handled separately
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+const zdt = new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, "UTC", calendar);
+const result = Temporal.PlainDate.from(zdt);
+
+TemporalHelpers.assertPlainDate(
+ result,
+ 2001, 9, "M09", 9,
+ "ZonedDateTime is converted"
+);
+
+assert.sameValue(
+ result.calendar,
+ calendar,
+ "Calendar is copied"
+);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-invalid.js
deleted file mode 100644
index 615c95c..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-invalid.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.from
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const fields = { year: 2000, month: 11, day: 2 };
-
-const values = [null, true, "hello", Symbol("foo"), 1, 1n];
-for (const badOptions of values) {
- assert.throws(TypeError, () => Temporal.PlainDate.from(fields, badOptions));
-}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js
index 27e4999..f33ca21 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js
@@ -27,13 +27,6 @@
{ year: 2000, month: 5, day: 2 },
"2000-05-02",
];
-const invalidOverflow = [
- "",
- "other string",
- "balance",
- "CONSTRAIN",
- "constra\u0131n",
-];
const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"];
for (const item of validItems) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/branding.js
index b60ec44..fe9b336 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => add.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => add.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/calendar-invalid-return.js
new file mode 100644
index 0000000..982c09e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.add
+description: Throw when the returned value from the calendar's dateAdd method is not a PlainDate.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ dateAdd() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.PlainDate, "Temporal.PlainDate"],
+ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.add({ years: 1 }), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/custom.js
new file mode 100644
index 0000000..5e449dc
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/custom.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.add
+description: Basic tests with custom calendar
+includes: [compareArray.js,temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const result = new Temporal.PlainDate(1920, 5, 3);
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dateAdd(...args) {
+ ++calls;
+ assert.sameValue(args.length, 3, "Three arguments");
+ assert.sameValue(args[0], plainDate, "First argument");
+ TemporalHelpers.assertDuration(args[1], 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Second argument");
+ assert.sameValue(typeof args[2], "object", "Third argument: type");
+ assert.sameValue(Object.getPrototypeOf(args[2]), null, "Third argument: prototype");
+ assert.compareArray(Object.keys(args[2]), [], "Third argument: keys");
+ return result;
+ }
+}
+const calendar = new CustomCalendar();
+const plainDate = new Temporal.PlainDate(1976, 11, 18, calendar);
+assert.sameValue(plainDate.add({ years: 43 }), result);
+assert.sameValue(calls, 1);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-invalid.js
deleted file mode 100644
index 6788944..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-invalid.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.prototype.add
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const plainDate = new Temporal.PlainDate(2000, 1, 31);
-const duration = { months: 1 };
-
-const values = [null, true, "hello", Symbol("foo"), 1, 1n];
-for (const badOptions of values) {
- assert.throws(TypeError, () => plainDate.add(duration, badOptions));
-}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js
index 68cc468..8ce45d4 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js
@@ -9,7 +9,5 @@
---*/
const jan31 = Temporal.PlainDate.from("2020-01-31");
-TemporalHelpers.assertPlainDate(jan31.add({ months: 1 }),
- 2020, 2, "M02", 29, "implicit");
TemporalHelpers.assertPlainDate(jan31.add({ months: 1 }, { overflow: "constrain" }),
- 2020, 2, "M02", 29, "explicit");
+ 2020, 2, "M02", 29);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/constructor.js
new file mode 100644
index 0000000..dae8f18
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.constructor
+description: Test for Temporal.PlainDate.prototype.constructor.
+info: The initial value of Temporal.PlainDate.prototype.constructor is %Temporal.PlainDate%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainDate.prototype, "constructor", {
+ value: Temporal.PlainDate,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfWeek/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfWeek/custom.js
new file mode 100644
index 0000000..faadc30
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfWeek/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.dayofweek
+description: Custom calendar tests for dayOfWeek().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dayOfWeek(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "dayOfWeek arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.dayOfWeek;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfYear/custom.js
new file mode 100644
index 0000000..f435eec
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/dayOfYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.dayofyear
+description: Custom calendar tests for dayOfYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dayOfYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "dayOfYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.dayOfYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/basic.js
new file mode 100644
index 0000000..fb2cc1c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/basic.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.daysinmonth
+description: Checking days in month for a "normal" case (non-undefined, non-boundary case, etc.)
+features: [Temporal]
+---*/
+
+const tests = [
+ [new Temporal.PlainDate(1976, 2, 18), 29],
+ [new Temporal.PlainDate(1976, 11, 18), 30],
+ [new Temporal.PlainDate(1976, 12, 18), 31],
+ [new Temporal.PlainDate(1977, 2, 18), 28],
+];
+for (const [plainDate, expected] of tests) {
+ assert.sameValue(plainDate.daysInMonth, expected, `${expected} days in the month of ${plainDate}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/custom.js
new file mode 100644
index 0000000..9ad671a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInMonth/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.daysinmonth
+description: Custom calendar tests for daysInMonth().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInMonth(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "daysInMonth arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.daysInMonth;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/basic.js
index c3eccf9..4a13d1b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/basic.js
@@ -7,5 +7,11 @@
features: [Temporal]
---*/
-const plainDate = new Temporal.PlainDate(1976, 11, 18);
-assert.sameValue(plainDate.daysInWeek, 7);
+const tests = [
+ new Temporal.PlainDate(1976, 1, 1),
+ new Temporal.PlainDate(1976, 11, 18),
+ new Temporal.PlainDate(1976, 12, 31),
+];
+for (const plainDate of tests) {
+ assert.sameValue(plainDate.daysInWeek, 7, `Seven days in the week of ${plainDate}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/custom.js
new file mode 100644
index 0000000..f181ac8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInWeek/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.daysinweek
+description: Custom calendar tests for daysInWeek().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInWeek(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "daysInWeek arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.daysInWeek;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/basic.js
new file mode 100644
index 0000000..a2baf72
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/basic.js
@@ -0,0 +1,11 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.daysinyear
+description: Basic tests for daysInYear.
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.PlainDate(1976, 11, 18)).daysInYear, 366, "leap year");
+assert.sameValue((new Temporal.PlainDate(1977, 11, 18)).daysInYear, 365, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/custom.js
new file mode 100644
index 0000000..1878dee
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/daysInYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.daysinyear
+description: Custom calendar tests for daysInYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "daysInYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.daysInYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..0bda78f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..2e2b82d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.equals
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainDate(1976, 11, 18);
+
+assert.throws(Test262Error, () => instance.equals(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..89a5e5b
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.equals
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainDate(1976, 11, 18);
+instance.equals(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/branding.js
index 58c78e6..c2d9576 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => equals.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..0e9e7a3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/custom.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.PlainDate(2000, 5, 2, calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoYear, 2000, "isoYear result");
+assert.sameValue(result.isoMonth, 5, "isoMonth result");
+assert.sameValue(result.isoDay, 2, "isoDay result");
+assert.sameValue(result.calendar, calendar, "calendar result");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..769df65
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/basic.js
new file mode 100644
index 0000000..f6def8c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.inleapyear
+description: Basic test for inLeapYear
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.PlainDate(1976, 11, 18)).inLeapYear,
+ true, "leap year");
+assert.sameValue((new Temporal.PlainDate(1977, 11, 18)).inLeapYear,
+ false, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/custom.js
new file mode 100644
index 0000000..d8ca270
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/inLeapYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.inleapyear
+description: Custom calendar tests for inLeapYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ inLeapYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "inLeapYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.inLeapYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/monthsInYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/monthsInYear/custom.js
new file mode 100644
index 0000000..7a6a588
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/monthsInYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.monthsinyear
+description: Custom calendar tests for monthsInYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ monthsInYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "monthsInYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.monthsInYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..0c5b754
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..30c2ff3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.since
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainDate(1976, 11, 18);
+
+assert.throws(Test262Error, () => instance.since(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..2d59c35
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.since
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainDate(1976, 11, 18);
+instance.since(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/branding.js
index 7b7ea57..e1c3b17 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => since.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => since.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-invalid-return.js
new file mode 100644
index 0000000..6ecd46d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.since
+description: Throw when the returned value from the calendar's dateUntil method is not a Duration.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ dateUntil() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.Duration, "Temporal.Duration"],
+ [Temporal.Duration.prototype, "Temporal.Duration.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.since("2022-06-20"), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/custom.js
new file mode 100644
index 0000000..d768512
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/custom.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.since
+description: Basic tests with custom calendar
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const result = new Temporal.Duration(1, 3, 5, 7, 9);
+const options = {};
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dateUntil(...args) {
+ ++calls;
+ assert.sameValue(args.length, 3, "Three arguments");
+ assert.sameValue(args[0], plainDate, "First argument");
+ assert.sameValue(args[1], other, "Second argument");
+ assert.sameValue(args[2].largestUnit, "day", "Third argument: largestUnit");
+ return result;
+ }
+}
+const calendar = new CustomCalendar();
+const plainDate = new Temporal.PlainDate(1976, 11, 18, calendar);
+const other = new Temporal.PlainDate(2022, 6, 20, calendar);
+TemporalHelpers.assertDuration(plainDate.since(other, options),
+ -1, -3, -5, -7, 0, 0, 0, 0, 0, 0, "result");
+assert.sameValue(calls, 1);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-invalid.js
deleted file mode 100644
index 58d2281..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-invalid.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.prototype.since
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const feb20 = Temporal.PlainDate.from("2020-02-01");
-const feb21 = Temporal.PlainDate.from("2021-02-01");
-const values = [null, true, "hello", Symbol("foo"), 1, 1n];
-for (const badOptions of values) {
- assert.throws(TypeError, () => feb21.since(feb20, badOptions));
-}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/branding.js
index fb89bca..dfc9dd6 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/calendar-invalid-return.js
new file mode 100644
index 0000000..574040a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.subtract
+description: Throw when the returned value from the calendar's dateAdd method is not a PlainDate.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ dateAdd() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.PlainDate, "Temporal.PlainDate"],
+ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.subtract({ years: 1 }), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/custom.js
new file mode 100644
index 0000000..33098d5
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/custom.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.subtract
+description: Basic tests with custom calendar
+includes: [compareArray.js,temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const result = new Temporal.PlainDate(1920, 5, 3);
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dateAdd(...args) {
+ ++calls;
+ assert.sameValue(args.length, 3, "Three arguments");
+ assert.sameValue(args[0], plainDate, "First argument");
+ TemporalHelpers.assertDuration(args[1], -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Second argument");
+ assert.sameValue(typeof args[2], "object", "Third argument: type");
+ assert.sameValue(Object.getPrototypeOf(args[2]), null, "Third argument: prototype");
+ assert.compareArray(Object.keys(args[2]), [], "Third argument: keys");
+ return result;
+ }
+}
+const calendar = new CustomCalendar();
+const plainDate = new Temporal.PlainDate(1976, 11, 18, calendar);
+assert.sameValue(plainDate.subtract({ years: 43 }), result);
+assert.sameValue(calls, 1);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-invalid.js
deleted file mode 100644
index 5d4f1c6..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-invalid.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.prototype.subtract
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const plainDate = new Temporal.PlainDate(2000, 3, 31);
-const duration = { months: 1 };
-
-const values = [null, true, "hello", Symbol("foo"), 1, 1n];
-for (const badOptions of values) {
- assert.throws(TypeError, () => plainDate.subtract(duration, badOptions));
-}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js
index 553f84e..c3f08f0 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js
@@ -9,7 +9,5 @@
---*/
const mar31 = Temporal.PlainDate.from("2020-03-31");
-TemporalHelpers.assertPlainDate(mar31.subtract({ months: 1 }),
- 2020, 2, "M02", 29, "implicit");
TemporalHelpers.assertPlainDate(mar31.subtract({ months: 1 }, { overflow: "constrain" }),
- 2020, 2, "M02", 29, "explicit");
+ 2020, 2, "M02", 29);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/basic.js
new file mode 100644
index 0000000..2d383ed
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/basic.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.tojson
+description: Basic behavior for toJSON
+features: [Temporal]
+---*/
+
+const tests = [
+ [new Temporal.PlainDate(1976, 2, 4), "1976-02-04"],
+ [new Temporal.PlainDate(1976, 11, 18), "1976-11-18"],
+];
+
+const options = new Proxy({}, {
+ get() { throw new Test262Error("should not get properties off argument") }
+});
+for (const [datetime, expected] of tests) {
+ assert.sameValue(datetime.toJSON(), expected, "toJSON without argument");
+ assert.sameValue(datetime.toJSON(options), expected, "toJSON with argument");
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-object.js
new file mode 100644
index 0000000..1f01230
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-object.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplaindatetime
+description: Tests for toPlainDateTime() with an object argument.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const plainDate = new Temporal.PlainDate(2000, 5, 2);
+const calendar = { toString() { return "iso8601" } };
+const withOverflow = plainDate.toPlainDateTime({ hour: 25, minute: 70, second: 23 });
+TemporalHelpers.assertPlainDateTime(withOverflow, 2000, 5, "M05", 2, 23, 59, 23, 0, 0, 0, "with overflow");
+assert.sameValue(withOverflow.calendar, plainDate.calendar, "with overflow calendar");
+
+const withCalendar = plainDate.toPlainDateTime({ hour: 13, calendar });
+TemporalHelpers.assertPlainDateTime(withCalendar, 2000, 5, "M05", 2, 13, 0, 0, 0, 0, 0, "with calendar");
+assert.sameValue(withCalendar.calendar, plainDate.calendar, "with calendar calendar");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-separators.js
new file mode 100644
index 0000000..96190d7
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplaindatetime
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.toPlainDateTime(arg);
+
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 2000, 5, "M05", 2, 12, 34, 56, 987, 654, 321,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js
index f9bdc52..93e39a5 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/basic.js
@@ -12,15 +12,20 @@
const string = date.toPlainDateTime("11:30:23");
TemporalHelpers.assertPlainDateTime(string, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "string");
+assert.sameValue(string.calendar, date.calendar, "string calendar");
const optionBag = date.toPlainDateTime({ hour: 11, minute: 30, second: 23 });
TemporalHelpers.assertPlainDateTime(optionBag, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "option bag");
+assert.sameValue(optionBag.calendar, date.calendar, "option bag calendar");
const plainTime = date.toPlainDateTime(Temporal.PlainTime.from("11:30:23"));
TemporalHelpers.assertPlainDateTime(plainTime, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "PlainTime");
+assert.sameValue(plainTime.calendar, date.calendar, "PlainTime calendar");
const plainDateTime = date.toPlainDateTime(Temporal.PlainDateTime.from("1999-07-14T11:30:23"));
-TemporalHelpers.assertPlainDateTime(plainDateTime, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "PlainTime");
+TemporalHelpers.assertPlainDateTime(plainDateTime, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "PlainDateTime");
+assert.sameValue(plainDateTime.calendar, date.calendar, "PlainDateTime calendar");
const zonedDateTime = date.toPlainDateTime(Temporal.ZonedDateTime.from("1999-07-14T11:30:23Z[UTC]"));
-TemporalHelpers.assertPlainDateTime(zonedDateTime, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "PlainTime");
+TemporalHelpers.assertPlainDateTime(zonedDateTime, 2000, 5, "M05", 2, 11, 30, 23, 0, 0, 0, "ZonedDateTime");
+assert.sameValue(zonedDateTime.calendar, date.calendar, "ZonedDateTime calendar");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/custom.js
new file mode 100644
index 0000000..ead40f9
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/custom.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplaindatetime
+description: toPlainDateTime() doesn't call into the calendar.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const plainDate = new Temporal.PlainDate(2000, 5, 2, calendar);
+const result = plainDate.toPlainDateTime("11:30:23");
+assert.sameValue(result.calendar, calendar, "calendar");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/basic.js
new file mode 100644
index 0000000..1c00017
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/basic.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplainmonthday
+description: Basic toPlainMonthDay tests.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+const pd = new Temporal.PlainDate(1970, 12, 24, calendar);
+const pmd = pd.toPlainMonthDay();
+TemporalHelpers.assertPlainMonthDay(pmd, "M12", 24);
+assert.sameValue(pmd.calendar, calendar);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-invalid-return.js
new file mode 100644
index 0000000..93f3b4f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplainmonthday
+description: Throw when the returned value is not a PlainMonthDay.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ monthDayFromFields() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.PlainMonthDay, "Temporal.PlainMonthDay"],
+ [Temporal.PlainMonthDay.prototype, "Temporal.PlainMonthDay.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.toPlainMonthDay(), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/basic.js
new file mode 100644
index 0000000..1a8bb52
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/basic.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplainyearmonth
+description: Basic toPlainYearMonth tests.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+const pd = new Temporal.PlainDate(1970, 12, 24, calendar);
+const pym = pd.toPlainYearMonth();
+TemporalHelpers.assertPlainYearMonth(pym, 1970, 12, "M12");
+assert.sameValue(pym.calendar, calendar);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-invalid-return.js
new file mode 100644
index 0000000..d7d5a1e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.toplainyearmonth
+description: Throw when the returned value is not a PlainYearMonth.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ yearMonthFromFields() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth"],
+ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.toPlainYearMonth(), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendar-tostring.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendar-tostring.js
new file mode 100644
index 0000000..0684a09
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendar-tostring.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.protoype.tostring
+description: Should always call 'toString' on the calendar once.
+features: [Temporal]
+---*/
+
+let calls;
+const customCalendar = {
+ toString() {
+ ++calls;
+ return "custom";
+ }
+};
+const date = new Temporal.PlainDate(2000, 5, 2, customCalendar);
+[
+ ["always", "2000-05-02[u-ca=custom]"],
+ ["auto", "2000-05-02[u-ca=custom]"],
+ ["never", "2000-05-02"],
+ [undefined, "2000-05-02[u-ca=custom]"],
+].forEach(([calendarName, expected]) => {
+ calls = 0;
+ const result = date.toString({ calendarName });
+ assert.sameValue(result, expected, `calendarName = ${calendarName}: expected ${expected}`);
+ assert.sameValue(calls, 1, `calendarName = ${calendarName}: expected one call to 'toString'`);
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-always.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-always.js
index 53bcac4..629955a 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-always.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-always.js
@@ -7,15 +7,16 @@
features: [Temporal]
---*/
-const calendar = {
+const customCalendar = {
toString() { return "custom"; }
};
-const date1 = new Temporal.PlainDate(2000, 5, 2);
-const date2 = new Temporal.PlainDate(2000, 5, 2, calendar);
-
+const customISOCalendar = {
+ toString() { return "iso8601"; }
+};
[
- [date1, "2000-05-02[u-ca=iso8601]"],
- [date2, "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2), "2000-05-02[u-ca=iso8601]"],
+ [new Temporal.PlainDate(2000, 5, 2, customCalendar), "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2, customISOCalendar), "2000-05-02[u-ca=iso8601]"],
].forEach(([date, expected]) => {
const result = date.toString({ calendarName: "always" });
assert.sameValue(result, expected, "expected " + expected);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-auto.js
index 08ad287..7acb8c6 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-auto.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-auto.js
@@ -7,15 +7,16 @@
features: [Temporal]
---*/
-const calendar = {
+const customCalendar = {
toString() { return "custom"; }
};
-const date1 = new Temporal.PlainDate(2000, 5, 2);
-const date2 = new Temporal.PlainDate(2000, 5, 2, calendar);
-
+const customISOCalendar = {
+ toString() { return "iso8601"; }
+};
[
- [date1, "2000-05-02"],
- [date2, "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2), "2000-05-02"],
+ [new Temporal.PlainDate(2000, 5, 2, customCalendar), "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2, customISOCalendar), "2000-05-02"],
].forEach(([date, expected]) => {
const result = date.toString({ calendarName: "auto" });
assert.sameValue(result, expected, "expected " + expected);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string.js
index bca22e7..5491e59 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-invalid-string.js
@@ -15,7 +15,7 @@
---*/
const date = new Temporal.PlainDate(2000, 5, 2);
-const values = ["ALWAYS", "sometimes", "other string"];
+const values = ["ALWAYS", "sometimes", "other string", "auto\0"];
for (const calendarName of values) {
assert.throws(RangeError, () => date.toString({ calendarName }));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-never.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-never.js
index a937872..75fe99b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-never.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-never.js
@@ -7,15 +7,16 @@
features: [Temporal]
---*/
-const calendar = {
+const customCalendar = {
toString() { return "custom"; }
};
-const date1 = new Temporal.PlainDate(2000, 5, 2);
-const date2 = new Temporal.PlainDate(2000, 5, 2, calendar);
-
+const customISOCalendar = {
+ toString() { return "iso8601"; }
+};
[
- [date1, "2000-05-02"],
- [date2, "2000-05-02"],
+ [new Temporal.PlainDate(2000, 5, 2), "2000-05-02"],
+ [new Temporal.PlainDate(2000, 5, 2, customCalendar), "2000-05-02"],
+ [new Temporal.PlainDate(2000, 5, 2, customISOCalendar), "2000-05-02"],
].forEach(([date, expected]) => {
const result = date.toString({ calendarName: "never" });
assert.sameValue(result, expected, "expected " + expected);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js
index 0d5e93e..aa3364c 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/calendarname-undefined.js
@@ -14,15 +14,16 @@
features: [Temporal]
---*/
-const calendar = {
+const customCalendar = {
toString() { return "custom"; }
};
-const date1 = new Temporal.PlainDate(2000, 5, 2);
-const date2 = new Temporal.PlainDate(2000, 5, 2, calendar);
-
+const customISOCalendar = {
+ toString() { return "iso8601"; }
+};
[
- [date1, "2000-05-02"],
- [date2, "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2), "2000-05-02"],
+ [new Temporal.PlainDate(2000, 5, 2, customCalendar), "2000-05-02[u-ca=custom]"],
+ [new Temporal.PlainDate(2000, 5, 2, customISOCalendar), "2000-05-02"],
].forEach(([date, expected]) => {
const explicit = date.toString({ calendarName: undefined });
assert.sameValue(explicit, expected, "default calendarName option is auto");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..6308330
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.PlainDate
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainDate.prototype, Symbol.toStringTag, {
+ value: "Temporal.PlainDate",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-separators.js
new file mode 100644
index 0000000..904c459
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-separators.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.tozoneddatetime
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" });
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 957_270_896_987_654_321n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/branding.js
index 7d20da4..6ef14da 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toZonedDateTime, "function");
-assert.throws(TypeError, () => toZonedDateTime.call(undefined), "undefined");
-assert.throws(TypeError, () => toZonedDateTime.call(null), "null");
-assert.throws(TypeError, () => toZonedDateTime.call(true), "true");
-assert.throws(TypeError, () => toZonedDateTime.call(""), "empty string");
-assert.throws(TypeError, () => toZonedDateTime.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toZonedDateTime.call(1), "1");
-assert.throws(TypeError, () => toZonedDateTime.call({}), "plain object");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.TimeZone("UTC")];
+
+assert.throws(TypeError, () => toZonedDateTime.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toZonedDateTime.apply(null, args), "null");
+assert.throws(TypeError, () => toZonedDateTime.apply(true, args), "true");
+assert.throws(TypeError, () => toZonedDateTime.apply("", args), "empty string");
+assert.throws(TypeError, () => toZonedDateTime.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toZonedDateTime.apply(1, args), "1");
+assert.throws(TypeError, () => toZonedDateTime.apply({}, args), "plain object");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/calendar.js
new file mode 100644
index 0000000..dea05be
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/calendar.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.tozoneddatetime
+description: Calendar of the receiver is used
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+const timeCalendar = { toString() { return "iso8601"; } };
+const plainDate = new Temporal.PlainDate(2000, 5, 2, calendar);
+const result = plainDate.toZonedDateTime({
+ timeZone: "UTC",
+ plainTime: { hour: 12, minute: 30, calendar: timeCalendar },
+});
+assert.sameValue(result.epochNanoseconds, 957270600_000_000_000n);
+assert.sameValue(result.timeZone.toString(), "UTC");
+assert.sameValue(result.calendar, calendar);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-getpossibleinstantsfor.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-getpossibleinstantsfor.js
new file mode 100644
index 0000000..4431024
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-getpossibleinstantsfor.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.tozoneddatetime
+description: Calendar of the receiver is used
+features: [Temporal]
+---*/
+
+const calendar = new Temporal.Calendar("iso8601");
+class CustomTimeZone extends Temporal.TimeZone {
+ constructor() {
+ super("UTC");
+ }
+ getPossibleInstantsFor(plainDateTime) {
+ assert.sameValue(plainDateTime.calendar, calendar);
+ return [new Temporal.Instant(987654321_000_000_000n)];
+ }
+}
+const timeZone = new CustomTimeZone();
+const plainDate = new Temporal.PlainDate(2000, 5, 2, calendar);
+const result = plainDate.toZonedDateTime({
+ timeZone,
+ plainTime: { hour: 12, minute: 30 },
+});
+assert.sameValue(result.epochNanoseconds, 987654321_000_000_000n);
+assert.sameValue(result.timeZone, timeZone);
+assert.sameValue(result.calendar, calendar);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..b1b41c7
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDate(2000, 5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..4aca3ad
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.until
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainDate(1976, 11, 18);
+
+assert.throws(Test262Error, () => instance.until(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..85864d2
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.until
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainDate(1976, 11, 18);
+instance.until(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/branding.js
index ebbafe5..07d2419 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => until.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => until.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-invalid-return.js
new file mode 100644
index 0000000..5e66a55
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.until
+description: Throw when the returned value from the calendar's dateUntil method is not a Duration.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ dateUntil() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.Duration, "Temporal.Duration"],
+ [Temporal.Duration.prototype, "Temporal.Duration.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.until("2022-06-20"), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/custom.js
new file mode 100644
index 0000000..1d332af
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/custom.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.until
+description: Basic tests with custom calendar
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const result = new Temporal.Duration(1, 3, 5, 7, 9);
+const options = {};
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dateUntil(...args) {
+ ++calls;
+ assert.sameValue(args.length, 3, "Three arguments");
+ assert.sameValue(args[0], plainDate, "First argument");
+ assert.sameValue(args[1], other, "Second argument");
+ assert.sameValue(args[2].largestUnit, "day", "Third argument: largestUnit");
+ return result;
+ }
+}
+const calendar = new CustomCalendar();
+const plainDate = new Temporal.PlainDate(1976, 11, 18, calendar);
+const other = new Temporal.PlainDate(2022, 6, 20, calendar);
+TemporalHelpers.assertDuration(plainDate.until(other, options),
+ 1, 3, 5, 7, 0, 0, 0, 0, 0, 0, "result");
+assert.sameValue(calls, 1);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-invalid.js
deleted file mode 100644
index 7c737f9..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-invalid.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.prototype.until
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const feb20 = Temporal.PlainDate.from("2020-02-01");
-const feb21 = Temporal.PlainDate.from("2021-02-01");
-const values = [null, true, "hello", Symbol("foo"), 1, 1n];
-for (const badOptions of values) {
- assert.throws(TypeError, () => feb20.until(feb21, badOptions));
-}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/weekOfYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/weekOfYear/custom.js
new file mode 100644
index 0000000..72107aa
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/weekOfYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindate.prototype.weekofyear
+description: Custom calendar tests for weekOfYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ weekOfYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pd], "weekOfYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pd = new Temporal.PlainDate(1830, 8, 25, calendar);
+const result = pd.weekOfYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/branding.js
index e6210e0..47ebc9a 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => with_.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [{ year: 2022 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/calendar-invalid-return.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/calendar-invalid-return.js
new file mode 100644
index 0000000..3a6afd1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/calendar-invalid-return.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.with
+description: Throw when the returned value from the calendar's dateFromFields method is not a PlainDate.
+features: [Temporal]
+---*/
+
+class CustomCalendar extends Temporal.Calendar {
+ constructor(value) {
+ super("iso8601");
+ this.value = value;
+ }
+ dateFromFields() {
+ return this.value;
+ }
+}
+
+const tests = [
+ [undefined],
+ [null, "null"],
+ [true],
+ ["2000-05"],
+ [Symbol()],
+ [200005],
+ [200005n],
+ [{}, "plain object"],
+ [() => {}, "lambda"],
+ [Temporal.PlainDate, "Temporal.PlainDate"],
+ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype"],
+];
+for (const [test, description = typeof test] of tests) {
+ const plainDate = new Temporal.PlainDate(2000, 5, 2, new CustomCalendar(test));
+ assert.throws(TypeError, () => plainDate.with({ year: 1 }), `Expected error with ${description}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/custom.js
new file mode 100644
index 0000000..46ecc26
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/custom.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate.prototype.with
+description: Basic tests with custom calendar
+features: [Temporal]
+---*/
+
+const result = new Temporal.PlainDate(1920, 5, 3);
+const options = {};
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dateFromFields(...args) {
+ ++calls;
+ assert.sameValue(args.length, 2, "Two arguments");
+ assert.sameValue(typeof args[0], "object", "First argument: type");
+ assert.sameValue(args[0].day, 18, "First argument: day");
+ assert.sameValue(args[0].month, 11, "First argument: month");
+ assert.sameValue(args[0].monthCode, "M11", "First argument: monthCode");
+ assert.sameValue(args[0].year, 43, "First argument: year");
+ assert.sameValue(args[1], options, "Second argument");
+ return result;
+ }
+}
+const calendar = new CustomCalendar();
+const plainDate = new Temporal.PlainDate(1976, 11, 18, calendar);
+assert.sameValue(plainDate.with({ year: 43 }, options), result);
+assert.sameValue(calls, 1);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-invalid.js
deleted file mode 100644
index 5222d72..0000000
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-invalid.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (C) 2021 Igalia, S.L. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-temporal.plaindate.prototype.with
-description: TypeError thrown when a primitive is passed as the options argument
-features: [Temporal]
----*/
-
-const plainDate = new Temporal.PlainDate(2000, 2, 2);
-[null, true, "hello", Symbol("foo"), 1, 1n].forEach((badOptions) =>
- assert.throws(TypeError, () => plainDate.with({ day: 17 }, badOptions))
-);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/plaindatelike-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/plaindatelike-invalid.js
index 189c334..a14dae6 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/plaindatelike-invalid.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/plaindatelike-invalid.js
@@ -24,20 +24,19 @@
[42n, "bigint"],
// Step 4.
+ // RejectObjectWithCalendarOrTimeZone step 2.
[Temporal.PlainDate.from("2019-05-17"), "PlainDate"],
[Temporal.PlainDateTime.from("2019-05-17T12:34"), "PlainDateTime"],
[Temporal.PlainMonthDay.from("2019-05-17"), "PlainMonthDay"],
[Temporal.PlainTime.from("12:34"), "PlainTime"],
[Temporal.PlainYearMonth.from("2019-05-17"), "PlainYearMonth"],
[Temporal.ZonedDateTime.from("2019-05-17T12:34Z[UTC]"), "ZonedDateTime"],
-
- // Step 5-6.
+ // RejectObjectWithCalendarOrTimeZone step 3-4.
[{ year: 2021, calendar: "iso8601" }, "calendar"],
-
- // Step 7-8.
+ // RejectObjectWithCalendarOrTimeZone step 5-6.
[{ year: 2021, timeZone: "UTC" }, "timeZone"],
- // Step 11.
+ // Step 7.
[{}, "empty object"],
[{ months: 12 }, "only plural property"],
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/basic.js
index 6fd61bb..2dd1adb 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/basic.js
@@ -12,9 +12,17 @@
const calendar = Temporal.Calendar.from("iso8601");
const objectResult = plainDate.withCalendar(calendar);
+assert.notSameValue(objectResult, plainDate, "object: new object");
TemporalHelpers.assertPlainDate(objectResult, 1976, 11, "M11", 18, "object");
-assert.sameValue(objectResult.calendar, calendar, "object calendar");
+assert.sameValue(objectResult.calendar, calendar, "object: calendar");
const stringResult = plainDate.withCalendar("iso8601");
+assert.notSameValue(stringResult, plainDate, "string: new object");
TemporalHelpers.assertPlainDate(stringResult, 1976, 11, "M11", 18, "string");
-assert.sameValue(stringResult.calendar.id, "iso8601", "string calendar");
+assert.sameValue(stringResult.calendar.id, "iso8601", "string: calendar");
+
+const originalCalendar = plainDate.calendar;
+const sameResult = plainDate.withCalendar(originalCalendar);
+assert.notSameValue(sameResult, plainDate, "original: new object");
+TemporalHelpers.assertPlainDate(sameResult, 1976, 11, "M11", 18, "original");
+assert.sameValue(sameResult.calendar, originalCalendar, "original: calendar");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/branding.js
index 97f9b34..964b62a 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withCalendar, "function");
-assert.throws(TypeError, () => withCalendar.call(undefined), "undefined");
-assert.throws(TypeError, () => withCalendar.call(null), "null");
-assert.throws(TypeError, () => withCalendar.call(true), "true");
-assert.throws(TypeError, () => withCalendar.call(""), "empty string");
-assert.throws(TypeError, () => withCalendar.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withCalendar.call(1), "1");
-assert.throws(TypeError, () => withCalendar.call({}), "plain object");
-assert.throws(TypeError, () => withCalendar.call(Temporal.PlainDate), "Temporal.PlainDate");
-assert.throws(TypeError, () => withCalendar.call(Temporal.PlainDate.prototype), "Temporal.PlainDate.prototype");
+const args = [new Temporal.Calendar("iso8601")];
+
+assert.throws(TypeError, () => withCalendar.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withCalendar.apply(null, args), "null");
+assert.throws(TypeError, () => withCalendar.apply(true, args), "true");
+assert.throws(TypeError, () => withCalendar.apply("", args), "empty string");
+assert.throws(TypeError, () => withCalendar.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withCalendar.apply(1, args), "1");
+assert.throws(TypeError, () => withCalendar.apply({}, args), "plain object");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.PlainDate, args), "Temporal.PlainDate");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.PlainDate.prototype, args), "Temporal.PlainDate.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/subclass.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/subclass.js
new file mode 100644
index 0000000..81d73c1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindate
+description: Test for Temporal.PlainDate subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomPlainDate extends Temporal.PlainDate {
+}
+
+const instance = new CustomPlainDate(2000, 5, 2);
+TemporalHelpers.assertPlainDate(instance, 2000, 5, "M05", 2);
+assert.sameValue(Object.getPrototypeOf(instance), CustomPlainDate.prototype, "Instance of CustomPlainDate");
+assert(instance instanceof CustomPlainDate, "Instance of CustomPlainDate");
+assert(instance instanceof Temporal.PlainDate, "Instance of Temporal.PlainDate");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..d1486cf
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const dateTime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.PlainDateTime.compare(arg, dateTime),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.PlainDateTime.compare(dateTime, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor.js
index fcc159a..31f87a0 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.PlainDateTime());
+assert.throws(TypeError, () => Temporal.PlainDateTime(1970, 1, 2, 12, 0, 0));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js
index 739b96e..047a691 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js
@@ -8,22 +8,18 @@
includes: [temporalHelpers.js]
---*/
-const expected = [1976, 11, "M11", 18, 15, 23, 0, 0, 0, 0];
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
-TemporalHelpers.assertPlainDateTime(
- Temporal.PlainDateTime.from("1976-11-18T15:23"),
- ...expected,
- "variant time separators (uppercase T)"
-);
+tests.forEach(([arg, description]) => {
+ const result = Temporal.PlainDateTime.from(arg);
-TemporalHelpers.assertPlainDateTime(
- Temporal.PlainDateTime.from("1976-11-18t15:23"),
- ...expected,
- "variant time separators (lowercase T)"
-);
-
-TemporalHelpers.assertPlainDateTime(
- Temporal.PlainDateTime.from("1976-11-18 15:23"),
- ...expected,
- "variant time separators (space between date and time)"
-);
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 1976, 11, "M11", 18, 15, 23, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-negative-fractional-units.js
index 093b91e..4e62a03 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.PlainDateTime(2000, 5, 2);
const resultHours = instance.add("-PT24.567890123H");
-TemporalHelpers.assertPlainDateTime(resultHours, 2000, 4, "M04", 30, 23, 25, 55, 595, 557, 201, "negative fractional hours");
+TemporalHelpers.assertPlainDateTime(resultHours, 2000, 4, "M04", 30, 23, 25, 55, 595, 557, 200, "negative fractional hours");
const resultMinutes = instance.add("-PT1440.567890123M");
-TemporalHelpers.assertPlainDateTime(resultMinutes, 2000, 4, "M04", 30, 23, 59, 25, 926, 592, 621, "negative fractional minutes");
+TemporalHelpers.assertPlainDateTime(resultMinutes, 2000, 4, "M04", 30, 23, 59, 25, 926, 592, 620, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/branding.js
index 161aa7d..d26f8d0 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => add.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => add.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/constructor.js
new file mode 100644
index 0000000..91c415e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.constructor
+description: Test for Temporal.PlainDateTime.prototype.constructor.
+info: The initial value of Temporal.PlainDateTime.prototype.constructor is %Temporal.PlainDateTime%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainDateTime.prototype, "constructor", {
+ value: Temporal.PlainDateTime,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/custom.js
new file mode 100644
index 0000000..23d6bbd
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.dayofweek
+description: Custom calendar tests for dayOfWeek().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dayOfWeek(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "dayOfWeek arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.dayOfWeek;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/custom.js
new file mode 100644
index 0000000..101676a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.dayofyear
+description: Custom calendar tests for dayOfYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ dayOfYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "dayOfYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.dayOfYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js
index 7059e7a..76fcea4 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js
@@ -7,6 +7,12 @@
features: [Temporal]
---*/
-const calendar = Temporal.Calendar.from("iso8601");
-const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar);
-assert.sameValue(datetime.daysInMonth, 30, "check days in month information");
+const tests = [
+ [new Temporal.PlainDateTime(1976, 2, 18, 15, 23, 30, 123, 456, 789), 29],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789), 30],
+ [new Temporal.PlainDateTime(1976, 12, 18, 15, 23, 30, 123, 456, 789), 31],
+ [new Temporal.PlainDateTime(1977, 2, 18, 15, 23, 30, 123, 456, 789), 28],
+];
+for (const [plainDateTime, expected] of tests) {
+ assert.sameValue(plainDateTime.daysInMonth, expected, `${expected} days in the month of ${plainDateTime}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/custom.js
new file mode 100644
index 0000000..2f2aae3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.daysinmonth
+description: Custom calendar tests for daysInMonth().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInMonth(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "daysInMonth arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.daysInMonth;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js
index f34e00f..3d63b1b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js
@@ -7,6 +7,11 @@
features: [Temporal]
---*/
-const calendar = Temporal.Calendar.from("iso8601");
-const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar);
-assert.sameValue(datetime.daysInWeek, 7, "check days in week information");
+const tests = [
+ new Temporal.PlainDateTime(1976, 1, 1, 15, 23, 30, 123, 456, 789),
+ new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789),
+ new Temporal.PlainDateTime(1976, 12, 31, 15, 23, 30, 123, 456, 789),
+];
+for (const plainDateTime of tests) {
+ assert.sameValue(plainDateTime.daysInWeek, 7, `Seven days in the week of ${plainDateTime}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/custom.js
new file mode 100644
index 0000000..5bfd635
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.daysinweek
+description: Custom calendar tests for daysInWeek().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInWeek(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "daysInWeek arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.daysInWeek;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js
index d3c7a5d..25b7778 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js
@@ -7,6 +7,7 @@
features: [Temporal]
---*/
-const calendar = Temporal.Calendar.from("iso8601");
-const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar);
-assert.sameValue(datetime.daysInYear, 366, "check days in year information");
+assert.sameValue((new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789)).daysInYear,
+ 366, "leap year");
+assert.sameValue((new Temporal.PlainDateTime(1977, 11, 18, 15, 23, 30, 123, 456, 789)).daysInYear,
+ 365, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/custom.js
new file mode 100644
index 0000000..ba025cd
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.daysinyear
+description: Custom calendar tests for daysInYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ daysInYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "daysInYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.daysInYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..ae190e7
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/branding.js
index 3b87c80..5c150b8 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => equals.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.PlainDateTime(2022, 6, 22)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..b3b80bd
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/custom.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoYear, 2000, "isoYear result");
+assert.sameValue(result.isoMonth, 5, "isoMonth result");
+assert.sameValue(result.isoDay, 2, "isoDay result");
+assert.sameValue(result.isoHour, 12, "isoHour result");
+assert.sameValue(result.isoMinute, 34, "isoMinute result");
+assert.sameValue(result.isoSecond, 56, "isoSecond result");
+assert.sameValue(result.isoMillisecond, 987, "isoMillisecond result");
+assert.sameValue(result.isoMicrosecond, 654, "isoMicrosecond result");
+assert.sameValue(result.isoNanosecond, 321, "isoNanosecond result");
+assert.sameValue(result.calendar, calendar, "calendar result");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..1e00cd2
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321);
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/basic.js
new file mode 100644
index 0000000..b620522
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.inleapyear
+description: Basic test for inLeapYear
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789)).inLeapYear,
+ true, "leap year");
+assert.sameValue((new Temporal.PlainDateTime(1977, 11, 18, 15, 23, 30, 123, 456, 789)).inLeapYear,
+ false, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/custom.js
new file mode 100644
index 0000000..6f4e498
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/inLeapYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.inleapyear
+description: Custom calendar tests for inLeapYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ inLeapYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "inLeapYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.inLeapYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/custom.js
new file mode 100644
index 0000000..ef47a09
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.monthsinyear
+description: Custom calendar tests for monthsInYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ monthsInYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "monthsInYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.monthsInYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/branding.js
index 9efbaff..28e3b90 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof round, "function");
-assert.throws(TypeError, () => round.call(undefined), "undefined");
-assert.throws(TypeError, () => round.call(null), "null");
-assert.throws(TypeError, () => round.call(true), "true");
-assert.throws(TypeError, () => round.call(""), "empty string");
-assert.throws(TypeError, () => round.call(Symbol()), "symbol");
-assert.throws(TypeError, () => round.call(1), "1");
-assert.throws(TypeError, () => round.call({}), "plain object");
-assert.throws(TypeError, () => round.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => round.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = ['hour'];
+
+assert.throws(TypeError, () => round.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => round.apply(null, args), "null");
+assert.throws(TypeError, () => round.apply(true, args), "true");
+assert.throws(TypeError, () => round.apply("", args), "empty string");
+assert.throws(TypeError, () => round.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => round.apply(1, args), "1");
+assert.throws(TypeError, () => round.apply({}, args), "plain object");
+assert.throws(TypeError, () => round.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => round.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..96f4ad3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/branding.js
index c516e4d..21313b4 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => since.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.PlainDateTime(2022, 6, 22)];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => since.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-negative-fractional-units.js
index 2add82f..24655cd 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.PlainDateTime(2000, 5, 2);
const resultHours = instance.subtract("-PT24.567890123H");
-TemporalHelpers.assertPlainDateTime(resultHours, 2000, 5, "M05", 3, 0, 34, 4, 404, 442, 799, "negative fractional hours");
+TemporalHelpers.assertPlainDateTime(resultHours, 2000, 5, "M05", 3, 0, 34, 4, 404, 442, 800, "negative fractional hours");
const resultMinutes = instance.subtract("-PT1440.567890123M");
-TemporalHelpers.assertPlainDateTime(resultMinutes, 2000, 5, "M05", 3, 0, 0, 34, 73, 407, 379, "negative fractional minutes");
+TemporalHelpers.assertPlainDateTime(resultMinutes, 2000, 5, "M05", 3, 0, 0, 34, 73, 407, 380, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/branding.js
index 8c29b1f..7e955db 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/basic.js
new file mode 100644
index 0000000..bca24a4
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/basic.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.tojson
+description: Basic behavior for toJSON
+features: [Temporal]
+---*/
+
+const tests = [
+ [new Temporal.PlainDateTime(1976, 2, 4, 5, 3, 1), "1976-02-04T05:03:01"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23), "1976-11-18T15:23:00"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30), "1976-11-18T15:23:30"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400), "1976-11-18T15:23:30.1234"],
+];
+
+const options = new Proxy({}, {
+ get() { throw new Test262Error("should not get properties off argument") }
+});
+for (const [datetime, expected] of tests) {
+ assert.sameValue(datetime.toJSON(), expected, "toJSON without argument");
+ assert.sameValue(datetime.toJSON(options), expected, "toJSON with argument");
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js
index 2567d04..47f9aa4 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js
@@ -7,14 +7,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
-const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30);
-const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400);
-
const tests = [
- [zeroSeconds, "1976-11-18T15:23:00"],
- [wholeSeconds, "1976-11-18T15:23:30"],
- [subSeconds, "1976-11-18T15:23:30.1234"],
+ [new Temporal.PlainDateTime(1976, 2, 4, 5, 3, 1), "1976-02-04T05:03:01"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23), "1976-11-18T15:23:00"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30), "1976-11-18T15:23:30"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400), "1976-11-18T15:23:30.1234"],
];
for (const [datetime, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js
index 843ef74..e3436f8 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js
@@ -7,10 +7,13 @@
features: [Temporal]
---*/
+const fewSeconds = new Temporal.PlainDateTime(1976, 2, 4, 5, 3, 1);
const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30);
const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400);
+assert.sameValue(fewSeconds.toString({ fractionalSecondDigits: 0 }), "1976-02-04T05:03:01",
+ "pads parts with 0");
assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1976-11-18T15:23:30",
"truncates 4 decimal places to 0");
assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1976-11-18T15:23:00.00",
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js
index d5ebb9c..0434590 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js
@@ -16,14 +16,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
-const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30);
-const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400);
-
const tests = [
- [zeroSeconds, "1976-11-18T15:23:00"],
- [wholeSeconds, "1976-11-18T15:23:30"],
- [subSeconds, "1976-11-18T15:23:30.1234"],
+ [new Temporal.PlainDateTime(1976, 2, 4, 5, 3, 1), "1976-02-04T05:03:01"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23), "1976-11-18T15:23:00"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30), "1976-11-18T15:23:30"],
+ [new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400), "1976-11-18T15:23:30.1234"],
];
for (const [datetime, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..a2488d5
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.PlainDateTime
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainDateTime.prototype, Symbol.toStringTag, {
+ value: "Temporal.PlainDateTime",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding.js
index e8f419a..d58915e 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toZonedDateTime, "function");
-assert.throws(TypeError, () => toZonedDateTime.call(undefined), "undefined");
-assert.throws(TypeError, () => toZonedDateTime.call(null), "null");
-assert.throws(TypeError, () => toZonedDateTime.call(true), "true");
-assert.throws(TypeError, () => toZonedDateTime.call(""), "empty string");
-assert.throws(TypeError, () => toZonedDateTime.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toZonedDateTime.call(1), "1");
-assert.throws(TypeError, () => toZonedDateTime.call({}), "plain object");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.TimeZone("UTC")];
+
+assert.throws(TypeError, () => toZonedDateTime.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toZonedDateTime.apply(null, args), "null");
+assert.throws(TypeError, () => toZonedDateTime.apply(true, args), "true");
+assert.throws(TypeError, () => toZonedDateTime.apply("", args), "empty string");
+assert.throws(TypeError, () => toZonedDateTime.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toZonedDateTime.apply(1, args), "1");
+assert.throws(TypeError, () => toZonedDateTime.apply({}, args), "plain object");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..c6471af
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/branding.js
index d879f44..bc1e396 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => until.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.PlainDateTime(2022, 6, 22)];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => until.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/custom.js
new file mode 100644
index 0000000..32fd571
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/custom.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaindatetime.prototype.weekofyear
+description: Custom calendar tests for weekOfYear().
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+let calls = 0;
+class CustomCalendar extends Temporal.Calendar {
+ constructor() {
+ super("iso8601");
+ }
+ weekOfYear(...args) {
+ ++calls;
+ assert.compareArray(args, [pdt], "weekOfYear arguments");
+ return "7";
+ }
+}
+
+const calendar = new CustomCalendar();
+const pdt = new Temporal.PlainDateTime(1830, 8, 25, 20, 0, 0, 0, 0, 0, calendar);
+const result = pdt.weekOfYear;
+assert.sameValue(result, "7", "result");
+assert.sameValue(calls, 1, "calls");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/branding.js
index 2b94212..f682924 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => with_.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [{ year: 2022 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding.js
index 6c001fb..911f96a 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withCalendar, "function");
-assert.throws(TypeError, () => withCalendar.call(undefined), "undefined");
-assert.throws(TypeError, () => withCalendar.call(null), "null");
-assert.throws(TypeError, () => withCalendar.call(true), "true");
-assert.throws(TypeError, () => withCalendar.call(""), "empty string");
-assert.throws(TypeError, () => withCalendar.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withCalendar.call(1), "1");
-assert.throws(TypeError, () => withCalendar.call({}), "plain object");
-assert.throws(TypeError, () => withCalendar.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => withCalendar.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.Calendar("iso8601")];
+
+assert.throws(TypeError, () => withCalendar.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withCalendar.apply(null, args), "null");
+assert.throws(TypeError, () => withCalendar.apply(true, args), "true");
+assert.throws(TypeError, () => withCalendar.apply("", args), "empty string");
+assert.throws(TypeError, () => withCalendar.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withCalendar.apply(1, args), "1");
+assert.throws(TypeError, () => withCalendar.apply({}, args), "plain object");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
index 326aed7..548a937 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js
@@ -10,6 +10,8 @@
const cal = {
id: 'thisisnotiso',
+ era() { return undefined; },
+ eraYear() { return undefined; },
toString() { return "this is a string"; },
year() { return 2008; },
month() { return 9; },
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
index 5c75366..7abc867 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js
@@ -13,6 +13,8 @@
};
const cal2 = {
id: 'thisisnotiso',
+ era() { return undefined; },
+ eraYear() { return undefined; },
toString() { return "this is a string"; },
year() { return 2008; },
month() { return 9; },
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
index 9eaba18..bfe7f37 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js
@@ -11,6 +11,8 @@
let calls = 0;
const cal = {
id: 'thisisnotiso',
+ era() { return undefined; },
+ eraYear() { return undefined; },
toString() {
++calls;
return "this is a string";
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
index 12a28cb..58864db 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js
@@ -10,6 +10,8 @@
const cal = {
id: 'thisisnotiso',
+ era() { return undefined; },
+ eraYear() { return undefined; },
toString() { return "this is a string"; },
year() { return 2008; },
month() { return 9; },
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
index f587118..45e3d8b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js
@@ -10,6 +10,8 @@
const cal = {
id: "thisisnotiso",
+ era() { return undefined; },
+ eraYear() { return undefined; },
toString() { return "this is a string"; },
year() { return 2008; },
month() { return 9; },
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-time-separators.js
new file mode 100644
index 0000000..026eb0c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.withplaindate
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.withPlainDate(arg);
+
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 2000, 5, "M05", 2, 15, 23, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..4d2c8ec
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.withplaindate
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321);
+
+assert.throws(Test262Error, () => instance.withPlainDate(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..9d8c966
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.withplaindate
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321);
+instance.withPlainDate(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding.js
index e4d5ef4..1306765 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withPlainDate, "function");
-assert.throws(TypeError, () => withPlainDate.call(undefined), "undefined");
-assert.throws(TypeError, () => withPlainDate.call(null), "null");
-assert.throws(TypeError, () => withPlainDate.call(true), "true");
-assert.throws(TypeError, () => withPlainDate.call(""), "empty string");
-assert.throws(TypeError, () => withPlainDate.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withPlainDate.call(1), "1");
-assert.throws(TypeError, () => withPlainDate.call({}), "plain object");
-assert.throws(TypeError, () => withPlainDate.call(Temporal.PlainDateTime), "Temporal.PlainDateTime");
-assert.throws(TypeError, () => withPlainDate.call(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => withPlainDate.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withPlainDate.apply(null, args), "null");
+assert.throws(TypeError, () => withPlainDate.apply(true, args), "true");
+assert.throws(TypeError, () => withPlainDate.apply("", args), "empty string");
+assert.throws(TypeError, () => withPlainDate.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withPlainDate.apply(1, args), "1");
+assert.throws(TypeError, () => withPlainDate.apply({}, args), "plain object");
+assert.throws(TypeError, () => withPlainDate.apply(Temporal.PlainDateTime, args), "Temporal.PlainDateTime");
+assert.throws(TypeError, () => withPlainDate.apply(Temporal.PlainDateTime.prototype, args), "Temporal.PlainDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-separators.js
new file mode 100644
index 0000000..92b8857
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime.prototype.withplaintime
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.withPlainTime(arg);
+
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/subclass.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/subclass.js
new file mode 100644
index 0000000..bb8a4fa
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaindatetime
+description: Test for Temporal.PlainDateTime subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomPlainDateTime extends Temporal.PlainDateTime {
+}
+
+const instance = new CustomPlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321);
+TemporalHelpers.assertPlainDateTime(instance, 2000, 5, "M05", 2, 12, 34, 56, 987, 654, 321);
+assert.sameValue(Object.getPrototypeOf(instance), CustomPlainDateTime.prototype, "Instance of CustomPlainDateTime");
+assert(instance instanceof CustomPlainDateTime, "Instance of CustomPlainDateTime");
+assert(instance instanceof Temporal.PlainDateTime, "Instance of Temporal.PlainDateTime");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/constructor.js
index 5df5c20..4680c2e 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.PlainMonthDay());
+assert.throws(TypeError, () => Temporal.PlainMonthDay(1, 2));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-string-time-separators.js
new file mode 100644
index 0000000..84cb7b9
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-string-time-separators.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.from
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-05-02T15:23", "uppercase T"],
+ ["1976-05-02t15:23", "lowercase T"],
+ ["1976-05-02 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.PlainMonthDay.from(arg);
+
+ TemporalHelpers.assertPlainMonthDay(
+ result,
+ "M05", 2,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/constructor.js
new file mode 100644
index 0000000..d77e3ac
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.prototype.constructor
+description: Test for Temporal.PlainMonthDay.prototype.constructor.
+info: The initial value of Temporal.PlainMonthDay.prototype.constructor is %Temporal.PlainMonthDay%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainMonthDay.prototype, "constructor", {
+ value: Temporal.PlainMonthDay,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..daa37b7
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-05-02T15:23", "uppercase T"],
+ ["1976-05-02t15:23", "lowercase T"],
+ ["1976-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainMonthDay(5, 2);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/branding.js
index 88bb5ad..39e0185 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.PlainMonthDay), "Temporal.PlainMonthDay");
-assert.throws(TypeError, () => equals.call(Temporal.PlainMonthDay.prototype), "Temporal.PlainMonthDay.prototype");
+const args = [new Temporal.PlainMonthDay(5, 2)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainMonthDay, args), "Temporal.PlainMonthDay");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainMonthDay.prototype, args), "Temporal.PlainMonthDay.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..391c708
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/custom.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.PlainMonthDay(5, 2, calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoYear, 1972, "isoYear result");
+assert.sameValue(result.isoMonth, 5, "isoMonth result");
+assert.sameValue(result.isoDay, 2, "isoDay result");
+assert.sameValue(result.calendar, calendar, "calendar result");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..dc43ace
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainMonthDay(5, 2);
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding.js
index eb32166..3696144 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toPlainDate, "function");
-assert.throws(TypeError, () => toPlainDate.call(undefined), "undefined");
-assert.throws(TypeError, () => toPlainDate.call(null), "null");
-assert.throws(TypeError, () => toPlainDate.call(true), "true");
-assert.throws(TypeError, () => toPlainDate.call(""), "empty string");
-assert.throws(TypeError, () => toPlainDate.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toPlainDate.call(1), "1");
-assert.throws(TypeError, () => toPlainDate.call({}), "plain object");
-assert.throws(TypeError, () => toPlainDate.call(Temporal.PlainMonthDay), "Temporal.PlainMonthDay");
-assert.throws(TypeError, () => toPlainDate.call(Temporal.PlainMonthDay.prototype), "Temporal.PlainMonthDay.prototype");
+const args = [{ year: 2022 }];
+
+assert.throws(TypeError, () => toPlainDate.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toPlainDate.apply(null, args), "null");
+assert.throws(TypeError, () => toPlainDate.apply(true, args), "true");
+assert.throws(TypeError, () => toPlainDate.apply("", args), "empty string");
+assert.throws(TypeError, () => toPlainDate.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toPlainDate.apply(1, args), "1");
+assert.throws(TypeError, () => toPlainDate.apply({}, args), "plain object");
+assert.throws(TypeError, () => toPlainDate.apply(Temporal.PlainMonthDay, args), "Temporal.PlainMonthDay");
+assert.throws(TypeError, () => toPlainDate.apply(Temporal.PlainMonthDay.prototype, args), "Temporal.PlainMonthDay.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..bcff288
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.PlainMonthDay
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainMonthDay.prototype, Symbol.toStringTag, {
+ value: "Temporal.PlainMonthDay",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/branding.js
index e178fbad..e8f69fd 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.PlainMonthDay), "Temporal.PlainMonthDay");
-assert.throws(TypeError, () => with_.call(Temporal.PlainMonthDay.prototype), "Temporal.PlainMonthDay.prototype");
+const args = [{ year: 2022, month: 12 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainMonthDay, args), "Temporal.PlainMonthDay");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainMonthDay.prototype, args), "Temporal.PlainMonthDay.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/subclass.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/subclass.js
new file mode 100644
index 0000000..94b0bc4
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainmonthday
+description: Test for Temporal.PlainMonthDay subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomPlainMonthDay extends Temporal.PlainMonthDay {
+}
+
+const instance = new CustomPlainMonthDay(5, 2);
+TemporalHelpers.assertPlainMonthDay(instance, "M05", 2);
+assert.sameValue(Object.getPrototypeOf(instance), CustomPlainMonthDay.prototype, "Instance of CustomPlainMonthDay");
+assert(instance instanceof CustomPlainMonthDay, "Instance of CustomPlainMonthDay");
+assert(instance instanceof Temporal.PlainMonthDay, "Instance of Temporal.PlainMonthDay");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..64fdcfe
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-separators.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const plainTime = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.PlainTime.compare(arg, plainTime),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.PlainTime.compare(plainTime, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/constructor.js
index 819dcba..b3c8f40 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.PlainTime());
+assert.throws(TypeError, () => Temporal.PlainTime(12, 0, 0));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-separators.js
new file mode 100644
index 0000000..536b716
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.PlainTime.from(arg);
+
+ TemporalHelpers.assertPlainTime(
+ result,
+ 12, 34, 56, 987, 654, 321,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js
index 81a981b..8fb1e03 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.PlainTime();
const resultHours = instance.add("-PT24.567890123H");
-TemporalHelpers.assertPlainTime(resultHours, 23, 25, 55, 595, 557, 201, "negative fractional hours");
+TemporalHelpers.assertPlainTime(resultHours, 23, 25, 55, 595, 557, 200, "negative fractional hours");
const resultMinutes = instance.add("-PT1440.567890123M");
-TemporalHelpers.assertPlainTime(resultMinutes, 23, 59, 25, 926, 592, 621, "negative fractional minutes");
+TemporalHelpers.assertPlainTime(resultMinutes, 23, 59, 25, 926, 592, 620, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/branding.js
index 6818345..6139b87 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => add.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => add.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/calendar/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/calendar/basic.js
new file mode 100644
index 0000000..83bd0e3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/calendar/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plaintime.prototype.calendar
+description: calendar returns the iso8601 calendar.
+features: [Temporal]
+---*/
+
+const pt = new Temporal.PlainTime();
+assert(pt.calendar instanceof Temporal.Calendar, "getter returns Calendar object");
+assert.sameValue(pt.calendar.toString(), "iso8601", "getter returns iso8601 calendar");
+assert.sameValue(pt.calendar, pt.calendar, "getter returns the same object");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/constructor.js
new file mode 100644
index 0000000..5c48f29
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.constructor
+description: Test for Temporal.PlainTime.prototype.constructor.
+info: The initial value of Temporal.PlainTime.prototype.constructor is %Temporal.PlainTime%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainTime.prototype, "constructor", {
+ value: Temporal.PlainTime,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..c4d41b7
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/branding.js
index 350a74d..82e4183 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => equals.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.PlainTime(12)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..cf6d41c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/custom.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321, calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoHour, 12, "isoHour result");
+assert.sameValue(result.isoMinute, 34, "isoMinute result");
+assert.sameValue(result.isoSecond, 56, "isoSecond result");
+assert.sameValue(result.isoMillisecond, 987, "isoMillisecond result");
+assert.sameValue(result.isoMicrosecond, 654, "isoMicrosecond result");
+assert.sameValue(result.isoNanosecond, 321, "isoNanosecond result");
+assert.sameValue(result.calendar.id, "iso8601", "calendar result");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..db4982a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/branding.js
index e476134..58e36e8 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof round, "function");
-assert.throws(TypeError, () => round.call(undefined), "undefined");
-assert.throws(TypeError, () => round.call(null), "null");
-assert.throws(TypeError, () => round.call(true), "true");
-assert.throws(TypeError, () => round.call(""), "empty string");
-assert.throws(TypeError, () => round.call(Symbol()), "symbol");
-assert.throws(TypeError, () => round.call(1), "1");
-assert.throws(TypeError, () => round.call({}), "plain object");
-assert.throws(TypeError, () => round.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => round.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = ["hour"];
+
+assert.throws(TypeError, () => round.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => round.apply(null, args), "null");
+assert.throws(TypeError, () => round.apply(true, args), "true");
+assert.throws(TypeError, () => round.apply("", args), "empty string");
+assert.throws(TypeError, () => round.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => round.apply(1, args), "1");
+assert.throws(TypeError, () => round.apply({}, args), "plain object");
+assert.throws(TypeError, () => round.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => round.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..a8084a6
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/branding.js
index 632ee5c..4232b61 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => since.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.PlainTime(12)];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => since.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js
index 6ccef17..882df84 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units.js
@@ -11,7 +11,7 @@
const instance = new Temporal.PlainTime();
const resultHours = instance.subtract("-PT24.567890123H");
-TemporalHelpers.assertPlainTime(resultHours, 0, 34, 4, 404, 442, 799, "negative fractional hours");
+TemporalHelpers.assertPlainTime(resultHours, 0, 34, 4, 404, 442, 800, "negative fractional hours");
const resultMinutes = instance.subtract("-PT1440.567890123M");
-TemporalHelpers.assertPlainTime(resultMinutes, 0, 0, 34, 73, 407, 379, "negative fractional minutes");
+TemporalHelpers.assertPlainTime(resultMinutes, 0, 0, 34, 73, 407, 380, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/branding.js
index 503d158..ff88f4d 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.Duration(0, 0, 0, 0, 5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toJSON/basic.js
new file mode 100644
index 0000000..6d9c606
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toJSON/basic.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tojson
+description: Basic behavior for toJSON
+features: [Temporal]
+---*/
+
+const tests = [
+ [new Temporal.PlainTime(5, 3, 1), "05:03:01"],
+ [new Temporal.PlainTime(15, 23), "15:23:00"],
+ [new Temporal.PlainTime(15, 23, 30), "15:23:30"],
+ [new Temporal.PlainTime(15, 23, 30, 123, 400), "15:23:30.1234"],
+];
+
+const options = new Proxy({}, {
+ get() { throw new Test262Error("should not get properties off argument") }
+});
+for (const [time, expected] of tests) {
+ assert.sameValue(time.toJSON(), expected, "toJSON without argument");
+ assert.sameValue(time.toJSON(options), expected, "toJSON with argument");
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-time-separators.js
new file mode 100644
index 0000000..47f1ddf
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.toplaindatetime
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.toPlainDateTime(arg);
+
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 2000, 5, "M05", 2, 12, 34, 56, 987, 654, 321,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..3aad3b6
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.toplaindatetime
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+assert.throws(Test262Error, () => instance.toPlainDateTime(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..29ab873
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.toplaindatetime
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+instance.toPlainDateTime(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/branding.js
index 16a5cd6..55c9139 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toPlainDateTime, "function");
-assert.throws(TypeError, () => toPlainDateTime.call(undefined), "undefined");
-assert.throws(TypeError, () => toPlainDateTime.call(null), "null");
-assert.throws(TypeError, () => toPlainDateTime.call(true), "true");
-assert.throws(TypeError, () => toPlainDateTime.call(""), "empty string");
-assert.throws(TypeError, () => toPlainDateTime.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toPlainDateTime.call(1), "1");
-assert.throws(TypeError, () => toPlainDateTime.call({}), "plain object");
-assert.throws(TypeError, () => toPlainDateTime.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => toPlainDateTime.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => toPlainDateTime.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toPlainDateTime.apply(null, args), "null");
+assert.throws(TypeError, () => toPlainDateTime.apply(true, args), "true");
+assert.throws(TypeError, () => toPlainDateTime.apply("", args), "empty string");
+assert.throws(TypeError, () => toPlainDateTime.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toPlainDateTime.apply(1, args), "1");
+assert.throws(TypeError, () => toPlainDateTime.apply({}, args), "plain object");
+assert.throws(TypeError, () => toPlainDateTime.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => toPlainDateTime.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
index 2c90ffa..2440b00 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
@@ -7,14 +7,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.PlainTime(15, 23);
-const wholeSeconds = new Temporal.PlainTime(15, 23, 30);
-const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400);
-
const tests = [
- [zeroSeconds, "15:23:00"],
- [wholeSeconds, "15:23:30"],
- [subSeconds, "15:23:30.1234"],
+ [new Temporal.PlainTime(5, 3, 1), "05:03:01"],
+ [new Temporal.PlainTime(15, 23), "15:23:00"],
+ [new Temporal.PlainTime(15, 23, 30), "15:23:30"],
+ [new Temporal.PlainTime(15, 23, 30, 123, 400), "15:23:30.1234"],
];
for (const [time, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
index 0ea1eb8..0dd96d5 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
@@ -7,10 +7,13 @@
features: [Temporal]
---*/
+const fewSeconds = new Temporal.PlainTime(5, 3, 1);
const zeroSeconds = new Temporal.PlainTime(15, 23);
const wholeSeconds = new Temporal.PlainTime(15, 23, 30);
const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400);
+assert.sameValue(fewSeconds.toString({ fractionalSecondDigits: 0 }), "05:03:01",
+ "pads parts with 0");
assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "15:23:30",
"truncates 4 decimal places to 0");
assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "15:23:00.00",
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
index 6c33c55..b8014a6 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
@@ -16,14 +16,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.PlainTime(15, 23);
-const wholeSeconds = new Temporal.PlainTime(15, 23, 30);
-const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400);
-
const tests = [
- [zeroSeconds, "15:23:00"],
- [wholeSeconds, "15:23:30"],
- [subSeconds, "15:23:30.1234"],
+ [new Temporal.PlainTime(5, 3, 1), "05:03:01"],
+ [new Temporal.PlainTime(15, 23), "15:23:00"],
+ [new Temporal.PlainTime(15, 23, 30), "15:23:30"],
+ [new Temporal.PlainTime(15, 23, 30, 123, 400), "15:23:30.1234"],
];
for (const [time, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..8128739
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.PlainTime
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainTime.prototype, Symbol.toStringTag, {
+ value: "Temporal.PlainTime",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-missing-properties.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-missing-properties.js
new file mode 100644
index 0000000..7fea345
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-missing-properties.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.tozoneddatetime
+description: Both plainDate and timeZone properties need to not be undefined.
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainTime();
+const plainDate = new Temporal.PlainDate(2022, 5, 19);
+const timeZone = new Temporal.TimeZone("UTC");
+assert.throws(TypeError, () => instance.toZonedDateTime({}),
+ "no properties");
+assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate }),
+ "only plainDate");
+assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate, timeZone: undefined }),
+ "timeZone explicitly undefined");
+assert.throws(TypeError, () => instance.toZonedDateTime({ timeZone }),
+ "only timeZone");
+assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: undefined, timeZone }),
+ "plainDate explicitly undefined");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-time-separators.js
new file mode 100644
index 0000000..bcc6e52
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tozoneddatetime
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" });
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 957_270_896_987_654_321n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..34e609e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tozoneddatetime
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+assert.throws(Test262Error, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }));
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..9f1421e
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tozoneddatetime
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" });
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/branding.js
index 870960f..8da0b7e 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toZonedDateTime, "function");
-assert.throws(TypeError, () => toZonedDateTime.call(undefined), "undefined");
-assert.throws(TypeError, () => toZonedDateTime.call(null), "null");
-assert.throws(TypeError, () => toZonedDateTime.call(true), "true");
-assert.throws(TypeError, () => toZonedDateTime.call(""), "empty string");
-assert.throws(TypeError, () => toZonedDateTime.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toZonedDateTime.call(1), "1");
-assert.throws(TypeError, () => toZonedDateTime.call({}), "plain object");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => toZonedDateTime.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [{ plainDate: "2022-05-19", timeZone: "UTC" }];
+
+assert.throws(TypeError, () => toZonedDateTime.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toZonedDateTime.apply(null, args), "null");
+assert.throws(TypeError, () => toZonedDateTime.apply(true, args), "true");
+assert.throws(TypeError, () => toZonedDateTime.apply("", args), "empty string");
+assert.throws(TypeError, () => toZonedDateTime.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toZonedDateTime.apply(1, args), "1");
+assert.throws(TypeError, () => toZonedDateTime.apply({}, args), "plain object");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => toZonedDateTime.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..659f282
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/branding.js
index 44234d5..960d787 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => until.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [new Temporal.PlainTime(12)];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => until.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/branding.js
index e67ed99..c60d544 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.PlainTime), "Temporal.PlainTime");
-assert.throws(TypeError, () => with_.call(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype");
+const args = [{ hour: 7 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainTime, args), "Temporal.PlainTime");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainTime.prototype, args), "Temporal.PlainTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js
index dc50e779..fddeb0e 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js
@@ -15,7 +15,6 @@
---*/
const time = new Temporal.PlainTime(12);
-const values = ["", "CONSTRAIN", "balance", "other string"];
const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"];
for (const overflow of badOverflows) {
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/subclass.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/subclass.js
new file mode 100644
index 0000000..1b6de96
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime
+description: Test for Temporal.PlainTime subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomPlainTime extends Temporal.PlainTime {
+}
+
+const instance = new CustomPlainTime(12, 34, 56, 987, 654, 321);
+TemporalHelpers.assertPlainTime(instance, 12, 34, 56, 987, 654, 321);
+assert.sameValue(Object.getPrototypeOf(instance), CustomPlainTime.prototype, "Instance of CustomPlainTime");
+assert(instance instanceof CustomPlainTime, "Instance of CustomPlainTime");
+assert(instance instanceof Temporal.PlainTime, "Instance of Temporal.PlainTime");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..b726c5d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const yearMonth = new Temporal.PlainYearMonth(2019, 12);
+const tests = [
+ ["2019-12-15T15:23", "uppercase T"],
+ ["2019-12-15t15:23", "lowercase T"],
+ ["2019-12-15 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.PlainYearMonth.compare(arg, yearMonth),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.PlainYearMonth.compare(yearMonth, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-string-time-separators.js
new file mode 100644
index 0000000..286a8b9
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-string-time-separators.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.from
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2019-12-15T15:23", "uppercase T"],
+ ["2019-12-15t15:23", "lowercase T"],
+ ["2019-12-15 15:23", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.PlainYearMonth.from(arg);
+
+ TemporalHelpers.assertPlainYearMonth(
+ result,
+ 2019, 12, "M12",
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/branding.js
index e7b6716..0332dcf 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => add.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => add.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js
index 40f5dd1..356c59a 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js
@@ -105,7 +105,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 1 },
+ { year: 2022, monthCode: "M02", day: 1 },
"first day of month 2 passed to dateFromFields when adding positive duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -120,7 +120,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 1 },
+ { year: 2022, monthCode: "M02", day: 1 },
"first day of month 2 passed to dateFromFields when adding positive duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -135,7 +135,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 36 },
+ { year: 2022, monthCode: "M02", day: 36 },
"last day of month 2 passed to dateFromFields when adding negative duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -150,7 +150,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 36 },
+ { year: 2022, monthCode: "M02", day: 36 },
"last day of month 2 passed to dateFromFields when adding negative duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/constructor.js
new file mode 100644
index 0000000..814d940
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.constructor
+description: Test for Temporal.PlainYearMonth.prototype.constructor.
+info: The initial value of Temporal.PlainYearMonth.prototype.constructor is %Temporal.PlainYearMonth%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainYearMonth.prototype, "constructor", {
+ value: Temporal.PlainYearMonth,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js
index 94883e5..c8977a2 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js
@@ -7,5 +7,12 @@
features: [Temporal]
---*/
-const ym = new Temporal.PlainYearMonth(1976, 11);
-assert.sameValue(ym.daysInMonth, 30);
+const tests = [
+ [new Temporal.PlainYearMonth(1976, 2), 29],
+ [new Temporal.PlainYearMonth(1976, 11), 30],
+ [new Temporal.PlainYearMonth(1976, 12), 31],
+ [new Temporal.PlainYearMonth(1977, 2), 28],
+];
+for (const [plainYearMonth, expected] of tests) {
+ assert.sameValue(plainYearMonth.daysInMonth, expected, `${expected} days in the month of ${plainYearMonth}`);
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js
index f17cde0..1f3679b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js
@@ -7,5 +7,5 @@
features: [Temporal]
---*/
-const ym = new Temporal.PlainYearMonth(1976, 11);
-assert.sameValue(ym.daysInYear, 366);
+assert.sameValue((new Temporal.PlainYearMonth(1976, 11)).daysInYear, 366, "leap year");
+assert.sameValue((new Temporal.PlainYearMonth(1977, 11)).daysInYear, 365, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..90962c8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2019-12-15T15:23", "uppercase T"],
+ ["2019-12-15t15:23", "lowercase T"],
+ ["2019-12-15 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainYearMonth(2019, 12);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/branding.js
index b180108..81b6254 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => equals.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [new Temporal.PlainYearMonth(2022, 6)];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => equals.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..64041f1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/custom.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.PlainYearMonth(2000, 5, calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoYear, 2000, "isoYear result");
+assert.sameValue(result.isoMonth, 5, "isoMonth result");
+assert.sameValue(result.isoDay, 1, "isoDay result");
+assert.sameValue(result.calendar, calendar, "calendar result");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..6df8852
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.PlainYearMonth(2000, 5);
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/inLeapYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/inLeapYear/basic.js
new file mode 100644
index 0000000..00cc891
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/inLeapYear/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.plainyearmonth.prototype.inleapyear
+description: Basic test for inLeapYear
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.PlainYearMonth(1976, 11)).inLeapYear,
+ true, "leap year");
+assert.sameValue((new Temporal.PlainYearMonth(1977, 11)).inLeapYear,
+ false, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..b474172
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2019-12-15T15:23", "uppercase T"],
+ ["2019-12-15t15:23", "lowercase T"],
+ ["2019-12-15 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainYearMonth(2019, 12);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/branding.js
index f7327b4..4730290 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => since.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [new Temporal.PlainYearMonth(2022, 6)];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => since.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/branding.js
index cc60497..0de3d15 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => subtract.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => subtract.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js
index fda7e4b..91ed2c4 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js
@@ -105,7 +105,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 36 },
+ { year: 2022, monthCode: "M02", day: 36 },
"last day of month 2 passed to dateFromFields when subtracting positive duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -120,7 +120,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 36 },
+ { year: 2022, monthCode: "M02", day: 36 },
"last day of month 2 passed to dateFromFields when subtracting positive duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -135,7 +135,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 1 },
+ { year: 2022, monthCode: "M02", day: 1 },
"first day of month 2 passed to dateFromFields when subtracting negative duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
@@ -150,7 +150,7 @@
assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called");
assert.deepEqual(
calendar.dateFromFieldsCalls[0][0],
- { year: 2022, month: 2, monthCode: "M02", day: 1 },
+ { year: 2022, monthCode: "M02", day: 1 },
"first day of month 2 passed to dateFromFields when subtracting negative duration"
);
assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/branding.js
index 67d1601..87aa00b 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof toPlainDate, "function");
-assert.throws(TypeError, () => toPlainDate.call(undefined), "undefined");
-assert.throws(TypeError, () => toPlainDate.call(null), "null");
-assert.throws(TypeError, () => toPlainDate.call(true), "true");
-assert.throws(TypeError, () => toPlainDate.call(""), "empty string");
-assert.throws(TypeError, () => toPlainDate.call(Symbol()), "symbol");
-assert.throws(TypeError, () => toPlainDate.call(1), "1");
-assert.throws(TypeError, () => toPlainDate.call({}), "plain object");
-assert.throws(TypeError, () => toPlainDate.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => toPlainDate.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [{ day: 7 }];
+
+assert.throws(TypeError, () => toPlainDate.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => toPlainDate.apply(null, args), "null");
+assert.throws(TypeError, () => toPlainDate.apply(true, args), "true");
+assert.throws(TypeError, () => toPlainDate.apply("", args), "empty string");
+assert.throws(TypeError, () => toPlainDate.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => toPlainDate.apply(1, args), "1");
+assert.throws(TypeError, () => toPlainDate.apply({}, args), "plain object");
+assert.throws(TypeError, () => toPlainDate.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => toPlainDate.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..1dfe73a
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.PlainYearMonth
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.PlainYearMonth.prototype, Symbol.toStringTag, {
+ value: "Temporal.PlainYearMonth",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..574ca12
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["2019-12-15T15:23", "uppercase T"],
+ ["2019-12-15t15:23", "lowercase T"],
+ ["2019-12-15 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.PlainYearMonth(2019, 12);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/branding.js
index 4487e20..09ed4df 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => until.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [new Temporal.PlainYearMonth(2022, 6)];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => until.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/branding.js
index 131d9f8..f0c0858 100644
--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.PlainYearMonth), "Temporal.PlainYearMonth");
-assert.throws(TypeError, () => with_.call(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype");
+const args = [{ year: 2022 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainYearMonth, args), "Temporal.PlainYearMonth");
+assert.throws(TypeError, () => with_.apply(Temporal.PlainYearMonth.prototype, args), "Temporal.PlainYearMonth.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/subclass.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/subclass.js
new file mode 100644
index 0000000..d1746a2
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/subclass.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plainyearmonth
+description: Test for Temporal.PlainYearMonth subclassing.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+class CustomPlainYearMonth extends Temporal.PlainYearMonth {
+}
+
+const instance = new CustomPlainYearMonth(2000, 5);
+TemporalHelpers.assertPlainYearMonth(instance, 2000, 5, "M05");
+assert.sameValue(Object.getPrototypeOf(instance), CustomPlainYearMonth.prototype, "Instance of CustomPlainYearMonth");
+assert(instance instanceof CustomPlainYearMonth, "Instance of CustomPlainYearMonth");
+assert(instance instanceof Temporal.PlainYearMonth, "Instance of Temporal.PlainYearMonth");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/constructor.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/constructor.js
index 7ed1159..5494561 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.TimeZone());
+assert.throws(TypeError, () => Temporal.TimeZone("UTC"));
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/constructor.js
new file mode 100644
index 0000000..1a8925c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.constructor
+description: Test for Temporal.TimeZone.prototype.constructor.
+info: The initial value of Temporal.TimeZone.prototype.constructor is %Temporal.TimeZone%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.TimeZone.prototype, "constructor", {
+ value: Temporal.TimeZone,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-string-time-separators.js
new file mode 100644
index 0000000..a2c1b1c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getinstantfor
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getInstantFor(arg);
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 217_178_580_000_000_000n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/branding.js
index b8c570c..0a95f4c 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getInstantFor, "function");
-assert.throws(TypeError, () => getInstantFor.call(undefined), "undefined");
-assert.throws(TypeError, () => getInstantFor.call(null), "null");
-assert.throws(TypeError, () => getInstantFor.call(true), "true");
-assert.throws(TypeError, () => getInstantFor.call(""), "empty string");
-assert.throws(TypeError, () => getInstantFor.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getInstantFor.call(1), "1");
-assert.throws(TypeError, () => getInstantFor.call({}), "plain object");
-assert.throws(TypeError, () => getInstantFor.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getInstantFor.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.PlainDateTime(2022, 6, 22)];
+
+assert.throws(TypeError, () => getInstantFor.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getInstantFor.apply(null, args), "null");
+assert.throws(TypeError, () => getInstantFor.apply(true, args), "true");
+assert.throws(TypeError, () => getInstantFor.apply("", args), "empty string");
+assert.throws(TypeError, () => getInstantFor.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getInstantFor.apply(1, args), "1");
+assert.throws(TypeError, () => getInstantFor.apply({}, args), "plain object");
+assert.throws(TypeError, () => getInstantFor.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getInstantFor.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-invalid.js
new file mode 100644
index 0000000..934edbf
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getnexttransition
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.TimeZone("UTC");
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.getNextTransition(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-time-separators.js
new file mode 100644
index 0000000..7bef091
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getnexttransition
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getNextTransition(arg);
+
+ assert.sameValue(
+ result,
+ null,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/branding.js
index 6a53945..9b629ee 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getNextTransition, "function");
-assert.throws(TypeError, () => getNextTransition.call(undefined), "undefined");
-assert.throws(TypeError, () => getNextTransition.call(null), "null");
-assert.throws(TypeError, () => getNextTransition.call(true), "true");
-assert.throws(TypeError, () => getNextTransition.call(""), "empty string");
-assert.throws(TypeError, () => getNextTransition.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getNextTransition.call(1), "1");
-assert.throws(TypeError, () => getNextTransition.call({}), "plain object");
-assert.throws(TypeError, () => getNextTransition.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getNextTransition.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.Instant(0n)];
+
+assert.throws(TypeError, () => getNextTransition.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getNextTransition.apply(null, args), "null");
+assert.throws(TypeError, () => getNextTransition.apply(true, args), "true");
+assert.throws(TypeError, () => getNextTransition.apply("", args), "empty string");
+assert.throws(TypeError, () => getNextTransition.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getNextTransition.apply(1, args), "1");
+assert.throws(TypeError, () => getNextTransition.apply({}, args), "plain object");
+assert.throws(TypeError, () => getNextTransition.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getNextTransition.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-invalid.js
new file mode 100644
index 0000000..7780706
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getoffsetnanosecondsfor
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.TimeZone("UTC");
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.getOffsetNanosecondsFor(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-time-separators.js
new file mode 100644
index 0000000..c653a0f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getoffsetnanosecondsfor
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getOffsetNanosecondsFor(arg);
+
+ assert.sameValue(
+ result,
+ 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/branding.js
index a63ebda..6071b04 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getOffsetNanosecondsFor, "function");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(undefined), "undefined");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(null), "null");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(true), "true");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(""), "empty string");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(1), "1");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call({}), "plain object");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getOffsetNanosecondsFor.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.Instant(0n)];
+
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(null, args), "null");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(true, args), "true");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply("", args), "empty string");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(1, args), "1");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply({}, args), "plain object");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getOffsetNanosecondsFor.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-invalid.js
new file mode 100644
index 0000000..f3c2d26
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getoffsetstringfor
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.TimeZone("UTC");
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.getOffsetStringFor(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-time-separators.js
new file mode 100644
index 0000000..255947d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getoffsetstringfor
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getOffsetStringFor(arg);
+
+ assert.sameValue(
+ result,
+ "+00:00",
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/branding.js
index 0fc6c49..1017cda 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getOffsetStringFor, "function");
-assert.throws(TypeError, () => getOffsetStringFor.call(undefined), "undefined");
-assert.throws(TypeError, () => getOffsetStringFor.call(null), "null");
-assert.throws(TypeError, () => getOffsetStringFor.call(true), "true");
-assert.throws(TypeError, () => getOffsetStringFor.call(""), "empty string");
-assert.throws(TypeError, () => getOffsetStringFor.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getOffsetStringFor.call(1), "1");
-assert.throws(TypeError, () => getOffsetStringFor.call({}), "plain object");
-assert.throws(TypeError, () => getOffsetStringFor.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getOffsetStringFor.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.Instant(0n)];
+
+assert.throws(TypeError, () => getOffsetStringFor.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getOffsetStringFor.apply(null, args), "null");
+assert.throws(TypeError, () => getOffsetStringFor.apply(true, args), "true");
+assert.throws(TypeError, () => getOffsetStringFor.apply("", args), "empty string");
+assert.throws(TypeError, () => getOffsetStringFor.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getOffsetStringFor.apply(1, args), "1");
+assert.throws(TypeError, () => getOffsetStringFor.apply({}, args), "plain object");
+assert.throws(TypeError, () => getOffsetStringFor.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getOffsetStringFor.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-invalid.js
new file mode 100644
index 0000000..8d114f8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getplaindatetimefor
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.TimeZone("UTC");
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.getPlainDateTimeFor(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-time-separators.js
new file mode 100644
index 0000000..8e80217
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getplaindatetimefor
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getPlainDateTimeFor(arg);
+
+ TemporalHelpers.assertPlainDateTime(
+ result,
+ 1970, 1, "M01", 1, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js
index 9027fd1..55dce10 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js
@@ -9,7 +9,9 @@
const getPlainDateTimeFor = Temporal.TimeZone.prototype.getPlainDateTimeFor;
- const args = [new Temporal.Instant(0n)];
+assert.sameValue(typeof getPlainDateTimeFor, "function");
+
+const args = [new Temporal.Instant(0n)];
assert.throws(TypeError, () => getPlainDateTimeFor.apply(undefined, args), "undefined");
assert.throws(TypeError, () => getPlainDateTimeFor.apply(null, args), "null");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-string-time-separators.js
new file mode 100644
index 0000000..91a62b1
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getpossibleinstantsfor
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [compareArray.js]
+---*/
+
+const tests = [
+ ["1976-11-18T15:23", "uppercase T"],
+ ["1976-11-18t15:23", "lowercase T"],
+ ["1976-11-18 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getPossibleInstantsFor(arg);
+
+ assert.compareArray(
+ result.map(i => i.epochNanoseconds),
+ [217_178_580_000_000_000n],
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/branding.js
index 431d3c5..8506d52 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getPossibleInstantsFor, "function");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(undefined), "undefined");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(null), "null");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(true), "true");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(""), "empty string");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(1), "1");
-assert.throws(TypeError, () => getPossibleInstantsFor.call({}), "plain object");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getPossibleInstantsFor.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.PlainDateTime(2022, 6, 22)];
+
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(null, args), "null");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(true, args), "true");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply("", args), "empty string");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(1, args), "1");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply({}, args), "plain object");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getPossibleInstantsFor.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-invalid.js
new file mode 100644
index 0000000..3b83ea8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-invalid.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2022 Igalia S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getprevioustransition
+description: >
+ RangeError thrown if an invalid ISO string (or syntactically valid ISO string
+ that is not supported) is used as an Instant
+features: [Temporal, arrow-function]
+---*/
+
+const invalidStrings = [
+ // invalid ISO strings:
+ "",
+ "invalid iso8601",
+ "2020-01-00T00:00Z",
+ "2020-01-32T00:00Z",
+ "2020-02-30T00:00Z",
+ "2021-02-29T00:00Z",
+ "2020-00-01T00:00Z",
+ "2020-13-01T00:00Z",
+ "2020-01-01TZ",
+ "2020-01-01T25:00:00Z",
+ "2020-01-01T01:60:00Z",
+ "2020-01-01T01:60:61Z",
+ "2020-01-01T00:00Zjunk",
+ "2020-01-01T00:00:00Zjunk",
+ "2020-01-01T00:00:00.000000000Zjunk",
+ "2020-01-01T00:00:00+00:00junk",
+ "2020-01-01T00:00:00+00:00[UTC]junk",
+ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk",
+ "02020-01-01T00:00Z",
+ "2020-001-01T00:00Z",
+ "2020-01-001T00:00Z",
+ "2020-01-01T001Z",
+ "2020-01-01T01:001Z",
+ "2020-01-01T01:01:001Z",
+ // valid, but forms not supported in Temporal:
+ "2020-W01-1T00:00Z",
+ "2020-001T00:00Z",
+ "+0002020-01-01T00:00Z",
+ // may be valid in other contexts, but insufficient information for Instant:
+ "2020-01",
+ "+002020-01",
+ "01-01",
+ "2020-W01",
+ "P1Y",
+ "-P12Y",
+ "2020-01-01",
+ "2020-01-01T00",
+ "2020-01-01T00:00",
+ "2020-01-01T00:00:00",
+ "2020-01-01T00:00:00.000000000",
+ // valid, but outside the supported range:
+ "-999999-01-01T00:00Z",
+ "+999999-01-01T00:00Z",
+];
+
+const instance = new Temporal.TimeZone("UTC");
+for (const arg of invalidStrings) {
+ assert.throws(
+ RangeError,
+ () => instance.getPreviousTransition(arg),
+ `"${arg}" should not be a valid ISO string for an Instant`
+ );
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-time-separators.js
new file mode 100644
index 0000000..d9023ea
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype.getprevioustransition
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00Z", "uppercase T"],
+ ["1970-01-01t00:00Z", "lowercase T"],
+ ["1970-01-01 00:00Z", "space between date and time"],
+];
+
+const instance = new Temporal.TimeZone("UTC");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.getPreviousTransition(arg);
+
+ assert.sameValue(
+ result,
+ null,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/branding.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/branding.js
index eaa3530..75e4164 100644
--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof getPreviousTransition, "function");
-assert.throws(TypeError, () => getPreviousTransition.call(undefined), "undefined");
-assert.throws(TypeError, () => getPreviousTransition.call(null), "null");
-assert.throws(TypeError, () => getPreviousTransition.call(true), "true");
-assert.throws(TypeError, () => getPreviousTransition.call(""), "empty string");
-assert.throws(TypeError, () => getPreviousTransition.call(Symbol()), "symbol");
-assert.throws(TypeError, () => getPreviousTransition.call(1), "1");
-assert.throws(TypeError, () => getPreviousTransition.call({}), "plain object");
-assert.throws(TypeError, () => getPreviousTransition.call(Temporal.TimeZone), "Temporal.TimeZone");
-assert.throws(TypeError, () => getPreviousTransition.call(Temporal.TimeZone.prototype), "Temporal.TimeZone.prototype");
+const args = [new Temporal.Instant(0n)];
+
+assert.throws(TypeError, () => getPreviousTransition.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => getPreviousTransition.apply(null, args), "null");
+assert.throws(TypeError, () => getPreviousTransition.apply(true, args), "true");
+assert.throws(TypeError, () => getPreviousTransition.apply("", args), "empty string");
+assert.throws(TypeError, () => getPreviousTransition.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => getPreviousTransition.apply(1, args), "1");
+assert.throws(TypeError, () => getPreviousTransition.apply({}, args), "plain object");
+assert.throws(TypeError, () => getPreviousTransition.apply(Temporal.TimeZone, args), "Temporal.TimeZone");
+assert.throws(TypeError, () => getPreviousTransition.apply(Temporal.TimeZone.prototype, args), "Temporal.TimeZone.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..2aeae37
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.TimeZone
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.TimeZone.prototype, Symbol.toStringTag, {
+ value: "Temporal.TimeZone",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/subclass.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/subclass.js
new file mode 100644
index 0000000..d0b5364
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/subclass.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.timezone
+description: Test for Temporal.TimeZone subclassing.
+features: [Temporal]
+---*/
+
+class CustomTimeZone extends Temporal.TimeZone {
+}
+
+const instance = new CustomTimeZone("UTC");
+assert.sameValue(instance.toString(), "UTC");
+assert.sameValue(Object.getPrototypeOf(instance), CustomTimeZone.prototype, "Instance of CustomTimeZone");
+assert(instance instanceof CustomTimeZone, "Instance of CustomTimeZone");
+assert(instance instanceof Temporal.TimeZone, "Instance of Temporal.TimeZone");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-string-time-separators.js
new file mode 100644
index 0000000..66196f5
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.compare
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const epoch = new Temporal.ZonedDateTime(0n, "UTC");
+const tests = [
+ ["1970-01-01T00:00+00:00[UTC]", "uppercase T"],
+ ["1970-01-01t00:00+00:00[UTC]", "lowercase T"],
+ ["1970-01-01 00:00+00:00[UTC]", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ assert.sameValue(
+ Temporal.ZonedDateTime.compare(arg, epoch),
+ 0,
+ `variant time separators (${description}), first argument`
+ );
+
+ assert.sameValue(
+ Temporal.ZonedDateTime.compare(epoch, arg),
+ 0,
+ `variant time separators (${description}), second argument`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/constructor.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/constructor.js
index 54f8482..2b04f5e 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/constructor.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/constructor.js
@@ -9,4 +9,4 @@
features: [Temporal]
---*/
-assert.throws(TypeError, () => Temporal.ZonedDateTime());
+assert.throws(TypeError, () => Temporal.ZonedDateTime(0n, "UTC"));
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-string-time-separators.js
new file mode 100644
index 0000000..f92d641
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-string-time-separators.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.from
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00+00:00[UTC]", "uppercase T"],
+ ["1970-01-01t00:00+00:00[UTC]", "lowercase T"],
+ ["1970-01-01 00:00+00:00[UTC]", "space between date and time"],
+];
+
+tests.forEach(([arg, description]) => {
+ const result = Temporal.ZonedDateTime.from(arg);
+
+ assert.sameValue(
+ result.timeZone.toString(),
+ "UTC",
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units.js
index 0c62f3b..fc2260b 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-negative-fractional-units.js
@@ -10,7 +10,7 @@
const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC");
const resultHours = instance.add("-PT24.567890123H");
-assert.sameValue(resultHours.epochNanoseconds, 999_911_555_595_557_201n, "negative fractional hours");
+assert.sameValue(resultHours.epochNanoseconds, 999_911_555_595_557_200n, "negative fractional hours");
const resultMinutes = instance.add("-PT1440.567890123M");
-assert.sameValue(resultMinutes.epochNanoseconds, 999_913_565_926_592_621n, "negative fractional minutes");
+assert.sameValue(resultMinutes.epochNanoseconds, 999_913_565_926_592_620n, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/branding.js
index c9dc587..1f7ce7d 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof add, "function");
-assert.throws(TypeError, () => add.call(undefined), "undefined");
-assert.throws(TypeError, () => add.call(null), "null");
-assert.throws(TypeError, () => add.call(true), "true");
-assert.throws(TypeError, () => add.call(""), "empty string");
-assert.throws(TypeError, () => add.call(Symbol()), "symbol");
-assert.throws(TypeError, () => add.call(1), "1");
-assert.throws(TypeError, () => add.call({}), "plain object");
-assert.throws(TypeError, () => add.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => add.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => add.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => add.apply(null, args), "null");
+assert.throws(TypeError, () => add.apply(true, args), "true");
+assert.throws(TypeError, () => add.apply("", args), "empty string");
+assert.throws(TypeError, () => add.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => add.apply(1, args), "1");
+assert.throws(TypeError, () => add.apply({}, args), "plain object");
+assert.throws(TypeError, () => add.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => add.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/constructor.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/constructor.js
new file mode 100644
index 0000000..01ee283
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/constructor.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.constructor
+description: Test for Temporal.ZonedDateTime.prototype.constructor.
+info: The initial value of Temporal.ZonedDateTime.prototype.constructor is %Temporal.ZonedDateTime%.
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.ZonedDateTime.prototype, "constructor", {
+ value: Temporal.ZonedDateTime,
+ writable: true,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/daysInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/daysInYear/basic.js
new file mode 100644
index 0000000..432e32d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/daysInYear/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.zoneddatetime.prototype.daysinyear
+description: Checking days in year for a "normal" case (non-undefined, non-boundary case, etc.)
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.ZonedDateTime(217178610123456789n, "UTC")).daysInYear,
+ 366, "leap year");
+assert.sameValue((new Temporal.ZonedDateTime(248714610123456789n, "UTC")).daysInYear,
+ 365, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-time-separators.js
new file mode 100644
index 0000000..3c5f4f8
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.equals
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00+00:00[UTC]", "uppercase T"],
+ ["1970-01-01t00:00+00:00[UTC]", "lowercase T"],
+ ["1970-01-01 00:00+00:00[UTC]", "space between date and time"],
+];
+
+const timeZone = new Temporal.TimeZone("UTC");
+const instance = new Temporal.ZonedDateTime(0n, timeZone);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.equals(arg);
+
+ assert.sameValue(
+ result,
+ true,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/branding.js
index 05705c4..3d135a3 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof equals, "function");
-assert.throws(TypeError, () => equals.call(undefined), "undefined");
-assert.throws(TypeError, () => equals.call(null), "null");
-assert.throws(TypeError, () => equals.call(true), "true");
-assert.throws(TypeError, () => equals.call(""), "empty string");
-assert.throws(TypeError, () => equals.call(Symbol()), "symbol");
-assert.throws(TypeError, () => equals.call(1), "1");
-assert.throws(TypeError, () => equals.call({}), "plain object");
-assert.throws(TypeError, () => equals.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => equals.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.ZonedDateTime(123456n, new Temporal.TimeZone("UTC"))];
+
+assert.throws(TypeError, () => equals.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => equals.apply(null, args), "null");
+assert.throws(TypeError, () => equals.apply(true, args), "true");
+assert.throws(TypeError, () => equals.apply("", args), "empty string");
+assert.throws(TypeError, () => equals.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => equals.apply(1, args), "1");
+assert.throws(TypeError, () => equals.apply({}, args), "plain object");
+assert.throws(TypeError, () => equals.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => equals.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/custom.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/custom.js
new file mode 100644
index 0000000..972b3fc
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/custom.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.getisofields
+description: getISOFields does not call into user code.
+includes: [temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const calendar = TemporalHelpers.calendarThrowEverything();
+const instance = new Temporal.ZonedDateTime(1_000_086_400_987_654_321n, "UTC", calendar);
+const result = instance.getISOFields();
+
+assert.sameValue(result.isoYear, 2001, "isoYear result");
+assert.sameValue(result.isoMonth, 9, "isoMonth result");
+assert.sameValue(result.isoDay, 10, "isoDay result");
+assert.sameValue(result.isoHour, 1, "isoHour result");
+assert.sameValue(result.isoMinute, 46, "isoMinute result");
+assert.sameValue(result.isoSecond, 40, "isoSecond result");
+assert.sameValue(result.isoMillisecond, 987, "isoMillisecond result");
+assert.sameValue(result.isoMicrosecond, 654, "isoMicrosecond result");
+assert.sameValue(result.isoNanosecond, 321, "isoNanosecond result");
+assert.sameValue(result.offset, "+00:00", "offset result");
+assert.sameValue(result.calendar, calendar, "calendar result");
+assert.sameValue(result.timeZone.id, "UTC", "timeZone result");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/prototype.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/prototype.js
new file mode 100644
index 0000000..83988ce
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/getISOFields/prototype.js
@@ -0,0 +1,12 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.getisofields
+description: Correct prototype on the object returned from getISOFields
+features: [Temporal]
+---*/
+
+const instance = new Temporal.ZonedDateTime(1_000_086_400_987_654_321n, "UTC");
+const result = instance.getISOFields();
+assert.sameValue(Object.getPrototypeOf(result), Object.prototype, "prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/inLeapYear/basic.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/inLeapYear/basic.js
new file mode 100644
index 0000000..5ea7759
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/inLeapYear/basic.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-get-temporal.zoneddatetime.prototype.inleapyear
+description: Basic test for inLeapYear
+features: [Temporal]
+---*/
+
+assert.sameValue((new Temporal.ZonedDateTime(217178610123456789n, "UTC")).inLeapYear,
+ true, "leap year");
+assert.sameValue((new Temporal.ZonedDateTime(248714610123456789n, "UTC")).inLeapYear,
+ false, "non-leap year");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/branding.js
index f0b708e..2aaf37a 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof round, "function");
-assert.throws(TypeError, () => round.call(undefined), "undefined");
-assert.throws(TypeError, () => round.call(null), "null");
-assert.throws(TypeError, () => round.call(true), "true");
-assert.throws(TypeError, () => round.call(""), "empty string");
-assert.throws(TypeError, () => round.call(Symbol()), "symbol");
-assert.throws(TypeError, () => round.call(1), "1");
-assert.throws(TypeError, () => round.call({}), "plain object");
-assert.throws(TypeError, () => round.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => round.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = ["hour"];
+
+assert.throws(TypeError, () => round.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => round.apply(null, args), "null");
+assert.throws(TypeError, () => round.apply(true, args), "true");
+assert.throws(TypeError, () => round.apply("", args), "empty string");
+assert.throws(TypeError, () => round.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => round.apply(1, args), "1");
+assert.throws(TypeError, () => round.apply({}, args), "plain object");
+assert.throws(TypeError, () => round.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => round.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-time-separators.js
new file mode 100644
index 0000000..1e5915d
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-string-time-separators.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.since
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00+00:00[UTC]", "uppercase T"],
+ ["1970-01-01t00:00+00:00[UTC]", "lowercase T"],
+ ["1970-01-01 00:00+00:00[UTC]", "space between date and time"],
+];
+
+const timeZone = new Temporal.TimeZone("UTC");
+const instance = new Temporal.ZonedDateTime(0n, timeZone);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.since(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/branding.js
index 2676e64..5695e13 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof since, "function");
-assert.throws(TypeError, () => since.call(undefined), "undefined");
-assert.throws(TypeError, () => since.call(null), "null");
-assert.throws(TypeError, () => since.call(true), "true");
-assert.throws(TypeError, () => since.call(""), "empty string");
-assert.throws(TypeError, () => since.call(Symbol()), "symbol");
-assert.throws(TypeError, () => since.call(1), "1");
-assert.throws(TypeError, () => since.call({}), "plain object");
-assert.throws(TypeError, () => since.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => since.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.ZonedDateTime(123456n, new Temporal.TimeZone("UTC"))];
+
+assert.throws(TypeError, () => since.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => since.apply(null, args), "null");
+assert.throws(TypeError, () => since.apply(true, args), "true");
+assert.throws(TypeError, () => since.apply("", args), "empty string");
+assert.throws(TypeError, () => since.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => since.apply(1, args), "1");
+assert.throws(TypeError, () => since.apply({}, args), "plain object");
+assert.throws(TypeError, () => since.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => since.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-negative-fractional-units.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-negative-fractional-units.js
index 5ccf128..c3cd496 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-negative-fractional-units.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-negative-fractional-units.js
@@ -10,7 +10,7 @@
const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC");
const resultHours = instance.subtract("-PT24.567890123H");
-assert.sameValue(resultHours.epochNanoseconds, 1_000_088_444_404_442_799n, "negative fractional hours");
+assert.sameValue(resultHours.epochNanoseconds, 1_000_088_444_404_442_800n, "negative fractional hours");
const resultMinutes = instance.subtract("-PT1440.567890123M");
-assert.sameValue(resultMinutes.epochNanoseconds, 1_000_086_434_073_407_379n, "negative fractional minutes");
+assert.sameValue(resultMinutes.epochNanoseconds, 1_000_086_434_073_407_380n, "negative fractional minutes");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/branding.js
index 0dcb416..226d5d0 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof subtract, "function");
-assert.throws(TypeError, () => subtract.call(undefined), "undefined");
-assert.throws(TypeError, () => subtract.call(null), "null");
-assert.throws(TypeError, () => subtract.call(true), "true");
-assert.throws(TypeError, () => subtract.call(""), "empty string");
-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol");
-assert.throws(TypeError, () => subtract.call(1), "1");
-assert.throws(TypeError, () => subtract.call({}), "plain object");
-assert.throws(TypeError, () => subtract.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => subtract.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.Duration(5)];
+
+assert.throws(TypeError, () => subtract.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => subtract.apply(null, args), "null");
+assert.throws(TypeError, () => subtract.apply(true, args), "true");
+assert.throws(TypeError, () => subtract.apply("", args), "empty string");
+assert.throws(TypeError, () => subtract.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => subtract.apply(1, args), "1");
+assert.throws(TypeError, () => subtract.apply({}, args), "plain object");
+assert.throws(TypeError, () => subtract.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => subtract.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/basic.js
new file mode 100644
index 0000000..8c936f3
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/basic.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.tojson
+description: Basic behavior for toJSON
+features: [BigInt, Temporal]
+---*/
+
+const tests = [
+ [new Temporal.ZonedDateTime(192_258_181_000_000_000n, "UTC"), "1976-02-04T05:03:01+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(0n, "UTC"), "1970-01-01T00:00:00+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_000_000_000n, "UTC"), "1970-01-01T00:00:30+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_123_400_000n, "UTC"), "1970-01-01T00:00:30.1234+00:00[UTC]"],
+];
+
+const options = new Proxy({}, {
+ get() { throw new Test262Error("should not get properties off argument") }
+});
+for (const [datetime, expected] of tests) {
+ assert.sameValue(datetime.toJSON(), expected, "toJSON without argument");
+ assert.sameValue(datetime.toJSON(options), expected, "toJSON with argument");
+}
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js
index bffb928..0beb01a 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js
@@ -7,14 +7,11 @@
features: [BigInt, Temporal]
---*/
-const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC");
-const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC");
-const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC");
-
const tests = [
- [zeroSeconds, "1970-01-01T00:00:00+00:00[UTC]"],
- [wholeSeconds, "1970-01-01T00:00:30+00:00[UTC]"],
- [subSeconds, "1970-01-01T00:00:30.1234+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(192_258_181_000_000_000n, "UTC"), "1976-02-04T05:03:01+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(0n, "UTC"), "1970-01-01T00:00:00+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_000_000_000n, "UTC"), "1970-01-01T00:00:30+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_123_400_000n, "UTC"), "1970-01-01T00:00:30.1234+00:00[UTC]"],
];
for (const [datetime, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js
index 0063031..3bab180 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js
@@ -7,10 +7,13 @@
features: [BigInt, Temporal]
---*/
+const fewSeconds = new Temporal.ZonedDateTime(192_258_181_000_000_000n, "UTC");
const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC");
const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC");
const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC");
+assert.sameValue(fewSeconds.toString({ fractionalSecondDigits: 0 }), "1976-02-04T05:03:01+00:00[UTC]",
+ "pads parts with 0");
assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1970-01-01T00:00:30+00:00[UTC]",
"truncates 4 decimal places to 0");
assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:00.00+00:00[UTC]",
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js
index 734f436..2c6f17d 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js
@@ -16,14 +16,11 @@
features: [Temporal]
---*/
-const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC");
-const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC");
-const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC");
-
const tests = [
- [zeroSeconds, "1970-01-01T00:00:00+00:00[UTC]"],
- [wholeSeconds, "1970-01-01T00:00:30+00:00[UTC]"],
- [subSeconds, "1970-01-01T00:00:30.1234+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(192_258_181_000_000_000n, "UTC"), "1976-02-04T05:03:01+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(0n, "UTC"), "1970-01-01T00:00:00+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_000_000_000n, "UTC"), "1970-01-01T00:00:30+00:00[UTC]"],
+ [new Temporal.ZonedDateTime(30_123_400_000n, "UTC"), "1970-01-01T00:00:30.1234+00:00[UTC]"],
];
for (const [datetime, expected] of tests) {
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toStringTag/prop-desc.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toStringTag/prop-desc.js
new file mode 100644
index 0000000..72fadda
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toStringTag/prop-desc.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype-@@tostringtag
+description: The @@toStringTag property of Temporal.ZonedDateTime
+includes: [propertyHelper.js]
+features: [Temporal]
+---*/
+
+verifyProperty(Temporal.ZonedDateTime.prototype, Symbol.toStringTag, {
+ value: "Temporal.ZonedDateTime",
+ writable: false,
+ enumerable: false,
+ configurable: true,
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-time-separators.js
new file mode 100644
index 0000000..10cf351
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-string-time-separators.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.until
+description: Time separator in string argument can vary
+features: [Temporal]
+includes: [temporalHelpers.js]
+---*/
+
+const tests = [
+ ["1970-01-01T00:00+00:00[UTC]", "uppercase T"],
+ ["1970-01-01t00:00+00:00[UTC]", "lowercase T"],
+ ["1970-01-01 00:00+00:00[UTC]", "space between date and time"],
+];
+
+const timeZone = new Temporal.TimeZone("UTC");
+const instance = new Temporal.ZonedDateTime(0n, timeZone);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.until(arg);
+
+ TemporalHelpers.assertDuration(
+ result,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/branding.js
index 18210ae..a84b29e 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof until, "function");
-assert.throws(TypeError, () => until.call(undefined), "undefined");
-assert.throws(TypeError, () => until.call(null), "null");
-assert.throws(TypeError, () => until.call(true), "true");
-assert.throws(TypeError, () => until.call(""), "empty string");
-assert.throws(TypeError, () => until.call(Symbol()), "symbol");
-assert.throws(TypeError, () => until.call(1), "1");
-assert.throws(TypeError, () => until.call({}), "plain object");
-assert.throws(TypeError, () => until.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => until.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.ZonedDateTime(123456n, new Temporal.TimeZone("UTC"))];
+
+assert.throws(TypeError, () => until.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => until.apply(null, args), "null");
+assert.throws(TypeError, () => until.apply(true, args), "true");
+assert.throws(TypeError, () => until.apply("", args), "empty string");
+assert.throws(TypeError, () => until.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => until.apply(1, args), "1");
+assert.throws(TypeError, () => until.apply({}, args), "plain object");
+assert.throws(TypeError, () => until.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => until.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/valueOf/basic.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/valueOf/basic.js
new file mode 100644
index 0000000..4d576fd
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/valueOf/basic.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.valueof
+description: Basic tests for valueOf().
+features: [Temporal]
+---*/
+
+const zonedDateTime = new Temporal.ZonedDateTime(100n, "UTC");
+const zonedDateTime2 = new Temporal.ZonedDateTime(987654321n, "UTC");
+
+assert.throws(TypeError, () => zonedDateTime.valueOf(), "valueOf");
+assert.throws(TypeError, () => zonedDateTime < zonedDateTime, "<");
+assert.throws(TypeError, () => zonedDateTime <= zonedDateTime, "<=");
+assert.throws(TypeError, () => zonedDateTime > zonedDateTime, ">");
+assert.throws(TypeError, () => zonedDateTime >= zonedDateTime, ">=");
+assert.sameValue(zonedDateTime === zonedDateTime, true, "===");
+assert.sameValue(zonedDateTime === zonedDateTime2, false, "===");
+assert.sameValue(zonedDateTime !== zonedDateTime, false, "!==");
+assert.sameValue(zonedDateTime !== zonedDateTime2, true, "!==");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/branding.js
index 2d9fa03..70be8c4 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof with_, "function");
-assert.throws(TypeError, () => with_.call(undefined), "undefined");
-assert.throws(TypeError, () => with_.call(null), "null");
-assert.throws(TypeError, () => with_.call(true), "true");
-assert.throws(TypeError, () => with_.call(""), "empty string");
-assert.throws(TypeError, () => with_.call(Symbol()), "symbol");
-assert.throws(TypeError, () => with_.call(1), "1");
-assert.throws(TypeError, () => with_.call({}), "plain object");
-assert.throws(TypeError, () => with_.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => with_.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [{ year: 2022 }];
+
+assert.throws(TypeError, () => with_.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => with_.apply(null, args), "null");
+assert.throws(TypeError, () => with_.apply(true, args), "true");
+assert.throws(TypeError, () => with_.apply("", args), "empty string");
+assert.throws(TypeError, () => with_.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => with_.apply(1, args), "1");
+assert.throws(TypeError, () => with_.apply({}, args), "plain object");
+assert.throws(TypeError, () => with_.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => with_.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding.js
index 4958c28..1533200 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withCalendar, "function");
-assert.throws(TypeError, () => withCalendar.call(undefined), "undefined");
-assert.throws(TypeError, () => withCalendar.call(null), "null");
-assert.throws(TypeError, () => withCalendar.call(true), "true");
-assert.throws(TypeError, () => withCalendar.call(""), "empty string");
-assert.throws(TypeError, () => withCalendar.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withCalendar.call(1), "1");
-assert.throws(TypeError, () => withCalendar.call({}), "plain object");
-assert.throws(TypeError, () => withCalendar.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => withCalendar.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.Calendar("iso8601")];
+
+assert.throws(TypeError, () => withCalendar.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withCalendar.apply(null, args), "null");
+assert.throws(TypeError, () => withCalendar.apply(true, args), "true");
+assert.throws(TypeError, () => withCalendar.apply("", args), "empty string");
+assert.throws(TypeError, () => withCalendar.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withCalendar.apply(1, args), "1");
+assert.throws(TypeError, () => withCalendar.apply({}, args), "plain object");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => withCalendar.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js
rename to JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-leap-second.js
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-time-separators.js
new file mode 100644
index 0000000..1ebb44c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-time-separators.js
@@ -0,0 +1,27 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.withplaindate
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const timeZone = new Temporal.TimeZone("UTC");
+const instance = new Temporal.ZonedDateTime(0n, timeZone);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.withPlainDate(arg);
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 957_225_600_000_000_000n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..9b56186
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.withplaindate
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC");
+
+assert.throws(Test262Error, () => instance.withPlainDate(arg));
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..547d50f
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.withplaindate
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC");
+instance.withPlainDate(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/branding.js
index 5d9df4c..f4ff7dc 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withPlainDate, "function");
-assert.throws(TypeError, () => withPlainDate.call(undefined), "undefined");
-assert.throws(TypeError, () => withPlainDate.call(null), "null");
-assert.throws(TypeError, () => withPlainDate.call(true), "true");
-assert.throws(TypeError, () => withPlainDate.call(""), "empty string");
-assert.throws(TypeError, () => withPlainDate.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withPlainDate.call(1), "1");
-assert.throws(TypeError, () => withPlainDate.call({}), "plain object");
-assert.throws(TypeError, () => withPlainDate.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => withPlainDate.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.PlainDate(2022, 6, 22)];
+
+assert.throws(TypeError, () => withPlainDate.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withPlainDate.apply(null, args), "null");
+assert.throws(TypeError, () => withPlainDate.apply(true, args), "true");
+assert.throws(TypeError, () => withPlainDate.apply("", args), "empty string");
+assert.throws(TypeError, () => withPlainDate.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withPlainDate.apply(1, args), "1");
+assert.throws(TypeError, () => withPlainDate.apply({}, args), "plain object");
+assert.throws(TypeError, () => withPlainDate.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => withPlainDate.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-separators.js
new file mode 100644
index 0000000..cb37471
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-separators.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime.prototype.withplaintime
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["1976-11-18T12:34:56.987654321", "uppercase T"],
+ ["1976-11-18t12:34:56.987654321", "lowercase T"],
+ ["1976-11-18 12:34:56.987654321", "space between date and time"],
+ ["T12:34:56.987654321", "time-only uppercase T"],
+ ["t12:34:56.987654321", "time-only lowercase T"],
+];
+
+const timeZone = new Temporal.TimeZone("UTC");
+const instance = new Temporal.ZonedDateTime(0n, timeZone);
+
+tests.forEach(([arg, description]) => {
+ const result = instance.withPlainTime(arg);
+
+ assert.sameValue(
+ result.epochNanoseconds,
+ 45_296_987_654_321n,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/branding.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/branding.js
index 15c0b33..feecfe9 100644
--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/branding.js
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/branding.js
@@ -11,12 +11,14 @@
assert.sameValue(typeof withTimeZone, "function");
-assert.throws(TypeError, () => withTimeZone.call(undefined), "undefined");
-assert.throws(TypeError, () => withTimeZone.call(null), "null");
-assert.throws(TypeError, () => withTimeZone.call(true), "true");
-assert.throws(TypeError, () => withTimeZone.call(""), "empty string");
-assert.throws(TypeError, () => withTimeZone.call(Symbol()), "symbol");
-assert.throws(TypeError, () => withTimeZone.call(1), "1");
-assert.throws(TypeError, () => withTimeZone.call({}), "plain object");
-assert.throws(TypeError, () => withTimeZone.call(Temporal.ZonedDateTime), "Temporal.ZonedDateTime");
-assert.throws(TypeError, () => withTimeZone.call(Temporal.ZonedDateTime.prototype), "Temporal.ZonedDateTime.prototype");
+const args = [new Temporal.TimeZone("UTC")];
+
+assert.throws(TypeError, () => withTimeZone.apply(undefined, args), "undefined");
+assert.throws(TypeError, () => withTimeZone.apply(null, args), "null");
+assert.throws(TypeError, () => withTimeZone.apply(true, args), "true");
+assert.throws(TypeError, () => withTimeZone.apply("", args), "empty string");
+assert.throws(TypeError, () => withTimeZone.apply(Symbol(), args), "symbol");
+assert.throws(TypeError, () => withTimeZone.apply(1, args), "1");
+assert.throws(TypeError, () => withTimeZone.apply({}, args), "plain object");
+assert.throws(TypeError, () => withTimeZone.apply(Temporal.ZonedDateTime, args), "Temporal.ZonedDateTime");
+assert.throws(TypeError, () => withTimeZone.apply(Temporal.ZonedDateTime.prototype, args), "Temporal.ZonedDateTime.prototype");
diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/subclass.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/subclass.js
new file mode 100644
index 0000000..f64178c
--- /dev/null
+++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/subclass.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.zoneddatetime
+description: Test for Temporal.ZonedDateTime subclassing.
+features: [Temporal]
+---*/
+
+class CustomZonedDateTime extends Temporal.ZonedDateTime {
+}
+
+const instance = new CustomZonedDateTime(0n, "UTC");
+assert.sameValue(instance.epochNanoseconds, 0n);
+assert.sameValue(Object.getPrototypeOf(instance), CustomZonedDateTime.prototype, "Instance of CustomZonedDateTime");
+assert(instance instanceof CustomZonedDateTime, "Instance of CustomZonedDateTime");
+assert(instance instanceof Temporal.ZonedDateTime, "Instance of Temporal.ZonedDateTime");
diff --git a/JSTests/test262/test/intl402/NumberFormat/test-option-roundingPriority-mixed-options.js b/JSTests/test262/test/intl402/NumberFormat/test-option-roundingPriority-mixed-options.js
new file mode 100644
index 0000000..0114a6a4
--- /dev/null
+++ b/JSTests/test262/test/intl402/NumberFormat/test-option-roundingPriority-mixed-options.js
@@ -0,0 +1,94 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-intl.numberformat.prototype.format
+description: Tests that the digits are determined correctly when specifying at same time «"minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"»
+features: [Intl.NumberFormat-v3]
+includes: [testIntl.js]
+---*/
+
+const locales = [new Intl.NumberFormat().resolvedOptions().locale, 'ar', 'de', 'th', 'ja'];
+
+const numberingSystems = ['arab', 'latn', 'thai', 'hanidec'];
+
+const expectedResults = {
+ 'morePrecision': {
+ 'same-minimums': { '1': '1.0', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.0' },
+ 'same-maximums': { '1': '1', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2' },
+ 'minSd-larger-minFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'minSd-smaller-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'minSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'minSd-larger-maxFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'maxSd-larger-minFd': { '1': '1.0', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.0' },
+ 'maxSd-smaller-minFd': { '1': '1.000', '1.500': '1.500', '1.625': '1.625', '1.750': '1.750', '1.875': '1.875', '2.000': '2.000' },
+ 'maxSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'maxSd-larger-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2' },
+ 'minSd-maxSd-smaller-minFd-maxFd': { '1': '1.000', '1.500': '1.500', '1.625': '1.625', '1.750': '1.750', '1.875': '1.875', '2.000': '2.000' },
+ 'minSd-maxSd-larger-minFd-maxFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'same-minimums-maxFd-larger-maxSd': { '1': '1.0', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.0' },
+ 'same-minimums-maxFd-smaller-maxSd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ },
+ 'lessPrecision': {
+ 'same-minimums': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'same-maximums': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'minSd-larger-minFd': { '1': '1.0', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.0' },
+ 'minSd-smaller-minFd': { '1': '1.000', '1.500': '1.500', '1.625': '1.625', '1.750': '1.750', '1.875': '1.875', '2.000': '2.000' },
+ 'minSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'minSd-larger-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'maxSd-larger-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2' },
+ 'maxSd-smaller-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'maxSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'maxSd-larger-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'minSd-maxSd-smaller-minFd-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'minSd-maxSd-larger-minFd-maxFd': { '1': '1.0', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2.0' },
+ 'same-minimums-maxFd-larger-maxSd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'same-minimums-maxFd-smaller-maxSd': { '1': '1.0', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2.0' },
+ },
+ 'auto': {
+ 'same-minimums': { '1': '1.0', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.0' },
+ 'same-maximums': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'minSd-larger-minFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'minSd-smaller-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'minSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ 'minSd-larger-maxFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'maxSd-larger-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2' },
+ 'maxSd-smaller-minFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'maxSd-smaller-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'maxSd-larger-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.63', '1.750': '1.75', '1.875': '1.88', '2.000': '2' },
+ 'minSd-maxSd-smaller-minFd-maxFd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'minSd-maxSd-larger-minFd-maxFd': { '1': '1.00', '1.500': '1.50', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2.00' },
+ 'same-minimums-maxFd-larger-maxSd': { '1': '1', '1.500': '1.5', '1.625': '1.6', '1.750': '1.8', '1.875': '1.9', '2.000': '2' },
+ 'same-minimums-maxFd-smaller-maxSd': { '1': '1', '1.500': '1.5', '1.625': '1.625', '1.750': '1.75', '1.875': '1.875', '2.000': '2' },
+ },
+};
+
+const optionsMatrix = {
+ 'same-minimums': { minimumSignificantDigits: 2, minimumFractionDigits: 2 },
+ 'same-maximums': { maximumSignificantDigits: 2, maximumFractionDigits: 2 },
+ 'minSd-larger-minFd': { minimumSignificantDigits: 3, minimumFractionDigits: 1 },
+ 'minSd-smaller-minFd': { minimumSignificantDigits: 1, minimumFractionDigits: 3 },
+ 'minSd-smaller-maxFd': { minimumSignificantDigits: 1, maximumFractionDigits: 3 },
+ 'minSd-larger-maxFd': { minimumSignificantDigits: 3, maximumFractionDigits: 1 },
+ 'maxSd-larger-minFd': { maximumSignificantDigits: 3, minimumFractionDigits: 1 },
+ 'maxSd-smaller-minFd': { maximumSignificantDigits: 2, minimumFractionDigits: 3 },
+ 'maxSd-smaller-maxFd': { maximumSignificantDigits: 2, maximumFractionDigits: 3 },
+ 'maxSd-larger-maxFd': { maximumSignificantDigits: 3, maximumFractionDigits: 1 },
+ 'minSd-maxSd-smaller-minFd-maxFd': { minimumSignificantDigits: 1, maximumSignificantDigits: 2, minimumFractionDigits: 3, maximumFractionDigits: 4 },
+ 'minSd-maxSd-larger-minFd-maxFd': { minimumSignificantDigits: 3, maximumSignificantDigits: 4, minimumFractionDigits: 1, maximumFractionDigits: 2 },
+ 'same-minimums-maxFd-larger-maxSd': { minimumSignificantDigits: 1, maximumSignificantDigits: 2, minimumFractionDigits: 1, maximumFractionDigits: 4 },
+ 'same-minimums-maxFd-smaller-maxSd': { minimumSignificantDigits: 1, maximumSignificantDigits: 4, minimumFractionDigits: 1, maximumFractionDigits: 2 },
+};
+
+function testPrecision(mode) {
+ Object.keys(optionsMatrix).forEach((key) => {
+ testNumberFormat(
+ locales,
+ numberingSystems,
+ { ...optionsMatrix[key], roundingPriority: mode, userGrouping: false },
+ expectedResults[mode][key]
+ );
+ });
+}
+
+['morePrecision', 'lessPrecision', 'auto'].forEach(testPrecision);
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
new file mode 100644
index 0000000..9e48327
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/dateFromFields/order-of-operations.js
@@ -0,0 +1,76 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.datefromfields
+description: Properties on objects passed to dateFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.day",
+ "get fields.day.valueOf",
+ "call fields.day.valueOf",
+ "get fields.era",
+ "get fields.era.toString",
+ "call fields.era.toString",
+ "get fields.eraYear",
+ "get fields.eraYear.valueOf",
+ "call fields.eraYear.valueOf",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("gregory");
+
+const fields = {
+ era: "ce",
+ eraYear: 1.7,
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+ day: 1.7,
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.dateFromFields(arg1, arg2);
+TemporalHelpers.assertPlainDate(result, 1, 1, "M01", 1, "date result", "ce", 1);
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js
rename to JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-leap-second.js
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-time-separators.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-time-separators.js
new file mode 100644
index 0000000..0a5aa63
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.era
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.era(arg);
+
+ assert.sameValue(
+ result,
+ undefined,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-convert.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..1073533
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.era
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.era(arg));
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-slots.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..ae4ba42
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.era
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.era(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-leap-second.js
similarity index 100%
rename from JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js
rename to JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-leap-second.js
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-time-separators.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-time-separators.js
new file mode 100644
index 0000000..3ff00ff
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-time-separators.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.erayear
+description: Time separator in string argument can vary
+features: [Temporal]
+---*/
+
+const tests = [
+ ["2000-05-02T15:23", "uppercase T"],
+ ["2000-05-02t15:23", "lowercase T"],
+ ["2000-05-02 15:23", "space between date and time"],
+];
+
+const instance = new Temporal.Calendar("iso8601");
+
+tests.forEach(([arg, description]) => {
+ const result = instance.eraYear(arg);
+
+ assert.sameValue(
+ result,
+ undefined,
+ `variant time separators (${description})`
+ );
+});
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-convert.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-convert.js
new file mode 100644
index 0000000..5fad6b7
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-convert.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.erayear
+description: An exception from TimeZone#getOffsetNanosecondsFor() is propagated.
+features: [Temporal]
+---*/
+
+class TZ extends Temporal.TimeZone {
+ constructor() { super("UTC") }
+ getOffsetNanosecondsFor() { throw new Test262Error() }
+}
+
+const tz = new TZ();
+const arg = new Temporal.ZonedDateTime(0n, tz);
+const instance = new Temporal.Calendar("iso8601");
+
+assert.throws(Test262Error, () => instance.eraYear(arg));
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-slots.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-slots.js
new file mode 100644
index 0000000..341cdf1
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-zoneddatetime-slots.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.erayear
+description: Getters are not called when converting a ZonedDateTime to a PlainDate.
+includes: [compareArray.js]
+features: [Temporal]
+---*/
+
+const actual = [];
+const prototypeDescrs = Object.getOwnPropertyDescriptors(Temporal.ZonedDateTime.prototype);
+const getters = ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond", "calendar"];
+
+for (const property of getters) {
+ Object.defineProperty(Temporal.ZonedDateTime.prototype, property, {
+ get() {
+ actual.push(`get ${property}`);
+ const value = prototypeDescrs[property].get.call(this);
+ return {
+ toString() {
+ actual.push(`toString ${property}`);
+ return value.toString();
+ },
+ valueOf() {
+ actual.push(`valueOf ${property}`);
+ return value;
+ },
+ };
+ },
+ });
+}
+
+const arg = new Temporal.ZonedDateTime(0n, "UTC");
+const instance = new Temporal.Calendar("iso8601");
+instance.eraYear(arg);
+assert.compareArray(actual, []);
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
new file mode 100644
index 0000000..ec94fdc
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/monthDayFromFields/order-of-operations.js
@@ -0,0 +1,76 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.monthdayfromfields
+description: Properties on objects passed to monthDayFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.day",
+ "get fields.day.valueOf",
+ "call fields.day.valueOf",
+ "get fields.era",
+ "get fields.era.toString",
+ "call fields.era.toString",
+ "get fields.eraYear",
+ "get fields.eraYear.valueOf",
+ "call fields.eraYear.valueOf",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("gregory");
+
+const fields = {
+ era: "ce",
+ eraYear: 1.7,
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+ day: 1.7,
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.monthDayFromFields(arg1, arg2);
+TemporalHelpers.assertPlainMonthDay(result, "M01", 1, "monthDay result");
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
new file mode 100644
index 0000000..882cfd0
--- /dev/null
+++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations.js
@@ -0,0 +1,72 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.calendar.prototype.yearmonthfromfields
+description: Properties on objects passed to yearMonthFromFields() are accessed in the correct order
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+ "get options.overflow",
+ "get options.overflow.toString",
+ "call options.overflow.toString",
+ "get fields.era",
+ "get fields.era.toString",
+ "call fields.era.toString",
+ "get fields.eraYear",
+ "get fields.eraYear.valueOf",
+ "call fields.eraYear.valueOf",
+ "get fields.month",
+ "get fields.month.valueOf",
+ "call fields.month.valueOf",
+ "get fields.monthCode",
+ "get fields.monthCode.toString",
+ "call fields.monthCode.toString",
+ "get fields.year",
+ "get fields.year.valueOf",
+ "call fields.year.valueOf",
+];
+const actual = [];
+
+const instance = new Temporal.Calendar("gregory");
+
+const fields = {
+ era: "ce",
+ eraYear: 1.7,
+ year: 1.7,
+ month: 1.7,
+ monthCode: "M01",
+};
+const arg1 = new Proxy(fields, {
+ get(target, key) {
+ actual.push(`get fields.${key}`);
+ if (key === "calendar") return instance;
+ const result = target[key];
+ return TemporalHelpers.toPrimitiveObserver(actual, result, `fields.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has fields.${key}`);
+ return key in target;
+ },
+});
+
+const options = {
+ overflow: "reject",
+};
+const arg2 = new Proxy(options, {
+ get(target, key) {
+ actual.push(`get options.${key}`);
+ return TemporalHelpers.toPrimitiveObserver(actual, target[key], `options.${key}`);
+ },
+ has(target, key) {
+ actual.push(`has options.${key}`);
+ return key in target;
+ },
+});
+
+const result = instance.yearMonthFromFields(arg1, arg2);
+TemporalHelpers.assertPlainYearMonth(result, 1, 1, "M01", "yearMonth result", "ce", 1);
+assert.sameValue(result.calendar, instance, "calendar result");
+assert.compareArray(actual, expected, "order of operations");
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-break-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-break-escaped.js
index 9ea829f..9ba6cea 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-break-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-break-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/break-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: break is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: break is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-case-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-case-escaped.js
index ae873a5..e1b4186 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-case-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-case-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/case-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: case is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: case is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-catch-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-catch-escaped.js
index 6a73898..4a6ee32 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-catch-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-catch-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/catch-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: catch is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: catch is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-class-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-class-escaped.js
index 1165f0d..5ba47be 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-class-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-class-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/class-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: class is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: class is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-const-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-const-escaped.js
index 38b813b..6c0ed61 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-const-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-const-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/const-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: const is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: const is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-continue-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-continue-escaped.js
index 4107841..23d9d5d 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-continue-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-continue-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/continue-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: continue is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: continue is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-debugger-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-debugger-escaped.js
index dd992b8..4fbae26 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-debugger-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-debugger-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/debugger-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: debugger is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: debugger is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped-ext.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped-ext.js
index d5a2bd9..f44f6a9 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped-ext.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped-ext.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default-escaped-ext.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: default is a valid identifier name, using extended escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: default is a valid identifier name, using extended escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped.js
index 817ca8d..2000c95 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: default is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: default is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default.js
index b01dd18..baf609e 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-default.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: default is a valid identifier name (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: default is a valid identifier name (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-delete-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-delete-escaped.js
index ddc0944..461c0c9 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-delete-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-delete-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/delete-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: delete is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: delete is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-do-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-do-escaped.js
index 235a436..8d318c7 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-do-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-do-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/do-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: do is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: do is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-else-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-else-escaped.js
index cb80673..a52c241 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-else-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-else-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/else-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: else is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: else is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-enum-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-enum-escaped.js
index a96bc2f..1c7b878 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-enum-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-enum-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/enum-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: enum is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: enum is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-export-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-export-escaped.js
index 3871fd9..a4e41bd 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-export-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-export-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/export-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: export is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: export is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped-ext.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped-ext.js
index 71ce774..927399b 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped-ext.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped-ext.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends-escaped-ext.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: extends is a valid identifier name, using extended escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: extends is a valid identifier name, using extended escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped.js
index f3a98dd..3c28825 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: extends is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: extends is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends.js
index ef48018..03eeb53e 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-extends.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: extends is a valid identifier name (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: extends is a valid identifier name (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-finally-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-finally-escaped.js
index 1b0410e..0003405 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-finally-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-finally-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/finally-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: finally is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: finally is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-for-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-for-escaped.js
index be5c9b3..8ee85c2 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-for-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-for-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/for-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: for is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: for is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-function-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-function-escaped.js
index 70416d6..8d8a4d7 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-function-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-function-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/function-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: function is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: function is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-if-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-if-escaped.js
index 82d9d29..2002a0b 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-if-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-if-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/if-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: if is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: if is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-implements-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-implements-escaped.js
index 807c0d3..121ae24 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-implements-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-implements-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/implements-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: implements is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: implements is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-import-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-import-escaped.js
index 7dc378c..65a830d 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-import-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-import-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/import-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: import is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: import is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-in-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-in-escaped.js
index 882edec..1315fc8 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-in-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-in-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/in-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: in is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: in is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-instanceof-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-instanceof-escaped.js
index be984ee..5ad7e9d 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-instanceof-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-instanceof-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/instanceof-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: instanceof is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: instanceof is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-interface-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-interface-escaped.js
index 249a733..4cfb878 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-interface-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-interface-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/interface-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: interface is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: interface is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-let-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-let-escaped.js
index 4f5f407..c3394f4 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-let-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-let-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/let-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: let is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: let is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-new-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-new-escaped.js
index 71bf9f1..7405404 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-new-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-new-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/new-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: new is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: new is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-package-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-package-escaped.js
index 2a03def..2572e28 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-package-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-package-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/package-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: package is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: package is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-private-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-private-escaped.js
index b035db3..77f4a2e 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-private-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-private-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/private-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: private is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: private is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-protected-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-protected-escaped.js
index 38506fd..6e88462 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-protected-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-protected-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/protected-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: protected is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: protected is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-public-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-public-escaped.js
index 1c1ea30..662eba7 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-public-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-public-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/public-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: public is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: public is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-return-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-return-escaped.js
index d0ae695..ede5f36 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-return-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-return-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/return-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: return is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: return is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-static-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-static-escaped.js
index bc9518c..80f4cf3 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-static-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-static-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/static-escaped.case
// - src/identifier-names/future-reserved-words/arrow-fn-assignment-identifier.template
/*---
-description: static is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: static is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-super-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-super-escaped.js
index 5e195d8..dd77fa19 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-super-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-super-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/super-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: super is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: super is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-switch-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-switch-escaped.js
index 0126e67..6455609 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-switch-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-switch-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/switch-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: switch is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: switch is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-this-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-this-escaped.js
index 1a691d1..26953fe 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-this-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-this-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/this-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: this is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: this is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-throw-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-throw-escaped.js
index b7d4953..7564c5a 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-throw-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-throw-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/throw-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: throw is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: throw is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-try-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-try-escaped.js
index 18ca8db..af1a6d8 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-try-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-try-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/try-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: try is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: try is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-typeof-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-typeof-escaped.js
index 242acdb..1e0abf6 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-typeof-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-typeof-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/typeof-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: typeof is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: typeof is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-var-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-var-escaped.js
index 2b60400..a467dd3 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-var-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-var-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/var-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: var is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: var is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-void-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-void-escaped.js
index f40399a..017ea5e 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-void-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-void-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/void-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: void is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: void is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-while-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-while-escaped.js
index 6050b8c..19e9b32 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-while-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-while-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/while-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: while is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: while is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-with-escaped.js b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-with-escaped.js
index 61be431..cf4dde5 100644
--- a/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-with-escaped.js
+++ b/JSTests/test262/test/language/expressions/arrow-function/dstr/syntax-error-ident-ref-with-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/with-escaped.case
// - src/identifier-names/default/arrow-fn-assignment-identifier.template
/*---
-description: with is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
+description: with is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern (Arrow Function) cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [arrow-function, destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-break-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-break-escaped.js
index 87a2d05..0d902c6 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-break-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-break-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/break-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: break is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: break is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-case-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-case-escaped.js
index d4c4615..77d30ba 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-case-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-case-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/case-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: case is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: case is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-catch-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-catch-escaped.js
index ce801e6..0ed0319 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-catch-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-catch-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/catch-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: catch is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: catch is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-class-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-class-escaped.js
index 26ef826..a3f7644 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-class-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-class-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/class-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: class is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: class is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-const-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-const-escaped.js
index 722d37a..123dd99 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-const-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-const-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/const-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: const is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: const is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-continue-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-continue-escaped.js
index dbc817a..0e6a4c3 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-continue-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-continue-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/continue-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: continue is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: continue is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-debugger-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-debugger-escaped.js
index 85461e8..6c84b67 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-debugger-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-debugger-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/debugger-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: debugger is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: debugger is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped-ext.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped-ext.js
index 20f3675..5f9008c 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped-ext.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped-ext.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default-escaped-ext.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: default is a valid identifier name, using extended escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: default is a valid identifier name, using extended escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped.js
index cd965f1..e60088b 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: default is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: default is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default.js
index 77ffa8c..e2b08d5 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-default.js
@@ -2,7 +2,7 @@
// - src/identifier-names/default.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: default is a valid identifier name (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: default is a valid identifier name (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-delete-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-delete-escaped.js
index 0650962..6304679 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-delete-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-delete-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/delete-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: delete is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: delete is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-do-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-do-escaped.js
index 88b5593..8533d10 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-do-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-do-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/do-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: do is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: do is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-else-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-else-escaped.js
index 1a496d7..09f7b32 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-else-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-else-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/else-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: else is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: else is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-enum-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-enum-escaped.js
index ed0ac86..b9ace02 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-enum-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-enum-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/enum-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: enum is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: enum is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-export-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-export-escaped.js
index af3d4d8..da5290b 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-export-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-export-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/export-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: export is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: export is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped-ext.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped-ext.js
index 8323096..83cb179 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped-ext.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped-ext.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends-escaped-ext.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: extends is a valid identifier name, using extended escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: extends is a valid identifier name, using extended escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped.js
index cd4a500..6389193 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: extends is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: extends is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends.js
index 80ca908..7b473db 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-extends.js
@@ -2,7 +2,7 @@
// - src/identifier-names/extends.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: extends is a valid identifier name (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: extends is a valid identifier name (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-finally-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-finally-escaped.js
index b1aa4d9..42ce33a 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-finally-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-finally-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/finally-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: finally is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: finally is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-for-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-for-escaped.js
index eb76069..be937bb 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-for-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-for-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/for-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: for is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: for is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-function-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-function-escaped.js
index aafed8d..cdaad0a 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-function-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-function-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/function-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: function is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: function is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-if-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-if-escaped.js
index 275555c..e0a4071 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-if-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-if-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/if-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: if is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: if is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-implements-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-implements-escaped.js
index b70bb6a..4c6cc79 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-implements-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-implements-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/implements-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: implements is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: implements is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-import-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-import-escaped.js
index 16751f1..e1f9878 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-import-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-import-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/import-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: import is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: import is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-in-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-in-escaped.js
index 4ab6432..925ed25 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-in-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-in-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/in-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: in is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: in is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-instanceof-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-instanceof-escaped.js
index 3c92bdf..5d3fb33 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-instanceof-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-instanceof-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/instanceof-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: instanceof is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: instanceof is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-interface-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-interface-escaped.js
index c330f9e..f17fd5a 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-interface-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-interface-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/interface-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: interface is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: interface is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-let-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-let-escaped.js
index 7515edf..1e841d9 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-let-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-let-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/let-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: let is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: let is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-new-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-new-escaped.js
index 0ad44ef..4b3ea2c 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-new-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-new-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/new-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: new is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: new is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-package-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-package-escaped.js
index 82792e8..7a4abb4 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-package-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-package-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/package-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: package is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: package is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-private-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-private-escaped.js
index 737d673..66d73b85 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-private-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-private-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/private-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: private is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: private is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-protected-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-protected-escaped.js
index b30b455..05e8b68 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-protected-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-protected-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/protected-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: protected is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: protected is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-public-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-public-escaped.js
index a7433b0..f3f2247 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-public-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-public-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/public-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: public is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: public is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-return-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-return-escaped.js
index e6d895d..3b66ad2 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-return-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-return-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/return-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: return is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: return is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-static-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-static-escaped.js
index dabc19a..34ef93c 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-static-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-static-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/static-escaped.case
// - src/identifier-names/future-reserved-words/obj-assignment-identifier.template
/*---
-description: static is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: static is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated, onlyStrict]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-super-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-super-escaped.js
index dd8cf52..833f26b 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-super-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-super-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/super-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: super is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: super is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-switch-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-switch-escaped.js
index 699aaa4..3efc456 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-switch-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-switch-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/switch-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: switch is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: switch is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-this-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-this-escaped.js
index fad7bd6..affcc45 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-this-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-this-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/this-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: this is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: this is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-throw-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-throw-escaped.js
index 3a5875a..23406c4 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-throw-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-throw-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/throw-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: throw is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: throw is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-try-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-try-escaped.js
index 993ca9c..347b437 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-try-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-try-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/try-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: try is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: try is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-typeof-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-typeof-escaped.js
index b6c6647..d9513c0 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-typeof-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-typeof-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/typeof-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: typeof is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: typeof is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-var-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-var-escaped.js
index 81a24e0..2b37ef6 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-var-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-var-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/var-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: var is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: var is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-void-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-void-escaped.js
index c7ca53e..c5e4629 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-void-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-void-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/void-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: void is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: void is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-while-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-while-escaped.js
index d272ef6..061c747 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-while-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-while-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/while-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: while is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: while is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-with-escaped.js b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-with-escaped.js
index 1fc4b86..0fcac64 100644
--- a/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-with-escaped.js
+++ b/JSTests/test262/test/language/expressions/assignment/dstr/syntax-error-ident-ref-with-escaped.js
@@ -2,7 +2,7 @@
// - src/identifier-names/with-escaped.case
// - src/identifier-names/default/obj-assignment-identifier.template
/*---
-description: with is a valid identifier name, using escape (IdentiferReference in ObjectAssignmentPattern cannot be a ReservedWord)
+description: with is a valid identifier name, using escape (IdentifierReference in ObjectAssignmentPattern cannot be a ReservedWord)
esid: prod-AssignmentPattern
features: [destructuring-assignment]
flags: [generated]
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
new file mode 100644
index 0000000..a20d812
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
@@ -0,0 +1,53 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-private-identifier.case
+// - src/decorator/syntax/class-valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class expression in class body.)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorMemberExpression[Yield, Await] :
+ PrivateIdentifier
+
+ PrivateIdentifier ::
+ # IdentifierName
+
+---*/
+
+
+var C = class {
+ static #$() {}
+ static #_() {}
+ static #\u{6F}() {}
+ static #\u2118() {}
+ static #ZW_\u200C_NJ() {}
+ static #ZW_\u200D_J() {}
+ static #yield() {}
+ static #await() {}
+
+ static {
+ var C = @#$
+ @#_
+ @#\u{6F}
+ @#\u2118
+ @#ZW_\u200C_NJ
+ @#ZW_\u200D_J
+ @#yield
+ @#await class {}
+ }
+};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..4ed6f5b
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
@@ -0,0 +1,44 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-call-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorCallExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorCallExpression[Yield, Await] :
+ DecoratorMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function decorator() {
+ return () => {};
+}
+var yield = decorator;
+
+
+
+var C = @yield() class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
new file mode 100644
index 0000000..c754ade
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
@@ -0,0 +1,56 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-call-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorCallExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorCallExpression[Yield, Await] :
+ DecoratorMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+ IdentifierReference[Yield, Await] :
+ Identifier
+ [~Yield] yield
+ [~Await] await
+
+---*/
+function decorator() {
+ return () => {};
+}
+var _ = decorator;
+var \u{6F} = decorator;
+var \u2118 = decorator;
+var ZW_\u200C_NJ = decorator;
+var ZW_\u200D_J = decorator;
+var await = decorator;
+
+
+
+var C = @$()
+@_()
+@\u{6F}()
+@\u2118()
+@ZW_\u200C_NJ()
+@ZW_\u200D_J()
+@await() class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
new file mode 100644
index 0000000..ebbabb6
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
@@ -0,0 +1,50 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-decorator-member-expr.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+---*/
+let ns = {
+ $() {}
+ _() {}
+ \u{6F}() {}
+ \u2118() {}
+ ZW_\u200C_NJ() {}
+ ZW_\u200D_J() {}
+ yield() {}
+ await() {}
+}
+
+
+
+var C = @ns.$
+@ns._
+@ns.\u{6F}
+@ns.\u2118
+@ns.ZW_\u200C_NJ
+@ns.ZW_\u200D_J
+@ns.yield
+@ns.await class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..20e3c9e
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
@@ -0,0 +1,33 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function yield() {}
+
+
+
+var C = @yield class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
new file mode 100644
index 0000000..38c9560
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
@@ -0,0 +1,46 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ IdentifierReference[Yield, Await] :
+ Identifier
+ [~Yield] yield
+ [~Await] await
+
+---*/
+function $() {}
+function _() {}
+function \u{6F}() {}
+function \u2118() {}
+function ZW_\u200C_NJ() {}
+function ZW_\u200D_J() {}
+function await() {}
+
+
+
+var C = @$
+@_
+@\u{6F}
+@\u2118
+@ZW_\u200C_NJ
+@ZW_\u200D_J
+@await class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..e05eb39
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
@@ -0,0 +1,51 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-parenthesized-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorParenthesizedExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorParenthesizedExpression[Yield, Await] :
+ ( Expression[+In, ?Yield, ?Await] )
+
+ PrimaryExpression[Yield, Await] :
+ this
+ IdentifierReference[?Yield, ?Await]
+ Literal
+ ArrayLiteral[?Yield, ?Await]
+ ObjectLiteral[?Yield, ?Await]
+ FunctionExpression
+ ClassExpression[?Yield, ?Await]
+ GeneratorExpression
+ AsyncFunctionExpression
+ AsyncGeneratorExpression
+ RegularExpressionLiteral
+ TemplateLiteral[?Yield, ?Await, ~Tagged]
+ CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function yield() {}
+
+
+
+var C = @(yield) class {};
diff --git a/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
new file mode 100644
index 0000000..3836f01
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
@@ -0,0 +1,59 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-parenthesized-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-expr-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorParenthesizedExpression (Valid syntax for decorator on class expression)
+esid: prod-ClassExpression
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassExpression[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorParenthesizedExpression[Yield, Await] :
+ ( Expression[+In, ?Yield, ?Await] )
+
+ PrimaryExpression[Yield, Await] :
+ this
+ IdentifierReference[?Yield, ?Await]
+ Literal
+ ArrayLiteral[?Yield, ?Await]
+ ObjectLiteral[?Yield, ?Await]
+ FunctionExpression
+ ClassExpression[?Yield, ?Await]
+ GeneratorExpression
+ AsyncFunctionExpression
+ AsyncGeneratorExpression
+ RegularExpressionLiteral
+ TemplateLiteral[?Yield, ?Await, ~Tagged]
+ CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+---*/
+function $() {}
+function _() {}
+function \u{6F}() {}
+function \u2118() {}
+function ZW_\u200C_NJ() {}
+function ZW_\u200D_J() {}
+function await() {}
+
+
+
+var C = @($)
+@(_)
+@(\u{6F})
+@(\u2118)
+@(ZW_\u200C_NJ)
+@(ZW_\u200D_J)
+@(await) class {};
diff --git a/JSTests/test262/test/language/expressions/class/elements/field-definition-accessor-no-line-terminator.js b/JSTests/test262/test/language/expressions/class/elements/field-definition-accessor-no-line-terminator.js
new file mode 100644
index 0000000..02a0068
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/elements/field-definition-accessor-no-line-terminator.js
@@ -0,0 +1,31 @@
+// This file was procedurally generated from the following sources:
+// - src/class-elements/field-definition-accessor-no-line-terminator.case
+// - src/class-elements/default/cls-expr.template
+/*---
+description: Valid accessor FieldDefinition, ClassElementName, PropertyName Syntax (field definitions in a class expression)
+esid: prod-FieldDefinition
+features: [decorators, class]
+flags: [generated]
+info: |
+ FieldDefinition[Yield, Await] :
+ accessor [no LineTerminator here] ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+
+---*/
+
+
+var C = class {
+ accessor
+ $;
+ static accessor
+ $;
+
+}
+
+let c = new C();
+
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, 'accessor'), false);
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, '$'), false);
+assert.sameValue(Object.hasOwnProperty.call(C, 'accessor'), true);
+assert.sameValue(Object.hasOwnProperty.call(C, '$'), true);
+assert.sameValue(Object.hasOwnProperty.call(c, 'accessor'), true);
+assert.sameValue(Object.hasOwnProperty.call(c, '$'), true);
diff --git a/JSTests/test262/test/language/expressions/class/elements/syntax/valid/grammar-field-accessor.js b/JSTests/test262/test/language/expressions/class/elements/syntax/valid/grammar-field-accessor.js
new file mode 100644
index 0000000..d67fd32
--- /dev/null
+++ b/JSTests/test262/test/language/expressions/class/elements/syntax/valid/grammar-field-accessor.js
@@ -0,0 +1,24 @@
+// This file was procedurally generated from the following sources:
+// - src/class-elements/grammar-field-accessor.case
+// - src/class-elements/syntax/valid/cls-expr-elements-valid-syntax.template
+/*---
+description: Valid accessor FieldDefinition, ClassElementName, PropertyName Syntax (class expression)
+esid: prod-ClassElement
+features: [decorators, class]
+flags: [generated]
+info: |
+ FieldDefinition[Yield, Await] :
+ ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+ accessor [no LineTerminator here] ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+
+---*/
+
+
+var C = class {
+ accessor $;
+ accessor _;
+ accessor \u{6F};
+ accessor \u2118;
+ accessor ZW_\u200C_NJ;
+ accessor ZW_\u200D_J;
+};
diff --git a/JSTests/test262/test/language/module-code/early-dup-lex.js b/JSTests/test262/test/language/module-code/early-dup-lex.js
index 6664ddb..386371a 100644
--- a/JSTests/test262/test/language/module-code/early-dup-lex.js
+++ b/JSTests/test262/test/language/module-code/early-dup-lex.js
@@ -15,4 +15,4 @@
$DONOTEVALUATE();
let x;
-const x;
+const x = 0;
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js b/JSTests/test262/test/language/statements/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
new file mode 100644
index 0000000..24af7d9
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js
@@ -0,0 +1,54 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-private-identifier.case
+// - src/decorator/syntax/class-valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class declaration in class body.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorMemberExpression[Yield, Await] :
+ PrivateIdentifier
+
+ PrivateIdentifier ::
+ # IdentifierName
+
+---*/
+
+
+class C {
+ static #$() {}
+ static #_() {}
+ static #\u{6F}() {}
+ static #\u2118() {}
+ static #ZW_\u200C_NJ() {}
+ static #ZW_\u200D_J() {}
+ static #yield() {}
+ static #await() {}
+
+ static {
+ @#$
+ @#_
+ @#\u{6F}
+ @#\u2118
+ @#ZW_\u200C_NJ
+ @#ZW_\u200D_J
+ @#yield
+ @#await class C {}
+ }
+}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..1d16c68
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference-yield.js
@@ -0,0 +1,45 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-call-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorCallExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorCallExpression[Yield, Await] :
+ DecoratorMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function decorator() {
+ return () => {};
+}
+var yield = decorator;
+
+
+
+@yield() class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
new file mode 100644
index 0000000..2744964
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-call-expr-identifier-reference.js
@@ -0,0 +1,57 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-call-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorCallExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorCallExpression[Yield, Await] :
+ DecoratorMemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+ IdentifierReference[Yield, Await] :
+ Identifier
+ [~Yield] yield
+ [~Await] await
+
+---*/
+function decorator() {
+ return () => {};
+}
+var _ = decorator;
+var \u{6F} = decorator;
+var \u2118 = decorator;
+var ZW_\u200C_NJ = decorator;
+var ZW_\u200D_J = decorator;
+var await = decorator;
+
+
+
+@$()
+@_()
+@\u{6F}()
+@\u2118()
+@ZW_\u200C_NJ()
+@ZW_\u200D_J()
+@await() class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
new file mode 100644
index 0000000..f13312c
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-decorator-member-expr.js
@@ -0,0 +1,51 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-decorator-member-expr.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorMemberExpression[Yield, Await] :
+ IdentifierReference[?Yield, ?Await]
+ PrivateIdentifier
+ DecoratorMemberExpression[?Yield, ?Await] . IdentifierName
+
+---*/
+let ns = {
+ $() {}
+ _() {}
+ \u{6F}() {}
+ \u2118() {}
+ ZW_\u200C_NJ() {}
+ ZW_\u200D_J() {}
+ yield() {}
+ await() {}
+}
+
+
+
+@ns.$
+@ns._
+@ns.\u{6F}
+@ns.\u2118
+@ns.ZW_\u200C_NJ
+@ns.ZW_\u200D_J
+@ns.yield
+@ns.await class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..388a12e
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference-yield.js
@@ -0,0 +1,34 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function yield() {}
+
+
+
+@yield class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
new file mode 100644
index 0000000..a17dc8a
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js
@@ -0,0 +1,47 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-member-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorMemberExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ IdentifierReference[Yield, Await] :
+ Identifier
+ [~Yield] yield
+ [~Await] await
+
+---*/
+function $() {}
+function _() {}
+function \u{6F}() {}
+function \u2118() {}
+function ZW_\u200C_NJ() {}
+function ZW_\u200D_J() {}
+function await() {}
+
+
+
+@$
+@_
+@\u{6F}
+@\u2118
+@ZW_\u200C_NJ
+@ZW_\u200D_J
+@await class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
new file mode 100644
index 0000000..157739f
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference-yield.js
@@ -0,0 +1,52 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-parenthesized-expr-identifier-reference-yield.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorParenthesizedExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated, noStrict]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorParenthesizedExpression[Yield, Await] :
+ ( Expression[+In, ?Yield, ?Await] )
+
+ PrimaryExpression[Yield, Await] :
+ this
+ IdentifierReference[?Yield, ?Await]
+ Literal
+ ArrayLiteral[?Yield, ?Await]
+ ObjectLiteral[?Yield, ?Await]
+ FunctionExpression
+ ClassExpression[?Yield, ?Await]
+ GeneratorExpression
+ AsyncFunctionExpression
+ AsyncGeneratorExpression
+ RegularExpressionLiteral
+ TemplateLiteral[?Yield, ?Await, ~Tagged]
+ CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+ IdentifierReference[Yield, Await] :
+ [~Yield] yield
+ ...
+
+---*/
+function yield() {}
+
+
+
+@(yield) class C {}
diff --git a/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
new file mode 100644
index 0000000..4f8d89a
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js
@@ -0,0 +1,60 @@
+// This file was procedurally generated from the following sources:
+// - src/decorator/decorator-parenthesized-expr-identifier-reference.case
+// - src/decorator/syntax/valid/cls-decl-decorators-valid-syntax.template
+/*---
+description: Decorator @ DecoratorParenthesizedExpression (Valid syntax for decorator on class.)
+esid: prod-ClassDeclaration
+features: [class, decorators]
+flags: [generated]
+info: |
+ ClassDeclaration[Yield, Await, Default] :
+ DecoratorList[?Yield, ?Await]opt class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]
+ [+Default] DecoratorList[?Yield, ?Await]opt class ClassTail[?Yield, ?Await]
+
+ DecoratorList[Yield, Await] :
+ DecoratorList[?Yield, ?Await]opt Decorator[?Yield, ?Await]
+
+ Decorator[Yield, Await] :
+ @ DecoratorMemberExpression[?Yield, ?Await]
+ @ DecoratorParenthesizedExpression[?Yield, ?Await]
+ @ DecoratorCallExpression[?Yield, ?Await]
+
+ ...
+
+
+ DecoratorParenthesizedExpression[Yield, Await] :
+ ( Expression[+In, ?Yield, ?Await] )
+
+ PrimaryExpression[Yield, Await] :
+ this
+ IdentifierReference[?Yield, ?Await]
+ Literal
+ ArrayLiteral[?Yield, ?Await]
+ ObjectLiteral[?Yield, ?Await]
+ FunctionExpression
+ ClassExpression[?Yield, ?Await]
+ GeneratorExpression
+ AsyncFunctionExpression
+ AsyncGeneratorExpression
+ RegularExpressionLiteral
+ TemplateLiteral[?Yield, ?Await, ~Tagged]
+ CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
+
+---*/
+function $() {}
+function _() {}
+function \u{6F}() {}
+function \u2118() {}
+function ZW_\u200C_NJ() {}
+function ZW_\u200D_J() {}
+function await() {}
+
+
+
+@($)
+@(_)
+@(\u{6F})
+@(\u2118)
+@(ZW_\u200C_NJ)
+@(ZW_\u200D_J)
+@(await) class C {}
diff --git a/JSTests/test262/test/language/statements/class/elements/field-definition-accessor-no-line-terminator.js b/JSTests/test262/test/language/statements/class/elements/field-definition-accessor-no-line-terminator.js
new file mode 100644
index 0000000..f09f713a4
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/elements/field-definition-accessor-no-line-terminator.js
@@ -0,0 +1,31 @@
+// This file was procedurally generated from the following sources:
+// - src/class-elements/field-definition-accessor-no-line-terminator.case
+// - src/class-elements/default/cls-decl.template
+/*---
+description: Valid accessor FieldDefinition, ClassElementName, PropertyName Syntax (field definitions in a class declaration)
+esid: prod-FieldDefinition
+features: [decorators, class]
+flags: [generated]
+info: |
+ FieldDefinition[Yield, Await] :
+ accessor [no LineTerminator here] ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+
+---*/
+
+
+class C {
+ accessor
+ $;
+ static accessor
+ $;
+
+}
+
+let c = new C();
+
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, 'accessor'), false);
+assert.sameValue(Object.hasOwnProperty.call(C.prototype, '$'), false);
+assert.sameValue(Object.hasOwnProperty.call(C, 'accessor'), true);
+assert.sameValue(Object.hasOwnProperty.call(C, '$'), true);
+assert.sameValue(Object.hasOwnProperty.call(c, 'accessor'), true);
+assert.sameValue(Object.hasOwnProperty.call(c, '$'), true);
diff --git a/JSTests/test262/test/language/statements/class/elements/syntax/valid/grammar-field-accessor.js b/JSTests/test262/test/language/statements/class/elements/syntax/valid/grammar-field-accessor.js
new file mode 100644
index 0000000..9091ed8
--- /dev/null
+++ b/JSTests/test262/test/language/statements/class/elements/syntax/valid/grammar-field-accessor.js
@@ -0,0 +1,24 @@
+// This file was procedurally generated from the following sources:
+// - src/class-elements/grammar-field-accessor.case
+// - src/class-elements/syntax/valid/cls-decl-elements-valid-syntax.template
+/*---
+description: Valid accessor FieldDefinition, ClassElementName, PropertyName Syntax (class declaration)
+esid: prod-ClassElement
+features: [decorators, class]
+flags: [generated]
+info: |
+ FieldDefinition[Yield, Await] :
+ ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+ accessor [no LineTerminator here] ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
+
+---*/
+
+
+class C {
+ accessor $;
+ accessor _;
+ accessor \u{6F};
+ accessor \u2118;
+ accessor ZW_\u200C_NJ;
+ accessor ZW_\u200D_J;
+}
diff --git a/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js b/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js
index 9cfbf91..aabc94c 100644
--- a/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js
+++ b/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js
@@ -21,7 +21,7 @@
__accum="";
for (var __key in __obj){
-
+
erasator_T_1000(__obj,"b");
__accum+=(__key+__obj[__key]);
diff --git a/JSTests/test262/test/language/statements/for/head-const-bound-names-in-stmt.js b/JSTests/test262/test/language/statements/for/head-const-bound-names-in-stmt.js
index e1eeb9f..664b362 100644
--- a/JSTests/test262/test/language/statements/for/head-const-bound-names-in-stmt.js
+++ b/JSTests/test262/test/language/statements/for/head-const-bound-names-in-stmt.js
@@ -17,6 +17,6 @@
$DONOTEVALUATE();
-for (const x; false; ) {
+for (const x = 0; false; ) {
var x;
}
diff --git a/JSTests/test262/test/language/statements/for/labelled-fn-stmt-const.js b/JSTests/test262/test/language/statements/for/labelled-fn-stmt-const.js
index 50d0fa1..5199cbb 100644
--- a/JSTests/test262/test/language/statements/for/labelled-fn-stmt-const.js
+++ b/JSTests/test262/test/language/statements/for/labelled-fn-stmt-const.js
@@ -15,4 +15,4 @@
$DONOTEVALUATE();
-for (const x; false; ) label1: label2: function f() {}
+for (const x = 0; false; ) label1: label2: function f() {}
diff --git a/JSTests/test262/test/language/statements/function/S14_A5_T1.js b/JSTests/test262/test/language/statements/function/S14_A5_T1.js
index c7f081a7..f76fd29 100644
--- a/JSTests/test262/test/language/statements/function/S14_A5_T1.js
+++ b/JSTests/test262/test/language/statements/function/S14_A5_T1.js
@@ -3,7 +3,7 @@
/*---
info: |
- The Identifer within a FunctionDeclaration can be written in both letters
+ The Identifier within a FunctionDeclaration can be written in both letters
and unicode
es5id: 14_A5_T1
description: >
diff --git a/JSTests/test262/test/language/statements/function/S14_A5_T2.js b/JSTests/test262/test/language/statements/function/S14_A5_T2.js
index 95ec5bc..9986e36 100644
--- a/JSTests/test262/test/language/statements/function/S14_A5_T2.js
+++ b/JSTests/test262/test/language/statements/function/S14_A5_T2.js
@@ -3,7 +3,7 @@
/*---
info: |
- The Identifer within a FunctionDeclaration can be written in both letters
+ The Identifier within a FunctionDeclaration can be written in both letters
and unicode
es5id: 14_A5_T2
description: >
diff --git a/JSTests/test262/test262-Revision.txt b/JSTests/test262/test262-Revision.txt
index 4a81c50..65099a3 100644
--- a/JSTests/test262/test262-Revision.txt
+++ b/JSTests/test262/test262-Revision.txt
@@ -1,2 +1,2 @@
-test262 remote url: git@github.com:tc39/test262.git
-test262 revision: 0a480293334c34a34f2cae012ddb4dfbd94e5782
+test262 remote url: https://github.com/tc39/test262.git
+test262 revision: 81836ba1249e45ec83d3afb51a18f81173bb1cdd