Implement basic of Temporal.PlainMonthDay

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-10-15 10:36:30 +09:00 committed by Patrick Kim
commit c3c3bca85e
12 changed files with 587 additions and 244 deletions

View file

@ -27,6 +27,7 @@
#include "runtime/TemporalInstantObject.h"
#include "runtime/TemporalPlainTimeObject.h"
#include "runtime/TemporalPlainDateObject.h"
#include "runtime/TemporalPlainMonthDayObject.h"
#include "runtime/TemporalPlainYearMonthObject.h"
#include "runtime/TemporalNowObject.h"
#include "runtime/DateObject.h"
@ -593,7 +594,7 @@ static Value builtinTemporalPlainYearMonthConstructor(ExecutionState& state, Val
// Let m be ? ToIntegerWithTruncation(isoMonth).
auto m = argv[1].toIntegerWithTruncation(state);
// If calendar is undefined, set calendar to "iso8601".
Value calendar = argc > 3 ? argv[2] : Value();
Value calendar = argc >= 3 ? argv[2] : Value();
if (calendar.isUndefined()) {
calendar = state.context()->staticStrings().lazyISO8601().string();
}
@ -710,6 +711,129 @@ static Value builtinTemporalPlainYearMonthSince(ExecutionState& state, Value thi
return plainYearMonth->since(state, argv[0], argc > 1 ? argv[1] : Value());
}
static Value builtinTemporalPlainYearMonthEquals(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINYEARMONTH(plainYearMonth, Equals);
return Value(plainYearMonth->equals(state, argv[0]));
}
static Value builtinTemporalPlainMonthDayConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
// If NewTarget is undefined, throw a TypeError exception.
if (!newTarget.hasValue()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, ErrorObject::Messages::GlobalObject_ConstructorRequiresNew);
}
Object* proto = Object::getPrototypeFromConstructor(state, newTarget.value(), [](ExecutionState& state, Context* constructorRealm) -> Object* {
return constructorRealm->globalObject()->temporalPlainMonthDayPrototype();
});
Value referenceISOYear = argc > 3 ? argv[3] : Value();
// If referenceISOYear is undefined, then
if (referenceISOYear.isUndefined()) {
// Set referenceISOYear to 1972𝔽 (the first ISO 8601 leap year after the epoch).
referenceISOYear = Value(1972);
}
// Let m be ? ToIntegerWithTruncation(isoMonth).
auto m = argv[0].toIntegerWithTruncation(state);
// Let d be ? ToIntegerWithTruncation(isoDay).
auto d = argv[1].toIntegerWithTruncation(state);
// If calendar is undefined, set calendar to "iso8601".
Value calendar = argc >= 3 ? argv[2] : Value();
if (calendar.isUndefined()) {
calendar = state.context()->staticStrings().lazyISO8601().string();
}
// If calendar is not a String, throw a TypeError exception.
if (!calendar.isString()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "calendar must be String");
}
// Set calendar to ? CanonicalizeCalendar(calendar).
auto mayCalendar = Calendar::fromString(calendar.asString());
if (!mayCalendar) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid calendar");
}
// Let y be ? ToIntegerWithTruncation(referenceISOYear).
auto y = referenceISOYear.toIntegerWithTruncation(state);
// If IsValidISODate(y, m, ref) is false, throw a RangeError exception.
// If IsValidISODate(y, m, d) is false, throw a RangeError exception.
if (m < 1 || m > 12 || d < 1 || d > ISO8601::daysInMonth(y, m) || !ISO8601::isDateTimeWithinLimits(y, m, d, 12, 0, 0, 0, 0, 0)) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "date is out of range");
}
// Let isoDate be CreateISODateRecord(y, m, d).
// Return ? CreateTemporalMonthDay(isoDate, calendar, NewTarget).
return new TemporalPlainMonthDayObject(state, proto, ISO8601::PlainDate(y, m, d), mayCalendar.value());
}
static Value builtinTemporalPlainMonthDayFrom(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
return Temporal::toTemporalMonthDay(state, argv[0], argc > 1 ? argv[1] : Value());
}
#define RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY(NAME, BUILT_IN_METHOD) \
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainMonthDayObject()) { \
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainMonthDay().string(), true, state.context()->staticStrings().lazy##BUILT_IN_METHOD().string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \
} \
TemporalPlainMonthDayObject* NAME = thisValue.asObject()->asTemporalPlainMonthDayObject();
#define RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY2(NAME, BUILT_IN_METHOD) \
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainMonthDayObject()) { \
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainMonthDay().string(), true, state.context()->staticStrings().BUILT_IN_METHOD.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \
} \
TemporalPlainMonthDayObject* NAME = thisValue.asObject()->asTemporalPlainMonthDayObject();
static Value builtinTemporalPlainMonthDayCalendarId(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY(temporalMonthDay, CalendarId);
if (temporalMonthDay->calendarID() == Calendar(Calendar::ID::ISO8601)) {
return state.context()->staticStrings().lazyISO8601().string();
} else {
return temporalMonthDay->calendarID().toString();
}
}
static Value builtinTemporalPlainMonthDayMonthCode(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY(temporalMonthDay, MonthCode);
return temporalMonthDay->monthCode(state);
}
static Value builtinTemporalPlainMonthDayToJSON(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY2(plainMonthDay, toJSON);
return plainMonthDay->toString(state, Value());
}
static Value builtinTemporalPlainMonthDayToLocaleString(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY2(plainMonthDay, toLocaleString);
return plainMonthDay->toString(state, Value());
}
static Value builtinTemporalPlainMonthDayToString(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY2(plainMonthDay, toString);
return plainMonthDay->toString(state, argc ? argv[0] : Value());
}
static Value builtinTemporalPlainMonthDayWith(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY2(plainMonthDay, with);
return plainMonthDay->with(state, argv[0], argc > 1 ? argv[1] : Value());
}
static Value builtinTemporalPlainMonthDayEquals(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY(plainMonthDay, Equals);
return Value(plainMonthDay->equals(state, argv[0]));
}
static Value builtinTemporalPlainMonthDayToPlainDate(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINMONTHDAY(plainMonthDay, ToPlainDate);
return plainMonthDay->toPlainDate(state, argv[0]);
}
void GlobalObject::initializeTemporal(ExecutionState& state)
{
ObjectPropertyNativeGetterSetterData* nativeData = new ObjectPropertyNativeGetterSetterData(
@ -905,6 +1029,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
#define DEFINE_GETTER(name, Name) DEFINE_PLAINTIME_PROTOTYPE_GETTER_PROPERTY(name, #name, Name)
PLAIN_TIME_UNITS(DEFINE_GETTER)
#undef DEFINE_GETTER
#undef DEFINE_PLAINTIME_PROTOTYPE_GETTER_PROPERTY
// Temporal.PlainDate
m_temporalPlainDate = new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyCapitalPlainDate(), builtinTemporalPlainDateConstructor, 3), NativeFunctionObject::__ForBuiltinConstructor__);
@ -963,6 +1088,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
#define DEFINE_GETTER(name, Name) DEFINE_PLAINDATE_PROTOTYPE_GETTER_PROPERTY(name, #name, Name)
PLAIN_DATE_UNITS(DEFINE_GETTER)
#undef DEFINE_GETTER
#undef DEFINE_PLAINDATE_PROTOTYPE_GETTER_PROPERTY
#define PLAINDATE_EXTRA_PROPERTY(F) \
F(era, Era) \
@ -994,6 +1120,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
#define DEFINE_GETTER(name, Name) DEFINE_PLAINDATE_PROTOTYPE_EXTRA_GETTER_PROPERTY(name, #name, Name)
PLAINDATE_EXTRA_PROPERTY(DEFINE_GETTER)
#undef DEFINE_GETTER
#undef DEFINE_PLAINDATE_PROTOTYPE_EXTRA_GETTER_PROPERTY
m_temporalPlainDate->setFunctionPrototype(state, m_temporalPlainDatePrototype);
@ -1017,6 +1144,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySubtract()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySubtract(), builtinTemporalPlainYearMonthSubtract, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyUntil()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyUntil(), builtinTemporalPlainYearMonthUntil, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySince()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySince(), builtinTemporalPlainYearMonthSince, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyEquals()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyEquals(), builtinTemporalPlainYearMonthEquals, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
{
AtomicString name(state.context(), "get calendarId");
@ -1036,7 +1164,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyMonthCode()), desc);
}
#define DEFINE_PLAINYEAR_PROTOTYPE_GETTER_PROPERTY(name, stringName, Name) \
#define DEFINE_PLAINYEARMONTH_PROTOTYPE_GETTER_PROPERTY(name, stringName, Name) \
{ \
AtomicString name(state.context(), "get " stringName); \
auto getter = new NativeFunctionObject(state, NativeFunctionInfo(name, [](ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget) -> Value { \
@ -1050,9 +1178,10 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainYearMonthPrototype->directDefineOwnProperty(state, ObjectPropertyName(state, strings->lazy##Name()), desc); \
}
#define DEFINE_GETTER(name, Name) DEFINE_PLAINYEAR_PROTOTYPE_GETTER_PROPERTY(name, #name, Name)
#define DEFINE_GETTER(name, Name) DEFINE_PLAINYEARMONTH_PROTOTYPE_GETTER_PROPERTY(name, #name, Name)
PLAIN_YEARMONTH_UNITS(DEFINE_GETTER)
#undef DEFINE_GETTER
#undef DEFINE_PLAINYEARMONTH_PROTOTYPE_GETTER_PROPERTY
#define PLAINYEARMONTH_EXTRA_PROPERTY(F) \
F(era, Era) \
@ -1079,7 +1208,54 @@ void GlobalObject::installTemporal(ExecutionState& state)
#define DEFINE_GETTER(name, Name) DEFINE_PLAINYEARMONTH_PROTOTYPE_EXTRA_GETTER_PROPERTY(name, #name, Name)
PLAINYEARMONTH_EXTRA_PROPERTY(DEFINE_GETTER)
#undef DEFINE_GETTER
#undef DEFINE_PLAINYEARMONTH_PROTOTYPE_EXTRA_GETTER_PROPERTY
// Temporal.PlainMonthDay
m_temporalPlainMonthDay = new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyCapitalPlainMonthDay(), builtinTemporalPlainMonthDayConstructor, 2), NativeFunctionObject::__ForBuiltinConstructor__);
m_temporalPlainMonthDay->setGlobalIntrinsicObject(state);
m_temporalPlainMonthDay->directDefineOwnProperty(state, ObjectPropertyName(strings->from), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->from, builtinTemporalPlainMonthDayFrom, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype = m_temporalPlainMonthDay->getFunctionPrototype(state).asObject();
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().toStringTag),
ObjectPropertyDescriptor(Value(strings->lazyTemporalDotPlainMonthDay().string()), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toString), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toString, builtinTemporalPlainMonthDayToString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toJSON), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toJSON, builtinTemporalPlainMonthDayToJSON, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toLocaleString), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toLocaleString, builtinTemporalPlainMonthDayToLocaleString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->valueOf), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->valueOf, builtinTemporalAnyInstanceValueOf, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->with), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->with, builtinTemporalPlainMonthDayWith, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyEquals()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyEquals(), builtinTemporalPlainMonthDayEquals, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyToPlainDate()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyToPlainDate(), builtinTemporalPlainMonthDayToPlainDate, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
{
AtomicString name(state.context(), "get calendarId");
JSGetterSetter gs(
new NativeFunctionObject(state, NativeFunctionInfo(name, builtinTemporalPlainMonthDayCalendarId, 0, NativeFunctionInfo::Strict)),
Value(Value::EmptyValue));
ObjectPropertyDescriptor desc(gs, ObjectPropertyDescriptor::ConfigurablePresent);
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyCalendarId()), desc);
}
{
AtomicString name(state.context(), "get monthCode");
JSGetterSetter gs(
new NativeFunctionObject(state, NativeFunctionInfo(name, builtinTemporalPlainMonthDayMonthCode, 0, NativeFunctionInfo::Strict)),
Value(Value::EmptyValue));
ObjectPropertyDescriptor desc(gs, ObjectPropertyDescriptor::ConfigurablePresent);
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyMonthCode()), desc);
}
{
AtomicString day(state.context(), "get day");
auto getter = new NativeFunctionObject(state, NativeFunctionInfo(day, [](ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget) -> Value {
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainMonthDayObject()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainMonthDay().string(), true, String::fromASCII("day"), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver);
}
TemporalPlainMonthDayObject* s = thisValue.asObject()->asTemporalPlainMonthDayObject();
return Value(s->plainDate().day()); }, 0, NativeFunctionInfo::Strict));
JSGetterSetter gs(getter, Value());
ObjectPropertyDescriptor desc(gs, ObjectPropertyDescriptor::ConfigurablePresent);
m_temporalPlainMonthDayPrototype->directDefineOwnProperty(state, ObjectPropertyName(state, strings->lazyDay()), desc);
}
m_temporal = new Object(state);
m_temporal->setGlobalIntrinsicObject(state);
@ -1105,6 +1281,9 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporal->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyCapitalPlainYearMonth()),
ObjectPropertyDescriptor(m_temporalPlainYearMonth, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporal->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyCapitalPlainMonthDay()),
ObjectPropertyDescriptor(m_temporalPlainMonthDay, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
redefineOwnProperty(state, ObjectPropertyName(strings->lazyCapitalTemporal()),
ObjectPropertyDescriptor(m_temporal, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
}

View file

@ -287,6 +287,8 @@ class FunctionObject;
F(temporalPlainTimePrototype, Object, objName) \
F(temporalPlainDate, FunctionObject, objName) \
F(temporalPlainDatePrototype, Object, objName) \
F(temporalPlainMonthDay, FunctionObject, objName) \
F(temporalPlainMonthDayPrototype, Object, objName) \
F(temporalPlainYearMonth, FunctionObject, objName) \
F(temporalPlainYearMonthPrototype, Object, objName)
#else

View file

@ -969,6 +969,7 @@ namespace Escargot {
F(CapitalPlainDate, "PlainDate") \
F(CapitalPlainDateTime, "PlainDateTime") \
F(CapitalPlainTime, "PlainTime") \
F(CapitalPlainMonthDay, "PlainMonthDay") \
F(CapitalPlainYearMonth, "PlainYearMonth") \
F(CapitalTemporal, "Temporal") \
F(Critical, "critical") \
@ -1007,6 +1008,7 @@ namespace Escargot {
F(TemporalDotPlainDate, "Temporal.PlainDate") \
F(TemporalDotPlainDateTime, "Temporal.PlainDateTime") \
F(TemporalDotPlainTime, "Temporal.PlainTime") \
F(TemporalDotPlainMonthDay, "Temporal.PlainMonthDay") \
F(TemporalDotPlainYearMonth, "Temporal.PlainYearMonth") \
F(ToPlainDate, "toPlainDate") \
F(TimeZoneId, "timeZoneId") \

View file

@ -52,6 +52,7 @@
#include "runtime/TemporalInstantObject.h"
#include "runtime/TemporalPlainTimeObject.h"
#include "runtime/TemporalPlainDateObject.h"
#include "runtime/TemporalPlainMonthDayObject.h"
#include "runtime/TemporalPlainYearMonthObject.h"
#include "intl/Intl.h"
@ -603,6 +604,110 @@ TemporalPlainYearMonthObject* Temporal::toTemporalYearMonth(ExecutionState& stat
plainDate, mayID.value());
}
TemporalPlainMonthDayObject* Temporal::toTemporalMonthDay(ExecutionState& state, Value item, Value options)
{
// If options is not present, set options to undefined.
// If item is an Object, then
if (item.isObject()) {
// If item has an [[InitializedTemporalDate]] internal slot, then
if (item.asObject()->isTemporalPlainMonthDayObject()) {
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Perform ? GetTemporalOverflowOption(resolvedOptions).
Temporal::getTemporalOverflowOption(state, resolvedOptions);
// Return ! CreateTemporalYearMonth(item.[[ISODate]], item.[[Calendar]]).
return new TemporalPlainMonthDayObject(state, state.context()->globalObject()->temporalPlainMonthDayPrototype(),
item.asObject()->asTemporalPlainMonthDayObject()->plainDate(), item.asObject()->asTemporalPlainMonthDayObject()->calendarID());
}
// Let calendar be ? GetTemporalCalendarIdentifierWithISODefault(item).
auto calendar = Temporal::getTemporalCalendarIdentifierWithISODefault(state, item);
// Let fields be ? PrepareCalendarFields(calendar, item, « year, month, month-code », «», «»).
CalendarField f[4] = { CalendarField::Year, CalendarField::Month, CalendarField::MonthCode, CalendarField::Day };
auto fields = prepareCalendarFields(state, calendar, item.asObject(), f, 4, nullptr, 0, nullptr, 0);
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Let overflow be ? GetTemporalOverflowOption(resolvedOptions).
auto overflow = Temporal::getTemporalOverflowOption(state, resolvedOptions);
// Let isoDate be ? CalendarMonthDayFromFields(calendar, fields, overflow).
auto isoDate = calendarDateFromFields(state, calendar, fields, overflow, CalendarDateFromFieldsMode::MonthDay);
// Return ! CreateTemporalMonthDay(isoDate, calendar).
return new TemporalPlainMonthDayObject(state, state.context()->globalObject()->temporalPlainMonthDayPrototype(),
isoDate, calendar);
}
// If item is not a String, throw a TypeError exception.
if (!item.isString()) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "ToTemporalMonthDay needs Object or String");
}
// Let result be ? ParseISODateTime(item, « TemporalMonthDayString »).
ISO8601::DateTimeParseOption option;
option.allowTimeZoneTimeWithoutTime = true;
auto result = ISO8601::parseCalendarDateTime(item.asString(), option);
auto parseResultMonthDay = ISO8601::parseCalendarMonthDay(item.asString(), option);
if (!result && !parseResultMonthDay) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO Date string");
}
int32_t testYear = 1972;
ISO8601::PlainDate plainDate;
Optional<ISO8601::TimeZoneRecord> timeZone;
Optional<ISO8601::CalendarID> calendarID;
if (result) {
plainDate = std::get<0>(result.value());
timeZone = std::get<2>(result.value());
calendarID = std::get<3>(result.value());
if (calendarID && calendarID.value() != "iso8601") {
testYear = plainDate.year();
}
if (!std::get<1>(result.value()) && timeZone && timeZone.value().m_offset) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO Time string without UTC designator");
}
} else {
plainDate = std::get<0>(parseResultMonthDay.value());
timeZone = std::get<1>(parseResultMonthDay.value());
calendarID = std::get<2>(parseResultMonthDay.value());
}
// override year
plainDate = ISO8601::PlainDate(1972, plainDate.month(), plainDate.day());
if (timeZone && timeZone.value().m_z) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO Time string without UTC designator");
}
if (parseResultMonthDay && timeZone && timeZone.value().m_offset.hasValue() && !calendarID) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO Date string");
}
if (!result && parseResultMonthDay && calendarID && calendarID.value() != "iso8601") {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO8601 calendar");
}
if (!ISO8601::isDateTimeWithinLimits(testYear, plainDate.month(), plainDate.day(), 12, 0, 0, 0, 0, 0)) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "ToTemporalMonthDay needs ISO Date string in valid range");
}
// Let calendar be result.[[Calendar]].
// If calendar is empty, set calendar to "iso8601".
String* calendar = state.context()->staticStrings().lazyISO8601().string();
if (calendarID) {
calendar = String::fromUTF8(calendarID.value().data(), calendarID.value().length());
}
// Set calendar to ? CanonicalizeCalendar(calendar).
auto mayID = Calendar::fromString(calendar);
if (!mayID) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid CalendarID");
}
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Perform ? GetTemporalOverflowOption(resolvedOptions).
Temporal::getTemporalOverflowOption(state, resolvedOptions);
return new TemporalPlainMonthDayObject(state, state.context()->globalObject()->temporalPlainMonthDayPrototype(),
plainDate, mayID.value());
}
Optional<unsigned> Temporal::getTemporalFractionalSecondDigitsOption(ExecutionState& state, Optional<Object*> resolvedOptions)
{
constexpr auto msg = "The value you gave for GetTemporalFractionalSecondDigitsOption is invalid";
@ -1345,7 +1450,7 @@ Calendar Temporal::toTemporalCalendarIdentifier(ExecutionState& state, Value tem
}
}
if (parseResultMonthDay) {
auto cid = tryOnce(state, std::get<1>(parseResultMonthDay.value()));
auto cid = tryOnce(state, std::get<2>(parseResultMonthDay.value()));
if (cid) {
return cid.value();
}
@ -1550,6 +1655,10 @@ CalendarFieldsRecord Temporal::prepareCalendarFields(ExecutionState& state, Cale
// https://tc39.es/proposal-temporal/#sec-temporal-calendarresolvefields
UCalendar* Temporal::calendarResolveFields(ExecutionState& state, Calendar calendar, CalendarFieldsRecord fields, TemporalOverflowOption overflow, CalendarDateFromFieldsMode mode)
{
if (mode == CalendarDateFromFieldsMode::MonthDay && calendar.isISO8601() && !fields.year) {
fields.year = 1972;
}
if (calendar.isISO8601() || !calendar.isEraRelated()) {
if (!fields.year || !fields.day) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Missing required field");
@ -1680,6 +1789,18 @@ UCalendar* Temporal::calendarDateFromFields(ExecutionState& state, Calendar cale
// TODO If ISOYearMonthWithinLimits(result) is false, throw a RangeError exception.
// Return result.
return ucal;
} else if (mode == CalendarDateFromFieldsMode::MonthDay) {
// Perform ? CalendarResolveFields(calendar, fields, month-day).
// Let result be ? CalendarMonthDayToISOReferenceDate(calendar, fields, overflow).
auto ucal = calendarResolveFields(state, calendar, fields, overflow, mode);
if (calendar.isISO8601()) {
ucal_set(ucal, UCAL_YEAR, 1972);
}
// TODO If ISODateWithinLimits(result) is false, throw a RangeError exception.
// Return result.
return ucal;
}
return calendarResolveFields(state, calendar, fields, overflow, mode);
}

View file

@ -253,6 +253,9 @@ public:
// https://tc39.es/proposal-temporal/#sec-temporal-totemporalyearmonth
static TemporalPlainYearMonthObject* toTemporalYearMonth(ExecutionState& state, Value item, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal-totemporalmonthday
static TemporalPlainMonthDayObject* toTemporalMonthDay(ExecutionState& state, Value item, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal-gettemporalfractionalseconddigitsoption
// NullOption means AUTO
static Optional<unsigned> getTemporalFractionalSecondDigitsOption(ExecutionState& state, Optional<Object*> resolvedOptions);
@ -340,7 +343,8 @@ public:
// https://tc39.es/proposal-temporal/#sec-temporal-calendardatefromfields
enum class CalendarDateFromFieldsMode {
Date,
YearMonth
YearMonth,
MonthDay
};
static UCalendar* calendarDateFromFields(ExecutionState& state, Calendar calendar, CalendarFieldsRecord fields, TemporalOverflowOption overflow, CalendarDateFromFieldsMode mode = CalendarDateFromFieldsMode::Date);

View file

@ -0,0 +1,185 @@
#if defined(ENABLE_TEMPORAL)
/*
* Copyright (c) 2025-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "Escargot.h"
#include "TemporalPlainMonthDayObject.h"
#include "TemporalPlainDateObject.h"
#include "TemporalDurationObject.h"
#include "intl/Intl.h"
#include "util/ISO8601.h"
#include "runtime/Context.h"
#include "runtime/GlobalObject.h"
namespace Escargot {
#define CHECK_ICU() \
if (U_FAILURE(status)) { \
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "failed to get value from ICU calendar"); \
}
TemporalPlainMonthDayObject::TemporalPlainMonthDayObject(ExecutionState& state, Object* proto, ISO8601::PlainDate plainDate, Calendar calendar)
: TemporalPlainDateObject(state, proto, plainDate, calendar)
{
}
TemporalPlainMonthDayObject::TemporalPlainMonthDayObject(ExecutionState& state, Object* proto, UCalendar* icuCalendar, Calendar calendar)
: TemporalPlainDateObject(state, proto, icuCalendar, calendar)
{
}
String* TemporalPlainMonthDayObject::toString(ExecutionState& state, Value options)
{
auto resolvedOptions = Intl::getOptionsObject(state, options);
auto showCalendar = Temporal::getTemporalShowCalendarNameOption(state, resolvedOptions);
auto isoDate = computeISODate(state);
StringBuilder builder;
int32_t year = isoDate.year();
int32_t month = isoDate.month();
int32_t day = isoDate.day();
if (showCalendar == TemporalShowCalendarNameOption::Always || showCalendar == TemporalShowCalendarNameOption::Critical || !calendarID().isISO8601()) {
if (year > 9999 || year < 0) {
builder.appendChar(year < 0 ? '-' : '+');
auto s = pad('0', 6, std::to_string(std::abs(year)));
builder.appendString(String::fromASCII(s.data(), s.length()));
} else {
auto s = pad('0', 4, std::to_string(std::abs(year)));
builder.appendString(String::fromASCII(s.data(), s.length()));
}
builder.appendChar('-');
}
{
auto s = pad('0', 2, std::to_string(month));
builder.appendString(String::fromASCII(s.data(), s.length()));
}
builder.appendChar('-');
{
auto s = pad('0', 2, std::to_string(day));
builder.appendString(String::fromASCII(s.data(), s.length()));
}
Temporal::formatCalendarAnnotation(builder, m_calendarID, showCalendar);
return builder.finalize();
}
TemporalPlainMonthDayObject* TemporalPlainMonthDayObject::with(ExecutionState& state, Value temporalMonthDayLike, Value options)
{
// If ? IsPartialTemporalObject(temporalMonthDayLike) is false, throw a TypeError exception.
if (!Temporal::isPartialTemporalObject(state, temporalMonthDayLike)) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid temporalMonthDayLike");
}
// Let calendar be plainMonthDay.[[Calendar]].
auto calendar = calendarID();
// Let fields be ISODateToFields(calendar, plainMonthDay.[[ISODate]], month-day).
CalendarFieldsRecord fields;
auto isoDate = computeISODate(state);
fields.year = isoDate.year();
fields.month = isoDate.month();
MonthCode mc;
mc.monthNumber = isoDate.month();
fields.monthCode = mc;
fields.day = isoDate.day();
// Let partialMonthDay be ? PrepareCalendarFields(calendar, temporalMonthDayLike, « year, month, month-code, day », « », partial).
CalendarField f[4] = { CalendarField::Year, CalendarField::Month, CalendarField::MonthCode, CalendarField::Day };
auto partialMonthDay = Temporal::prepareCalendarFields(state, calendar, temporalMonthDayLike.asObject(), f, 4, nullptr, 0, nullptr, SIZE_MAX);
// intl402/Temporal/PlainMonthDay/prototype/with/fields-missing-properties
if (!calendar.isISO8601()) {
bool missing = false;
if (partialMonthDay.month && !partialMonthDay.day) {
missing = true;
} else if (partialMonthDay.monthCode && !partialMonthDay.day) {
missing = true;
} else if (partialMonthDay.day && !partialMonthDay.month && !partialMonthDay.monthCode) {
missing = true;
}
if (missing) {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid temporalMonthDayLike");
}
}
// Set fields to CalendarMergeFields(calendar, fields, partialMonthDay).
fields = Temporal::calendarMergeFields(state, calendar, fields, partialMonthDay);
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Let overflow be ? GetTemporalOverflowOption(resolvedOptions).
auto overflow = Temporal::getTemporalOverflowOption(state, resolvedOptions);
// Let isoDate be ? CalendarMonthDayFromFields(calendar, fields, overflow).
auto icuDate = Temporal::calendarDateFromFields(state, calendar, fields, overflow, Temporal::CalendarDateFromFieldsMode::MonthDay);
// Return ! CreateTemporalMonthDay(isoDate, calendar).
return new TemporalPlainMonthDayObject(state, state.context()->globalObject()->temporalPlainMonthDayPrototype(),
icuDate, calendar);
}
bool TemporalPlainMonthDayObject::equals(ExecutionState& state, Value other)
{
auto otherDate = Temporal::toTemporalMonthDay(state, other, Value());
int c = compareISODate(state, this, otherDate);
if (c == 0) {
if (calendarID() == otherDate->calendarID()) {
return true;
}
}
return false;
}
TemporalPlainDateObject* TemporalPlainMonthDayObject::toPlainDate(ExecutionState& state, Value item)
{
// If item is not an Object, then
if (!item.isObject()) {
// Throw a TypeError exception.
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid item");
}
// Let calendar be plainMonthDay.[[Calendar]].
auto calendar = calendarID();
// Let fields be ISODateToFields(calendar, plainMonthDay.[[ISODate]], month-day).
CalendarFieldsRecord fields;
auto isoDate = computeISODate(state);
fields.year = isoDate.year();
fields.month = isoDate.month();
MonthCode mc;
mc.monthNumber = isoDate.month();
fields.monthCode = mc;
fields.day = isoDate.day();
// Let inputFields be ? PrepareCalendarFields(calendar, item, « year », « », « »).
CalendarField f[1] = { CalendarField::Year };
auto inputFields = Temporal::prepareCalendarFields(state, calendar, item.asObject(), f, 1, nullptr, 0, nullptr, SIZE_MAX);
// Let mergedFields be CalendarMergeFields(calendar, fields, inputFields).
auto mergedFields = Temporal::calendarMergeFields(state, calendar, fields, inputFields);
// Let isoDate be ? CalendarDateFromFields(calendar, mergedFields, constrain).
auto icuDate = Temporal::calendarDateFromFields(state, calendar, mergedFields, TemporalOverflowOption::Constrain);
// Return ! CreateTemporalDate(isoDate, calendar).
if (calendar.isISO8601() && !ISO8601::isDateTimeWithinLimits(mergedFields.year.value(), mergedFields.monthCode ? mergedFields.monthCode.value().monthNumber : mergedFields.month.value(), mergedFields.day.value(), 12, 0, 0, 0, 0, 0)) {
ucal_close(icuDate);
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "date is out of range");
}
return new TemporalPlainDateObject(state, state.context()->globalObject()->temporalPlainDatePrototype(),
icuDate, calendar);
}
} // namespace Escargot
#endif

View file

@ -0,0 +1,59 @@
#if defined(ENABLE_TEMPORAL)
/*
* Copyright (c) 2025-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef __EscargotTemporalPlainMonthDayObject__
#define __EscargotTemporalPlainMonthDayObject__
#include "runtime/TemporalPlainDateObject.h"
namespace Escargot {
class TemporalPlainMonthDayObject : public TemporalPlainDateObject {
public:
TemporalPlainMonthDayObject(ExecutionState& state, Object* proto, ISO8601::PlainDate plainYearMonth, Calendar calendar);
TemporalPlainMonthDayObject(ExecutionState& state, Object* proto, UCalendar* icuCalendar, Calendar calendar);
virtual bool isTemporalPlainDateObject() const override
{
return false;
}
virtual bool isTemporalPlainMonthDayObject() const override
{
return true;
}
// https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.tostring
String* toString(ExecutionState& state, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal.plainmonthday.prototype.with
TemporalPlainMonthDayObject* with(ExecutionState& state, Value temporalMonthDayLike, Value options);
bool equals(ExecutionState& state, Value other);
TemporalPlainDateObject* toPlainDate(ExecutionState& state, Value item);
private:
};
} // namespace Escargot
#endif
#endif

View file

@ -334,6 +334,18 @@ TemporalDurationObject* TemporalPlainYearMonthObject::until(ExecutionState& stat
return new TemporalDurationObject(state, differenceTemporalPlainYearMonth(state, DifferenceTemporalYearMonth::Until, other, options));
}
bool TemporalPlainYearMonthObject::equals(ExecutionState& state, Value other)
{
auto otherDate = Temporal::toTemporalYearMonth(state, other, Value());
int c = compareISODate(state, this, otherDate);
if (c == 0) {
if (calendarID() == otherDate->calendarID()) {
return true;
}
}
return false;
}
} // namespace Escargot
#endif

View file

@ -62,6 +62,8 @@ public:
TemporalDurationObject* since(ExecutionState& state, Value other, Value options);
TemporalDurationObject* until(ExecutionState& state, Value other, Value options);
bool equals(ExecutionState& state, Value other);
private:
// https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplainyearmonth
enum class DifferenceTemporalYearMonth {

View file

@ -1328,6 +1328,11 @@ static Optional<PlainDate> parseDate(ParserString& buffer, bool parseYear = true
if (buffer.atEnd())
return NullOption;
// --10-01 form
if (!parseYear && parseMonth && parseDay && *buffer == '-' && buffer.lengthRemaining() > 2 && buffer[1] == '-') {
buffer.advanceBy(2);
}
auto firstMonthCharacter = *buffer;
if (firstMonthCharacter == '0' || firstMonthCharacter == '1') {
buffer.advance();
@ -1497,13 +1502,20 @@ static Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<Calenda
return std::make_tuple(std::move(date.value()), tz, std::move(calendarOptional));
}
static Optional<std::tuple<PlainDate, Optional<CalendarID>>> parseCalendarMonthDay(ParserString& buffer, DateTimeParseOption option)
static Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarMonthDay(ParserString& buffer, DateTimeParseOption option)
{
auto date = parseDate(buffer, false, true, true);
if (!date) {
return NullOption;
}
Optional<TimeZoneRecord> tz;
if (!buffer.atEnd() && canBeTimeZone(buffer, *buffer)) {
tz = parseTimeZone(buffer, option);
if (!tz)
return NullOption;
}
Optional<CalendarID> calendarOptional;
if (!buffer.atEnd() && canBeRFC9557Annotation(buffer)) {
auto calendars = parseCalendar(buffer);
@ -1513,7 +1525,7 @@ static Optional<std::tuple<PlainDate, Optional<CalendarID>>> parseCalendarMonthD
calendarOptional = std::move(calendars.value()[0]);
}
return std::make_tuple(std::move(date.value()), std::move(calendarOptional));
return std::make_tuple(std::move(date.value()), tz, std::move(calendarOptional));
}
Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarYearMonth(String* input, DateTimeParseOption option)
@ -1526,7 +1538,7 @@ Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>>
return result;
}
Optional<std::tuple<PlainDate, Optional<CalendarID>>> parseCalendarMonthDay(String* input, DateTimeParseOption option)
Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarMonthDay(String* input, DateTimeParseOption option)
{
ParserString buffer(input);
auto result = parseCalendarMonthDay(buffer, option);

View file

@ -577,7 +577,7 @@ Optional<std::tuple<PlainTime, Optional<TimeZoneRecord>>> parseTime(String* inpu
Optional<std::tuple<PlainDate, Optional<PlainTime>, Optional<TimeZoneRecord>>> parseDateTime(String* input);
Optional<std::tuple<PlainDate, Optional<PlainTime>, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarDateTime(String* input, DateTimeParseOption option = {});
Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarYearMonth(String* input, DateTimeParseOption option = {});
Optional<std::tuple<PlainDate, Optional<CalendarID>>> parseCalendarMonthDay(String* input, DateTimeParseOption option = {});
Optional<std::tuple<PlainDate, Optional<TimeZoneRecord>, Optional<CalendarID>>> parseCalendarMonthDay(String* input, DateTimeParseOption option = {});
Optional<String*> parseCalendarString(String* input);
// https://tc39.es/proposal-temporal/#sec-temporal-roundnumbertoincrement

View file

@ -1220,184 +1220,10 @@
<test id="built-ins/Temporal/PlainDateTime/subclass"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/throws-if-date-is-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/throws-if-time-is-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/argument-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-always"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/calendar-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-calendar-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-critical-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-date-with-utc-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-minus-sign"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-multiple-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-multiple-time-zone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-time-separators"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-time-zone-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-string-with-utc-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/argument-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/constrain-to-leap-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-leap-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-plainmonthday"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/fields-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/monthcode-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/observable-get-overflow-argument-primitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/observable-get-overflow-argument-string-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/one-of-era-erayear-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/options-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/options-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/overflow"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/overflow-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/from/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/get-prototype-from-constructor-throws"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/missing-arguments"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/negative-infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/calendarId/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/calendarId/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/day/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/day/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/day/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-calendar-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-critical-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-date-with-utc-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-minus-sign"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-multiple-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-multiple-time-zone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-separators"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-time-zone-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-string-with-utc-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/builtin"><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/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/month/unsupported"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/monthCode/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/monthCode/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/monthCode/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toJSON/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toLocaleString/return-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/argument-not-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/default-overflow-behaviour"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-auto"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-critical"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-never"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/options-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toString/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/toStringTag/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/valueOf/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/copy-properties-not-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/monthdaylike-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/options-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/options-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/options-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/overflow-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/prototype/with/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/refisoyear-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/refisoyear-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainMonthDay/subclass"><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>
@ -1424,41 +1250,7 @@
<test id="built-ins/Temporal/PlainYearMonth/limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/add/argument-duration-max"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/add/throws-if-year-outside-valid-iso-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-cast"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-calendar-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-critical-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-date-with-utc-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-invalid"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-minus-sign"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-multiple-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-multiple-time-zone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-separators"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-time-zone-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-string-with-utc-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/compare-reference-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/since/argument-string-limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/since/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainYearMonth/prototype/since/throws-if-year-outside-valid-iso-range"><reason>TODO</reason></test>
@ -2426,37 +2218,21 @@
<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/PlainDateTime/prototype/yearOfWeek/non-iso-week-of-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/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>
<test id="intl402/Temporal/PlainMonthDay/from/fields-object"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/reference-date-noniso-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/reference-year-1972"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/equals/calendars"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/equals/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toJSON/calendarname"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toJSON/year-format"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/calendar-mismatch"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/dateStyle"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/dateStyle-timeStyle-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/default-does-not-include-year-time-and-time-zone-name"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/locales-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/lone-options-accepted"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/options-conflict"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toLocaleString/resolved-time-zone"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toPlainDate/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-always"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-auto"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-critical"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-never"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/calendarname-wrong-type"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/toString/year-format"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/with/fields-missing-properties"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/prototype/with/non-iso-calendar-fields"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainTime/prototype/toLocaleString/default-does-not-include-date-and-time-zone-name"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainTime/prototype/toLocaleString/locales-undefined"><reason>TODO</reason></test>
@ -2471,10 +2247,7 @@
<test id="intl402/Temporal/PlainYearMonth/from/remapping-era"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/add/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/equals/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/equals/compare-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/since/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/since/mixed-calendar-invalid"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/calendar-mismatch"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/dateStyle"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/dateStyle-undefined"><reason>TODO</reason></test>
@ -2483,14 +2256,7 @@
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/options-conflict"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toLocaleString/resolved-time-zone"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-always"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-auto"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-critical"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-never"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/toString/calendarname-wrong-type"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/until/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/until/mixed-calendar-invalid"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/with/minimum-valid-year-month"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/with/non-iso-calendar-fields"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/canonicalize-calendar"><reason>TODO</reason></test>
@ -3230,7 +2996,6 @@
<test id="staging/Temporal/Duration/old/relativeto-not-required-to-round-fixed-length-units-in-durations-without-variable-units"><reason>TODO</reason></test>
<test id="staging/Temporal/Regex/old/instant"><reason>TODO</reason></test>
<test id="staging/Temporal/Regex/old/plaindatetime"><reason>TODO</reason></test>
<test id="staging/Temporal/Regex/old/plainmonthday"><reason>TODO</reason></test>
<test id="staging/Temporal/removed-methods"><reason>TODO</reason></test>
<test id="staging/built-ins/Object/preventExtensions/preventExtensions-variable-length-typed-arrays"><reason>TODO</reason></test>
<test id="staging/built-ins/Object/seal/seal-variable-length-typed-arrays"><reason>TODO</reason></test>