Implement Temporal.PlainDateTime.{ with * }

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-10-17 14:53:10 +09:00 committed by Patrick Kim
commit cb01142c4c
8 changed files with 165 additions and 97 deletions

View file

@ -692,6 +692,24 @@ static Value builtinTemporalPlainDateTimeMonthCode(ExecutionState& state, Value
return plainDateTime->monthCode(state);
}
static Value builtinTemporalPlainDateTimeWith(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME2(plainDateTime, with);
return plainDateTime->with(state, argv[0], argc > 1 ? argv[1] : Value());
}
static Value builtinTemporalPlainDateTimeWithPlainTime(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME(plainDateTime, WithPlainTime);
return plainDateTime->withPlainTime(state, argc > 0 ? argv[0] : Value());
}
static Value builtinTemporalPlainDateTimeWithCalendar(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME(plainDateTime, Calendar);
return plainDateTime->withCalendar(state, argv[0]);
}
static Value builtinTemporalPlainYearMonthConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
// If NewTarget is undefined, throw a TypeError exception.
@ -1256,6 +1274,9 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toJSON), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toJSON, builtinTemporalPlainDateTimeToJSON, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toLocaleString), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toLocaleString, builtinTemporalPlainDateTimeToLocaleString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->valueOf), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->valueOf, builtinTemporalAnyInstanceValueOf, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->with), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->with, builtinTemporalPlainDateTimeWith, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyWithPlainTime()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyWithPlainTime(), builtinTemporalPlainDateTimeWithPlainTime, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyWithCalendar()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyWithCalendar(), builtinTemporalPlainDateTimeWithCalendar, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
{
AtomicString name(state.context(), "get calendarId");

View file

@ -1015,6 +1015,7 @@ namespace Escargot {
F(Until, "until") \
F(WeekOfYear, "weekOfYear") \
F(WithCalendar, "withCalendar") \
F(WithPlainTime, "withPlainTime") \
F(YearOfWeek, "yearOfWeek") \
F(ZonedDateTimeISO, "zonedDateTimeISO")
#else

View file

@ -816,6 +816,18 @@ TemporalPlainMonthDayObject* Temporal::toTemporalMonthDay(ExecutionState& state,
plainDate, mayID.value());
}
ISO8601::PlainTime Temporal::toTimeRecordOrMidnight(ExecutionState& state, Value item)
{
// If item is undefined, return MidnightTimeRecord().
if (item.isUndefined()) {
return ISO8601::PlainTime();
}
// Let plainTime be ? ToTemporalTime(item).
auto plainTime = toTemporalTime(state, item, Value());
// Return plainTime.[[Time]].
return plainTime->plainTime();
}
Optional<unsigned> Temporal::getTemporalFractionalSecondDigitsOption(ExecutionState& state, Optional<Object*> resolvedOptions)
{
constexpr auto msg = "The value you gave for GetTemporalFractionalSecondDigitsOption is invalid";

View file

@ -259,6 +259,9 @@ public:
// https://tc39.es/proposal-temporal/#sec-temporal-totemporalmonthday
static TemporalPlainMonthDayObject* toTemporalMonthDay(ExecutionState& state, Value item, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal-totimerecordormidnight
static ISO8601::PlainTime toTimeRecordOrMidnight(ExecutionState& state, Value item);
// https://tc39.es/proposal-temporal/#sec-temporal-gettemporalfractionalseconddigitsoption
// NullOption means AUTO
static Optional<unsigned> getTemporalFractionalSecondDigitsOption(ExecutionState& state, Optional<Object*> resolvedOptions);

View file

@ -183,6 +183,86 @@ String* TemporalPlainDateTimeObject::toString(ExecutionState& state, Value optio
return sb.finalize();
}
ISO8601::PlainDate TemporalPlainDateTimeObject::computeISODate(ExecutionState& state)
{
if (!m_calendarID.isISO8601()) {
return Temporal::computeISODate(state, m_icuCalendar);
}
return plainDate();
}
TemporalPlainDateTimeObject* TemporalPlainDateTimeObject::with(ExecutionState& state, Value temporalDateTimeLike, Value options)
{
// If ? IsPartialTemporalObject(temporalDateTimeLike) is false, throw a TypeError exception.
if (!Temporal::isPartialTemporalObject(state, temporalDateTimeLike)) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid temporalDateTimeLike");
}
// Let calendar be plainDateTime.[[Calendar]].
auto calendar = m_calendarID;
// Let fields be ISODateToFields(calendar, plainDateTime.[[ISODateTime]].[[ISODate]], date).
CalendarFieldsRecord fields;
auto isoDate = computeISODate(state);
fields.year = isoDate.year();
fields.month = isoDate.month();
MonthCode mc;
mc.monthNumber = isoDate.month();
fields.monthCode = mc;
// Set fields.[[Hour]] to plainDateTime.[[ISODateTime]].[[Time]].[[Hour]].
// Set fields.[[Minute]] to plainDateTime.[[ISODateTime]].[[Time]].[[Minute]].
// Set fields.[[Second]] to plainDateTime.[[ISODateTime]].[[Time]].[[Second]].
// Set fields.[[Millisecond]] to plainDateTime.[[ISODateTime]].[[Time]].[[Millisecond]].
// Set fields.[[Microsecond]] to plainDateTime.[[ISODateTime]].[[Time]].[[Microsecond]].
// Set fields.[[Nanosecond]] to plainDateTime.[[ISODateTime]].[[Time]].[[Nanosecond]].
fields.day = isoDate.day();
fields.hour = plainTime().hour();
fields.minute = plainTime().minute();
fields.second = plainTime().second();
fields.millisecond = plainTime().millisecond();
fields.microsecond = plainTime().microsecond();
fields.nanosecond = plainTime().nanosecond();
// Let partialDateTime be ? PrepareCalendarFields(calendar, temporalDateTimeLike, « year, month, month-code, day », « hour, minute, second, millisecond, microsecond, nanosecond », partial).
CalendarField ds[4] = { CalendarField::Year, CalendarField::Month, CalendarField::MonthCode, CalendarField::Day };
CalendarField fs[6] = { CalendarField::Hour, CalendarField::Minute, CalendarField::Second,
CalendarField::Millisecond, CalendarField::Microsecond, CalendarField::Nanosecond };
auto partialDateTime = Temporal::prepareCalendarFields(state, calendar, temporalDateTimeLike.asObject(), ds, 4, fs, 6, nullptr, SIZE_MAX);
// Set fields to CalendarMergeFields(calendar, fields, partialDateTime).
fields = Temporal::calendarMergeFields(state, calendar, fields, partialDateTime);
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Let overflow be ? GetTemporalOverflowOption(resolvedOptions).
auto overflow = Temporal::getTemporalOverflowOption(state, resolvedOptions);
// Let result be ? InterpretTemporalDateTimeFields(calendar, fields, overflow).
// Return ? CreateTemporalDateTime(result, calendar).
auto result = Temporal::interpretTemporalDateTimeFields(state, calendar, fields, overflow);
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(),
result.plainDate(), result.plainTime(), calendar);
}
TemporalPlainDateTimeObject* TemporalPlainDateTimeObject::withPlainTime(ExecutionState& state, Value plainTimeLike)
{
// Let time be ? ToTimeRecordOrMidnight(plainTimeLike).
auto time = Temporal::toTimeRecordOrMidnight(state, plainTimeLike);
// Let isoDateTime be CombineISODateAndTimeRecord(plainDateTime.[[ISODateTime]].[[ISODate]], time).
auto isoDate = computeISODate(state);
// Return ? CreateTemporalDateTime(isoDateTime, plainDateTime.[[Calendar]]).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(),
isoDate, time, calendarID());
}
TemporalPlainDateTimeObject* TemporalPlainDateTimeObject::withCalendar(ExecutionState& state, Value calendarLike)
{
// Let calendar be ? ToTemporalCalendarIdentifier(calendarLike).
auto calendar = Temporal::toTemporalCalendarIdentifier(state, calendarLike);
auto icuCalendar = calendar.createICUCalendar(state);
UErrorCode status = U_ZERO_ERROR;
ucal_setMillis(icuCalendar, ucal_getMillis(m_icuCalendar, &status), &status);
// Return ! CreateTemporalDateTime(plainDateTime.[[ISODateTime]], calendar).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(),
icuCalendar, plainTime().microsecond() * 1000 + plainTime().nanosecond(), calendar);
}
} // namespace Escargot
#endif

