Update Temporal

* Update calendarAdd method
* Use correct era code for ethioaa calendar
* Implement special path for hebrew calendar

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-12-09 19:59:07 +09:00 committed by Patrick Kim
commit e6417b8ed8
8 changed files with 258 additions and 512 deletions

View file

@ -132,7 +132,7 @@ void Calendar::lookupICUEra(ExecutionState& state, const std::function<bool(size
return;
} else if (id() == ID::EthiopianAmeteAlem) {
// for old-icu(~77)
if (fn(0, "aa")) {
if (fn(0, "aa")) {
return;
}
return;
@ -243,6 +243,9 @@ bool Calendar::shouldUseICUExtendedYear() const
if (sameAsGregoryExceptHandlingEraAndYear()) {
return false;
}
if (id() == Calendar::ID::EthiopianAmeteAlem) {
return false;
}
if (id() == Calendar::ID::Dangi || id() == Calendar::ID::Chinese) {
return true;
}
@ -329,16 +332,6 @@ int Calendar::diffYearDueToICU4CAndSpecDiffer() const
}
}
UCalendarDateFields Calendar::icuNonOridnalMonthCode() const
{
switch (m_id) {
case ID::Hebrew:
return UCAL_ORDINAL_MONTH;
default:
return UCAL_MONTH;
}
}
void Calendar::setYear(ExecutionState& state, UCalendar* icuCalendar, int32_t year)
{
UErrorCode status = U_ZERO_ERROR;
@ -555,6 +548,83 @@ String* Calendar::era(ExecutionState& state, UCalendar* icuCalendar)
return String::fromASCII(result.value().data(), result.value().length());
}
void Calendar::setOrdinalMonth(UCalendar* icuCalendar, int32_t month)
{
ucal_set(icuCalendar, UCAL_ORDINAL_MONTH, month - 1);
}
void Calendar::setMonth(UCalendar* icuCalendar, MonthCode mc)
{
if (id() == ID::Hebrew) {
if (mc.isLeapMonth) {
if (mc.monthNumber == 5) {
ucal_set(icuCalendar, UCAL_MONTH, 5);
} else {
// set error value
ucal_set(icuCalendar, UCAL_MONTH, 13);
}
} else if (mc.monthNumber <= 5) {
ucal_set(icuCalendar, UCAL_MONTH, mc.monthNumber - 1);
} else {
ucal_set(icuCalendar, UCAL_MONTH, mc.monthNumber);
}
} else {
ucal_set(icuCalendar, UCAL_MONTH, mc.monthNumber - 1);
ucal_set(icuCalendar, UCAL_IS_LEAP_MONTH, mc.isLeapMonth);
}
}
int32_t Calendar::ordinalMonth(ExecutionState& state, UCalendar* icuCalendar)
{
UErrorCode status = U_ZERO_ERROR;
unsigned m = ucal_get(icuCalendar, UCAL_ORDINAL_MONTH, &status);
CHECK_ICU_CALENDAR();
return m + 1;
}
MonthCode Calendar::monthCode(ExecutionState& state, UCalendar* icuCalendar)
{
MonthCode mc;
if (id() == ID::Hebrew) {
UErrorCode status = U_ZERO_ERROR;
unsigned m = ucal_get(icuCalendar, UCAL_MONTH, &status);
CHECK_ICU_CALENDAR();
if (m < 5) {
mc.monthNumber = m + 1;
mc.isLeapMonth = false;
} else if (m == 5) {
mc.monthNumber = 5;
mc.isLeapMonth = true;
} else {
mc.monthNumber = m;
mc.isLeapMonth = false;
}
} else {
UErrorCode status = U_ZERO_ERROR;
unsigned m = ucal_get(icuCalendar, UCAL_MONTH, &status);
CHECK_ICU_CALENDAR();
unsigned leap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
mc.monthNumber = m + 1;
mc.isLeapMonth = leap;
}
return mc;
}
bool Calendar::inLeapMonth(ExecutionState& state, UCalendar* icuCalendar)
{
UErrorCode status = U_ZERO_ERROR;
if (id() == ID::Hebrew) {
unsigned m = ucal_get(icuCalendar, UCAL_MONTH, &status);
CHECK_ICU_CALENDAR();
return m == 5;
} else {
unsigned testLeap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
return testLeap;
}
}
Optional<Calendar> Calendar::fromString(ISO8601::CalendarID id)
{
auto u = id;
@ -1053,7 +1123,7 @@ TemporalPlainDateTimeObject* Temporal::toTemporalDateTime(ExecutionState& state,
Temporal::getTemporalOverflowOption(state, resolvedOptions);
// Return ! CreateTemporalDateTime(item.[[ISODateTime]], item.[[Calendar]]).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(),
item.asObject()->asTemporalPlainDateTimeObject()->plainDate(),
item.asObject()->asTemporalPlainDateTimeObject()->computeISODate(state),
item.asObject()->asTemporalPlainDateTimeObject()->plainTime(),
item.asObject()->asTemporalPlainDateTimeObject()->calendarID());
} else if (item.asObject()->isTemporalZonedDateTimeObject()) {
@ -1077,7 +1147,7 @@ TemporalPlainDateTimeObject* Temporal::toTemporalDateTime(ExecutionState& state,
// Let isoDateTime be CombineISODateAndTimeRecord(item.[[ISODate]], MidnightTimeRecord()).
// Return ? CreateTemporalDateTime(isoDateTime, item.[[Calendar]]).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(),
item.asObject()->asTemporalPlainDateObject()->plainDate(),
item.asObject()->asTemporalPlainDateObject()->computeISODate(state),
ISO8601::PlainTime(),
item.asObject()->asTemporalPlainDateObject()->calendarID());
}
@ -2882,12 +2952,10 @@ static uint8_t daysInMonth(Calendar calendar, uint8_t month, bool isLeapMonth)
static void setICUMonth(Calendar calendar, const CalendarFieldsRecord& fields, UCalendar* icuCalendar)
{
if (fields.month) {
ucal_set(icuCalendar, UCAL_ORDINAL_MONTH, fields.month.value() - 1);
calendar.setOrdinalMonth(icuCalendar, fields.month.value());
}
if (fields.monthCode) {
bool lm = fields.monthCode.value().isLeapMonth;
ucal_set(icuCalendar, UCAL_IS_LEAP_MONTH, lm);
ucal_set(icuCalendar, calendar.icuNonOridnalMonthCode(), fields.monthCode.value().monthNumber - 1);
calendar.setMonth(icuCalendar, fields.monthCode.value());
}
}
@ -2901,22 +2969,19 @@ static void setICUMonthDay(ExecutionState& state, Calendar calendar, const Calen
ucal_set(icuCalendar, UCAL_DAY_OF_MONTH, 1);
setICUMonth(calendar, fields, icuCalendar);
ucal_set(icuCalendar, UCAL_DAY_OF_MONTH, day);
auto epochTime = ucal_getMillis(icuCalendar, &status);
if (fields.month) {
unsigned test = ucal_get(icuCalendar, UCAL_ORDINAL_MONTH, &status);
unsigned test = calendar.ordinalMonth(state, icuCalendar);
CHECK_ICU_CALENDAR();
if (test != fields.month.value() - 1) {
if (test != fields.month.value()) {
day--;
continue;
}
}
if (fields.monthCode) {
unsigned test = ucal_get(icuCalendar, calendar.icuNonOridnalMonthCode(), &status);
CHECK_ICU_CALENDAR();
unsigned testLeap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
if (test != fields.monthCode.value().monthNumber - 1 || (testLeap != fields.monthCode.value().isLeapMonth)) {
auto mc = calendar.monthCode(state, icuCalendar);
if (fields.monthCode.value() != mc) {
day--;
continue;
}
@ -3010,7 +3075,7 @@ std::pair<UCalendar*, Optional<ISO8601::PlainDate>> Temporal::calendarResolveFie
isoDateIfExist = ISO8601::PlainDate(fields.year.value(), month, fields.day.value());
calendar.setYear(state, icuCalendar, fields.year.value());
ucal_set(icuCalendar, calendar.icuNonOridnalMonthCode(), month - 1);
calendar.setOrdinalMonth(icuCalendar, month);
ucal_set(icuCalendar, UCAL_DAY_OF_MONTH, fields.day.value());
} else {
@ -3072,18 +3137,15 @@ std::pair<UCalendar*, Optional<ISO8601::PlainDate>> Temporal::calendarResolveFie
while (true) {
bool shouldChangeYear = false;
if (fields.month) {
unsigned test = ucal_get(icuCalendar, UCAL_ORDINAL_MONTH, &status);
unsigned test = calendar.ordinalMonth(state, icuCalendar);
CHECK_ICU_CALENDAR();
if (test != fields.month.value() - 1) {
if (test != fields.month.value()) {
shouldChangeYear = true;
}
}
if (fields.monthCode) {
unsigned test = ucal_get(icuCalendar, calendar.icuNonOridnalMonthCode(), &status);
CHECK_ICU_CALENDAR();
unsigned testLeap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
if (test != fields.monthCode.value().monthNumber - 1 || (testLeap != fields.monthCode.value().isLeapMonth)) {
auto mc = calendar.monthCode(state, icuCalendar);
if (mc != fields.monthCode.value()) {
shouldChangeYear = true;
}
}
@ -3093,14 +3155,7 @@ std::pair<UCalendar*, Optional<ISO8601::PlainDate>> Temporal::calendarResolveFie
diff++;
} else {
if (wasYearSpecified && calendar.hasLeapMonths() && !fields.monthCode) {
unsigned test = ucal_get(icuCalendar, calendar.icuNonOridnalMonthCode(), &status);
CHECK_ICU_CALENDAR();
unsigned testLeap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
MonthCode mc;
mc.monthNumber = test + 1;
mc.isLeapMonth = testLeap;
fields.monthCode = mc;
fields.monthCode = calendar.monthCode(state, icuCalendar);
}
auto isoDate = computeISODate(state, icuCalendar);
@ -3120,18 +3175,15 @@ std::pair<UCalendar*, Optional<ISO8601::PlainDate>> Temporal::calendarResolveFie
UErrorCode status = U_ZERO_ERROR;
if (fields.month) {
unsigned test = ucal_get(icuCalendar, UCAL_ORDINAL_MONTH, &status);
unsigned test = calendar.ordinalMonth(state, icuCalendar);
CHECK_ICU_CALENDAR();
if (test != fields.month.value() - 1) {
if (test != fields.month.value()) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid month value");
}
}
if (fields.monthCode) {
unsigned test = ucal_get(icuCalendar, calendar.icuNonOridnalMonthCode(), &status);
CHECK_ICU_CALENDAR();
unsigned testLeap = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU_CALENDAR();
if (test != fields.monthCode.value().monthNumber - 1 || (testLeap != fields.monthCode.value().isLeapMonth)) {
auto mc = calendar.monthCode(state, icuCalendar);
if (mc != fields.monthCode.value()) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid monthCode value");
}
}
@ -3363,36 +3415,65 @@ std::pair<UCalendar*, ISO8601::PlainDate> Temporal::calendarDateAdd(ExecutionSta
return std::make_pair(newCal.release(), ISO8601::PlainDate(year, month, day));
} else {
int32_t o, check;
int32_t y, m, d, check, monthCount;
MonthCode mc;
y = ucal_get(newCal.get(), UCAL_YEAR, &status);
m = calendar.ordinalMonth(state, newCal.get());
mc = calendar.monthCode(state, newCal.get());
d = ucal_get(newCal.get(), UCAL_DAY_OF_MONTH, &status);
monthCount = TemporalPlainDateGetter::monthsInYear(state, computeISODate(state, newCal.get()), calendar, newCal.get()).asInt32();
bool isAnnotherCaseOfCalendarsItHasLeapMonth = (calendar.id() == Calendar::ID::Chinese || calendar.id() == Calendar::ID::Dangi);
bool isHebrewRejectCase = overflow == TemporalOverflowOption::Reject && calendar.id() == Calendar::ID::Hebrew && duration.years() && mc.isLeapMonth;
o = ucal_get(newCal.get(), UCAL_YEAR, &status);
CHECK_ICU_CALENDAR()
ucal_set(newCal.get(), UCAL_YEAR, o + duration.years());
ucal_add(newCal.get(), UCAL_YEAR, duration.years(), &status);
check = ucal_get(newCal.get(), UCAL_YEAR, &status);
CHECK_ICU_CALENDAR()
if (check != (o + duration.years())) {
if (check < (y + duration.years())) {
if (overflow == TemporalOverflowOption::Reject) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
}
}
o = ucal_get(newCal.get(), UCAL_ORDINAL_MONTH, &status);
CHECK_ICU_CALENDAR()
ucal_set(newCal.get(), UCAL_ORDINAL_MONTH, o + duration.months());
check = ucal_get(newCal.get(), UCAL_ORDINAL_MONTH, &status);
CHECK_ICU_CALENDAR()
if (check != (o + duration.months())) {
if (overflow == TemporalOverflowOption::Reject) {
// align leap month if possible
if (calendar.hasLeapMonths() && isAnnotherCaseOfCalendarsItHasLeapMonth) {
auto newMc = calendar.monthCode(state, newCal.get());
if (newMc != mc) {
if (overflow == TemporalOverflowOption::Reject) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
}
mc.isLeapMonth = false;
CalendarFieldsRecord fields;
fields.day = d;
fields.monthCode = mc;
setICUMonthDay(state, calendar, fields, newCal.get(), overflow);
}
} else if (isHebrewRejectCase) {
auto newMc = calendar.monthCode(state, newCal.get());
if (newMc != mc) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
}
}
o = ucal_get(newCal.get(), UCAL_DAY_OF_MONTH, &status);
CHECK_ICU_CALENDAR()
ucal_set(newCal.get(), UCAL_DAY_OF_MONTH, o + duration.days());
ucal_add(newCal.get(), UCAL_ORDINAL_MONTH, duration.months(), &status);
if (!calendar.hasLeapMonths()) {
check = calendar.ordinalMonth(state, newCal.get());
if (check < (m + duration.months())) {
if (overflow == TemporalOverflowOption::Reject) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
}
}
}
CHECK_ICU_CALENDAR()
ucal_add(newCal.get(), UCAL_DAY_OF_MONTH, duration.days(), &status);
check = ucal_get(newCal.get(), UCAL_DAY_OF_MONTH, &status);
CHECK_ICU_CALENDAR()
if (check != (o + duration.days())) {
if (check < (d + duration.days())) {
if (overflow == TemporalOverflowOption::Reject) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
}

View file

@ -55,6 +55,20 @@ T intFloor(T x, int64_t y)
}
}
struct MonthCode {
unsigned monthNumber = 0;
bool isLeapMonth = false;
bool operator==(const MonthCode& src) const
{
return monthNumber == src.monthNumber && isLeapMonth == src.isLeapMonth;
}
bool operator!=(const MonthCode& src) const
{
return !operator==(src);
}
};
// https://github.com/tc39/proposal-intl-era-monthcode
class Calendar {
public:
@ -123,9 +137,6 @@ public:
// icu4c base year of chinese, dangi, roc are differ with icu4x
int diffYearDueToICU4CAndSpecDiffer() const;
// in icu4c, hebrew calendar needs UCAL_ORIDINAL_CODE for everywhere
UCalendarDateFields icuNonOridnalMonthCode() const;
static Optional<Calendar> fromString(ISO8601::CalendarID);
static Optional<Calendar> fromString(String* str);
String* toString() const;
@ -140,6 +151,13 @@ public:
int32_t eraYear(ExecutionState& state, UCalendar* calendar);
String* era(ExecutionState& state, UCalendar* calendar);
void setOrdinalMonth(UCalendar* calendar, int32_t month);
void setMonth(UCalendar* calendar, MonthCode mc);
int32_t ordinalMonth(ExecutionState& state, UCalendar* calendar);
MonthCode monthCode(ExecutionState& state, UCalendar* calendar);
bool inLeapMonth(ExecutionState& state, UCalendar* calendar);
private:
UCalendar* createICUCalendar(ExecutionState& state, const std::string& name);
ID m_id;
@ -217,11 +235,6 @@ inline TemporalUnit toTemporalUnit(ISO8601::DateTimeUnit u)
return static_cast<TemporalUnit>(u);
}
struct MonthCode {
unsigned monthNumber = 0;
bool isLeapMonth = false;
};
#define CALENDAR_FIELD_RECORDS(F) \
F(era, Era, Optional<String*>) \
F(eraYear, EraYear, Optional<int>) \

View file

@ -49,25 +49,25 @@ TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object*
m_icuCalendar = calendar.createICUCalendar(state);
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateObject* self = (TemporalPlainDateObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
UErrorCode status = U_ZERO_ERROR;
ucal_setMillis(m_icuCalendar, ISO8601::ExactTime::fromPlainDate(isoDate).floorEpochMilliseconds(), &status);
CHECK_ICU()
if (!calendar.isISO8601()) {
auto y = calendar.year(state, m_icuCalendar);
auto m = ucal_get(m_icuCalendar, UCAL_ORDINAL_MONTH, &status) + 1;
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
*m_plainDate = ISO8601::PlainDate(y, m, d);
}
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateObject* self = (TemporalPlainDateObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
}
TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object* proto, std::pair<UCalendar*, Optional<ISO8601::PlainDate>> fieldResolveResult, Calendar calendar, bool checkBoundery)
@ -76,13 +76,19 @@ TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object*
, m_calendarID(calendar)
, m_icuCalendar(fieldResolveResult.first)
{
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateObject* self = (TemporalPlainDateObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
if (fieldResolveResult.second) {
*m_plainDate = fieldResolveResult.second.value();
} else {
UErrorCode status = U_ZERO_ERROR;
auto y = calendar.year(state, m_icuCalendar);
auto m = ucal_get(m_icuCalendar, UCAL_ORDINAL_MONTH, &status) + 1;
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
@ -93,16 +99,9 @@ TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object*
if (checkBoundery) {
auto isoDate = computeISODate(state);
if (!ISO8601::isoDateTimeWithinLimits(isoDate.year(), isoDate.month(), isoDate.day())) {
ucal_close(m_icuCalendar);
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid date");
}
}
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateObject* self = (TemporalPlainDateObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
}
TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object* proto, UCalendar* icuCalendar, Calendar calendar)
@ -111,21 +110,21 @@ TemporalPlainDateObject::TemporalPlainDateObject(ExecutionState& state, Object*
, m_calendarID(calendar)
, m_icuCalendar(icuCalendar)
{
UErrorCode status = U_ZERO_ERROR;
auto y = calendar.year(state, m_icuCalendar);
auto m = ucal_get(m_icuCalendar, UCAL_ORDINAL_MONTH, &status) + 1;
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
*m_plainDate = ISO8601::PlainDate(y, m, d);
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateObject* self = (TemporalPlainDateObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
UErrorCode status = U_ZERO_ERROR;
auto y = calendar.year(state, m_icuCalendar);
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
*m_plainDate = ISO8601::PlainDate(y, m, d);
}
ISO8601::PlainDate TemporalPlainDateObject::computeISODate(ExecutionState& state)
@ -313,7 +312,7 @@ Value TemporalPlainDateGetter::daysInMonth(ExecutionState& state, ISO8601::Plain
});
CHECK_ICU()
int dayCount = 20;
int dayCount = 5;
ucal_set(newCal.get(), UCAL_DAY_OF_MONTH, dayCount);
for (;; dayCount++) {
ucal_set(newCal.get(), UCAL_DAY_OF_MONTH, dayCount);
@ -355,18 +354,17 @@ Value TemporalPlainDateGetter::monthsInYear(ExecutionState& state, ISO8601::Plai
});
CHECK_ICU()
ucal_set(newCal.get(), UCAL_ORDINAL_MONTH, 0);
ucal_set(newCal.get(), UCAL_DAY_OF_MONTH, 1);
int monthCount;
for (monthCount = 0;; monthCount++) {
ucal_set(newCal.get(), UCAL_ORDINAL_MONTH, monthCount);
if (ucal_get(newCal.get(), UCAL_ORDINAL_MONTH, &status) != monthCount) {
for (monthCount = 1;; monthCount++) {
calendarID.setOrdinalMonth(newCal.get(), monthCount);
if (calendarID.ordinalMonth(state, newCal.get()) != monthCount) {
CHECK_ICU()
break;
}
}
return Value(monthCount);
return Value(monthCount - 1);
}
Value TemporalPlainDateGetter::inLeapYear(ExecutionState& state, ISO8601::PlainDate plainDate, Calendar calendarID, UCalendar* icuCalendar)
@ -411,22 +409,17 @@ Value TemporalPlainDateGetter::monthCode(ExecutionState& state, ISO8601::PlainDa
StringBuilder sb;
sb.appendChar('M');
UErrorCode status = U_ZERO_ERROR;
auto mc = calendarID.monthCode(state, icuCalendar);
auto m = ucal_get(icuCalendar, calendarID.icuNonOridnalMonthCode(), &status) + 1;
CHECK_ICU()
if (m < 10) {
if (mc.monthNumber < 10) {
sb.appendChar('0');
} else {
sb.appendChar('1');
}
sb.appendChar(static_cast<char>('0' + (m % 10)));
sb.appendChar(static_cast<char>('0' + (mc.monthNumber % 10)));
auto s = ucal_get(icuCalendar, UCAL_IS_LEAP_MONTH, &status);
CHECK_ICU()
if (s) {
if (mc.isLeapMonth) {
sb.appendChar('L');
}

View file

@ -58,27 +58,46 @@ namespace Escargot {
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "failed to get value from ICU calendar"); \
}
TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, ISO8601::PlainDate plainDate, ISO8601::PlainTime plainTime, Calendar calendar)
TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, ISO8601::PlainDate isoDate, ISO8601::PlainTime plainTime, Calendar calendar)
: DerivedObject(state, proto)
, m_plainDateTime(new(PointerFreeGC) ISO8601::PlainDateTime(plainDate, plainTime))
, m_plainDateTime(new(PointerFreeGC) ISO8601::PlainDateTime(isoDate, plainTime))
, m_calendarID(calendar)
{
if (!ISO8601::isDateTimeWithinLimits(plainDate.year(), plainDate.month(), plainDate.day(),
if (!ISO8601::isDateTimeWithinLimits(isoDate.year(), isoDate.month(), isoDate.day(),
plainTime.hour(), plainTime.minute(), plainTime.second(), plainTime.microsecond(), plainTime.microsecond(), plainTime.nanosecond())) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid date-time");
}
m_icuCalendar = calendar.createICUCalendar(state);
UErrorCode status = U_ZERO_ERROR;
ucal_setMillis(m_icuCalendar, ISO8601::ExactTime::fromPlainDateTime(ISO8601::PlainDateTime(plainDate, plainTime)).floorEpochMilliseconds(), &status);
CHECK_ICU()
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateTimeObject* self = (TemporalPlainDateTimeObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
UErrorCode status = U_ZERO_ERROR;
ucal_setMillis(m_icuCalendar, ISO8601::ExactTime::fromPlainDateTime(ISO8601::PlainDateTime(isoDate, plainTime)).floorEpochMilliseconds(), &status);
CHECK_ICU()
if (!calendar.isISO8601()) {
auto y = calendar.year(state, m_icuCalendar);
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
auto h = ucal_get(m_icuCalendar, UCAL_HOUR_OF_DAY, &status);
CHECK_ICU()
auto mm = ucal_get(m_icuCalendar, UCAL_MINUTE, &status);
CHECK_ICU()
auto s = ucal_get(m_icuCalendar, UCAL_SECOND, &status);
CHECK_ICU()
auto ms = ucal_get(m_icuCalendar, UCAL_MILLISECOND, &status);
CHECK_ICU()
*m_plainDateTime = ISO8601::PlainDateTime(ISO8601::PlainDate(y, m, d), plainTime);
}
}
TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, UCalendar* icuCalendar, unsigned underMicrosecondValue, Calendar calendar)
@ -87,11 +106,17 @@ TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state,
, m_calendarID(calendar)
, m_icuCalendar(icuCalendar)
{
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateTimeObject* self = (TemporalPlainDateTimeObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
ASSERT(underMicrosecondValue < 1000 * 1000);
UErrorCode status = U_ZERO_ERROR;
auto y = calendar.year(state, m_icuCalendar);
auto m = ucal_get(m_icuCalendar, UCAL_ORDINAL_MONTH, &status) + 1;
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
@ -106,12 +131,6 @@ TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state,
CHECK_ICU()
*m_plainDateTime = ISO8601::PlainDateTime(ISO8601::PlainDate(y, m, d), ISO8601::PlainTime(h, mm, s, ms, underMicrosecondValue / 1000, underMicrosecondValue % 1000));
addFinalizer([](PointerValue* obj, void* data) {
TemporalPlainDateTimeObject* self = (TemporalPlainDateTimeObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
}
String* TemporalPlainDateTimeObject::toString(ExecutionState& state, Value options)

View file

@ -28,7 +28,7 @@ namespace Escargot {
class TemporalPlainDateTimeObject : public DerivedObject {
public:
TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, ISO8601::PlainDate plainDate, ISO8601::PlainTime plainTime, Calendar calendar);
TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, ISO8601::PlainDate isoDate, ISO8601::PlainTime plainTime, Calendar calendar);
TemporalPlainDateTimeObject(ExecutionState& state, Object* proto, UCalendar* icuCalendar, unsigned underMicrosecondValue, Calendar calendar);
virtual bool isTemporalPlainDateTimeObject() const override

View file

@ -224,14 +224,14 @@ TemporalPlainYearMonthObject* TemporalPlainYearMonthObject::addDurationToYearMon
// Let date be BalanceISODate(nextMonth.[[Year]], nextMonth.[[Month]], nextMonth.[[Day]] - 1).
UErrorCode status = U_ZERO_ERROR;
auto year = calendar.year(state, nextMonth);
auto month = ucal_get(nextMonth, UCAL_ORDINAL_MONTH, &status) + 1;
auto month = calendar.ordinalMonth(state, nextMonth);
CHECK_ICU();
auto day = ucal_get(nextMonth, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU();
auto balancedDate = Temporal::balanceISODate(state, year, month, day - 1);
// Assert: ISODateWithinLimits(date) is true.
calendar.setYear(state, nextMonth, balancedDate.year());
ucal_set(nextMonth, UCAL_ORDINAL_MONTH, balancedDate.month() - 1);
calendar.setOrdinalMonth(nextMonth, balancedDate.month());
ucal_set(nextMonth, UCAL_DAY_OF_MONTH, balancedDate.day());
date.reset(nextMonth);

View file

@ -69,7 +69,6 @@ void TemporalZonedDateTimeObject::init(ExecutionState& state, ComputedTimeZone t
{
m_timeZone = timeZone;
Int128 timezoneAppliedEpochNanoseconds = *m_epochNanoseconds + timeZone.offset();
*m_plainDateTime = Temporal::toPlainDateTime(timezoneAppliedEpochNanoseconds);
if (!ISO8601::isValidEpochNanoseconds(*m_epochNanoseconds)) {
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Out of range date-time");
@ -77,6 +76,12 @@ void TemporalZonedDateTimeObject::init(ExecutionState& state, ComputedTimeZone t
m_icuCalendar = m_calendarID.createICUCalendar(state);
addFinalizer([](PointerValue* obj, void* data) {
TemporalZonedDateTimeObject* self = (TemporalZonedDateTimeObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
UErrorCode status = U_ZERO_ERROR;
ucal_setMillis(m_icuCalendar, ISO8601::ExactTime(*m_epochNanoseconds).floorEpochMilliseconds(), &status);
CHECK_ICU()
@ -85,11 +90,28 @@ void TemporalZonedDateTimeObject::init(ExecutionState& state, ComputedTimeZone t
ucal_setTimeZone(m_icuCalendar, tz.data(), tz.length(), &status);
CHECK_ICU()
addFinalizer([](PointerValue* obj, void* data) {
TemporalZonedDateTimeObject* self = (TemporalZonedDateTimeObject*)obj;
ucal_close(self->m_icuCalendar);
},
nullptr);
auto calendar = calendarID();
if (calendar.isISO8601()) {
*m_plainDateTime = Temporal::toPlainDateTime(timezoneAppliedEpochNanoseconds);
} else {
int64_t underMicrosecondValue = int64_t(timezoneAppliedEpochNanoseconds % 1000000);
auto y = calendar.year(state, m_icuCalendar);
auto m = calendar.ordinalMonth(state, m_icuCalendar);
CHECK_ICU()
auto d = ucal_get(m_icuCalendar, UCAL_DAY_OF_MONTH, &status);
CHECK_ICU()
auto h = ucal_get(m_icuCalendar, UCAL_HOUR_OF_DAY, &status);
CHECK_ICU()
auto mm = ucal_get(m_icuCalendar, UCAL_MINUTE, &status);
CHECK_ICU()
auto s = ucal_get(m_icuCalendar, UCAL_SECOND, &status);
CHECK_ICU()
auto ms = ucal_get(m_icuCalendar, UCAL_MILLISECOND, &status);
CHECK_ICU()
*m_plainDateTime = ISO8601::PlainDateTime(ISO8601::PlainDate(y, m, d), ISO8601::PlainTime(h, mm, s, ms, underMicrosecondValue / 1000, underMicrosecondValue % 1000));
}
}
TemporalZonedDateTimeObject::TemporalZonedDateTimeObject(ExecutionState& state, Object* proto, Int128 epochNanoseconds, TimeZone timeZone, Calendar calendar)

View file

@ -413,60 +413,12 @@
<test id="intl402/Temporal/PlainDate/from/calc-epoch-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/extreme-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/hebrew-keviah"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/invalid-month-codes-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/islamic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/islamic-rgsa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/from/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/add/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/daysInMonth/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/inLeapYear/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/inLeapYear/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/monthCode/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/monthCode/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/monthsInYear/chinese-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/monthsInYear/dangi-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/since/basic-chinese"><reason>TODO</reason></test>
@ -506,52 +458,7 @@
<test id="intl402/Temporal/PlainDate/prototype/since/wrapping-at-end-of-month-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/since/wrapping-at-end-of-month-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/since/wrapping-at-end-of-month-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/subtract/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/toZonedDateTime/dst-skipped-cross-midnight"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/until/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/until/basic-coptic"><reason>TODO</reason></test>
@ -647,92 +554,13 @@
<test id="intl402/Temporal/PlainDate/prototype/with/wrapping-at-end-of-month-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/withCalendar/extreme-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDate/prototype/year/epoch-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/calendar-not-supporting-eras"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/extreme-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/from-iso-string-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/invalid-month-codes-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/islamic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/islamic-rgsa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/non-positive-single-era-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/basic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/proleptic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/add/proleptic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/daysInMonth/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/inLeapYear/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/inLeapYear/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/monthCode/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/monthCode/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/monthCode/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/monthsInYear/chinese-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/monthsInYear/dangi-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/since/basic-chinese"><reason>TODO</reason></test>
@ -772,70 +600,7 @@
<test id="intl402/Temporal/PlainDateTime/prototype/since/wrapping-at-end-of-month-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/since/wrapping-at-end-of-month-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/since/wrapping-at-end-of-month-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/basic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/proleptic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/subtract/proleptic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/dst-disambiguation"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/order-of-operations"><reason>TODO</reason></test>
@ -905,7 +670,6 @@
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-ethiopic"><reason>TODO</reason></test>
@ -913,7 +677,6 @@
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/mutually-exclusive-fields-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/mutually-exclusive-fields-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/mutually-exclusive-fields-coptic"><reason>TODO</reason></test>
@ -934,7 +697,6 @@
<test id="intl402/Temporal/PlainDateTime/prototype/with/wrapping-at-end-of-month-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/wrapping-at-end-of-month-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/withCalendar/extreme-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/year/arithmetic-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/year/epoch-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/calendarresolvefields-error-ordering-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainMonthDay/from/calendarresolvefields-error-ordering-hebrew"><reason>TODO</reason></test>
@ -956,7 +718,6 @@
<test id="intl402/Temporal/PlainYearMonth/prototype/inLeapYear/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/monthCode/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/monthCode/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/monthCode/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/monthsInYear/chinese-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/monthsInYear/dangi-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/since/canonicalize-calendar"><reason>TODO</reason></test>
@ -967,95 +728,18 @@
<test id="intl402/Temporal/PlainYearMonth/prototype/until/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/with/non-iso-calendar-fields"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainYearMonth/prototype/year/epoch-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/canonicalize-era-codes"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/dst-skipped-cross-midnight"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/extreme-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/from-iso-string-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/invalid-month-codes-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/islamic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/islamic-rgsa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/from/non-positive-single-era-year"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/basic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/proleptic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/add/proleptic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/daysInMonth/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/nanoseconds-subtracted-or-added-at-dst-transition"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/hoursInDay/dst-skipped-cross-midnight"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/inLeapYear/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/inLeapYear/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/monthCode/chinese-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/monthCode/dangi-calendar-dates"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/monthCode/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/monthsInYear/chinese-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/monthsInYear/dangi-calendar-leap-days"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/round/dst-skipped-cross-midnight"><reason>TODO</reason></test>
@ -1097,70 +781,7 @@
<test id="intl402/Temporal/ZonedDateTime/prototype/since/wrapping-at-end-of-month-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/since/wrapping-at-end-of-month-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/startOfDay/dst-skipped-cross-midnight"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/basic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/constrain-day-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/era-boundary-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-persian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-ethiopic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-gregory"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-islamic-umalqura"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/month-boundary-japanese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/proleptic-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/subtract/proleptic-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/until/basic-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/until/basic-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/until/basic-dangi"><reason>TODO</reason></test>
@ -1227,7 +848,6 @@
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-months-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-months-dangi"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-months-hebrew"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-coptic"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-ethioaa"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-ethiopic"><reason>TODO</reason></test>
@ -1235,7 +855,6 @@
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-indian"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-islamic-civil"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-islamic-tbla"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/leap-year-roc"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/mutually-exclusive-fields-buddhist"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/mutually-exclusive-fields-chinese"><reason>TODO</reason></test>
<test id="intl402/Temporal/ZonedDateTime/prototype/with/mutually-exclusive-fields-coptic"><reason>TODO</reason></test>
@ -1865,7 +1484,6 @@
<test id="staging/Intl402/Temporal/old/zoneddatetime-dst-corner-cases"><reason>TODO</reason></test>
<test id="staging/Temporal/v8/duration-constructor"><reason>TODO</reason></test>
<test id="staging/Temporal/v8/duration-to-json-boundary-cases"><reason>TODO</reason></test>
<test id="staging/Temporal/v8/plain-date-time-with-plain-time"><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>
<test id="staging/built-ins/Reflect/preventExtensions/preventExtensions-variable-length-typed-arrays"><reason>TODO</reason></test>