View file

@ -103,6 +103,17 @@ public:
return TemporalPlainDateGetter::monthCode(state, plainDate(), calendarID(), m_icuCalendar);
}
ISO8601::PlainDate computeISODate(ExecutionState& state);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.with
TemporalPlainDateTimeObject* with(ExecutionState& state, Value temporalDateTimeLike, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaintime
TemporalPlainDateTimeObject* withPlainTime(ExecutionState& state, Value plainTimeLike);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withcalendar
TemporalPlainDateTimeObject* withCalendar(ExecutionState& state, Value calendarLike);
private:
ISO8601::PlainDateTime* m_plainDateTime;
Calendar m_calendarID;

View file

@ -1220,31 +1220,6 @@ static Optional<std::tuple<PlainTime, Optional<TimeZoneRecord>>> parseTime(Parse
return Optional<std::tuple<PlainTime, Optional<TimeZoneRecord>>>(std::make_tuple(std::move(plainTime.value()), NullOption));
}
Optional<std::tuple<PlainTime, Optional<TimeZoneRecord>>> parseTime(String* input)
{
DateTimeParseOption option;
ParserString buffer(input);
if (!buffer.atEnd() && toupper(*buffer) == 'T') {
buffer.advance();
}
auto result = parseTime(buffer, option);
Optional<CalendarID> calendarOptional;
if (!buffer.atEnd() && canBeRFC9557Annotation(buffer)) {
auto calendars = parseCalendar(buffer);
if (!calendars)
return NullOption;
if (calendars.value().size() > 0)
calendarOptional = std::move(calendars.value()[0]);
}
if (buffer.atEnd()) {
return result;
}
return NullOption;
}
static Optional<PlainDate> parseDate(ParserString& buffer, bool parseYear = true, bool parseMonth = true, bool parseDay = true)
{
// https://tc39.es/proposal-temporal/#prod-Date
@ -1394,6 +1369,43 @@ static Optional<PlainDate> parseDate(ParserString& buffer, bool parseYear = true
return PlainDate(year, month, day);
}
Optional<std::tuple<PlainTime, Optional<TimeZoneRecord>>> parseTime(String* input)
{
DateTimeParseOption option;
ParserString buffer(input);
bool seenT = false;
if (!buffer.atEnd() && toupper(*buffer) == 'T') {
buffer.advance();
seenT = true;
}
auto result = parseTime(buffer, option);
// for ambiguous strings like "2021-12", "12-14"...
if (!seenT) {
ParserString buffer1(input);
ParserString buffer2(input);
ParserString buffer3(input);
if (parseDate(buffer1) || parseDate(buffer2, false, true, true) || parseDate(buffer3, true, true, false)) {
return NullOption;
}
}
Optional<CalendarID> calendarOptional;
if (!buffer.atEnd() && canBeRFC9557Annotation(buffer)) {
auto calendars = parseCalendar(buffer);
if (!calendars)
return NullOption;
if (calendars.value().size() > 0)
calendarOptional = std::move(calendars.value()[0]);
}
if (buffer.atEnd()) {
return result;
}
return NullOption;
}
static Optional<std::tuple<PlainDate, Optional<PlainTime>, Optional<TimeZoneRecord>>> parseDateTime(ParserString& buffer, DateTimeParseOption option)
{
// https://tc39.es/proposal-temporal/#prod-DateTime

View file

@ -921,93 +921,23 @@
<test id="built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/until/wrapping-at-end-of-month"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/until/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/copy-properties-not-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/options-empty"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/overflow-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/with/throws-if-combined-date-time-outside-valid-iso-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withCalendar/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-calendar-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-critical-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-date-with-utc-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-minus-sign"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-multiple-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-multiple-time-zone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-no-implicit-midnight"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-separators"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-zone-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-with-time-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-with-utc-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/throws-if-combined-date-time-outside-valid-iso-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/time-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/monthdaylike-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/compare/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-plaindatetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/from/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/since/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/since/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-plurals-accepted"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainTime/prototype/with/plaintimelike-invalid"><reason>TODO</reason></test>
@ -1968,8 +1898,6 @@
<test id="intl402/Temporal/PlainDateTime/prototype/until/different-calendars-throws"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/until/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/non-iso-calendar-fields"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/withCalendar/argument-string"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/withCalendar/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/calendar-not-supporting-eras"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/constrain-to-leap-day"><reason>TODO</reason></test>