Implement Temporal.PlainDateTime.{ equals, round }

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-10-21 09:57:28 +09:00 committed by Patrick Kim
commit 5e5eb5d631
7 changed files with 154 additions and 110 deletions

View file

@ -734,6 +734,18 @@ static Value builtinTemporalPlainDateTimeUntil(ExecutionState& state, Value this
return new TemporalDurationObject(state, plainDateTime->differenceTemporalPlainDateTime(state, TemporalPlainDateTimeObject::DifferenceTemporalPlainDateTime::Until, argv[0], argc > 1 ? argv[1] : Value()));
}
static Value builtinTemporalPlainDateTimeRound(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME2(plainDateTime, round);
return plainDateTime->round(state, argv[0]);
}
static Value builtinTemporalPlainDateTimeEquals(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME(plainDateTime, Equals);
return Value(plainDateTime->equals(state, argv[0]));
}
static Value builtinTemporalPlainYearMonthConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
// If NewTarget is undefined, throw a TypeError exception.
@ -1305,7 +1317,8 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySubtract()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySubtract(), builtinTemporalPlainDateTimeSubtract, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyUntil()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyUntil(), builtinTemporalPlainDateTimeUntil, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySince()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySince(), builtinTemporalPlainDateTimeSince, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->round), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->round, builtinTemporalPlainDateTimeRound, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyEquals()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyEquals(), builtinTemporalPlainDateTimeEquals, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
{
AtomicString name(state.context(), "get calendarId");

View file

@ -2855,6 +2855,44 @@ ISO8601::InternalDuration Temporal::differenceISODateTime(ExecutionState& state,
return ISO8601::InternalDuration(dateDifference, timeDuration);
}
static void incrementDay(ISO8601::Duration& duration)
{
double year = duration.years();
double month = duration.months();
double day = duration.days();
double daysInMonth = ISO8601::daysInMonth(year, month);
if (day < daysInMonth) {
duration.setDays(day + 1);
return;
}
duration.setDays(1);
if (month < 12) {
duration.setMonths(month + 1);
return;
}
duration.setMonths(1);
duration.setYears(year + 1);
}
ISO8601::PlainDateTime Temporal::roundISODateTime(ExecutionState& state, ISO8601::PlainDateTime isoDateTime, unsigned increment, ISO8601::DateTimeUnit sunit, ISO8601::RoundingMode roundingMode)
{
auto roundedResult = TemporalPlainTimeObject::roundTime(state, isoDateTime.plainTime(), increment, sunit, roundingMode);
auto plainTime = TemporalPlainTimeObject::toPlainTime(state, roundedResult);
double extraDays = roundedResult.days();
roundedResult.setYears(isoDateTime.plainDate().year());
roundedResult.setMonths(isoDateTime.plainDate().month());
roundedResult.setDays(isoDateTime.plainDate().day());
if (extraDays) {
ASSERT(extraDays == 1);
incrementDay(roundedResult);
}
auto plainDate = TemporalPlainDateObject::toPlainDate(state, roundedResult);
return ISO8601::PlainDateTime(plainDate, plainTime);
}
} // namespace Escargot
#endif

View file

@ -407,6 +407,9 @@ public:
// https://tc39.es/proposal-temporal/#sec-temporal-differenceisodatetime
static ISO8601::InternalDuration differenceISODateTime(ExecutionState& state, ISO8601::PlainDateTime isoDateTime1, ISO8601::PlainDateTime isoDateTime2, Calendar calendar, ISO8601::DateTimeUnit largestUnit);
// https://tc39.es/proposal-temporal/#sec-temporal-roundisodatetime
static ISO8601::PlainDateTime roundISODateTime(ExecutionState& state, ISO8601::PlainDateTime isoDateTime, unsigned increment, ISO8601::DateTimeUnit sunit, ISO8601::RoundingMode roundingMode);
};
} // namespace Escargot

View file

@ -119,28 +119,6 @@ TemporalPlainDateTimeObject::TemporalPlainDateTimeObject(ExecutionState& state,
nullptr);
}
static void incrementDay(ISO8601::Duration& duration)
{
double year = duration.years();
double month = duration.months();
double day = duration.days();
double daysInMonth = ISO8601::daysInMonth(year, month);
if (day < daysInMonth) {
duration.setDays(day + 1);
return;
}
duration.setDays(1);
if (month < 12) {
duration.setMonths(month + 1);
return;
}
duration.setMonths(1);
duration.setYears(year + 1);
}
String* TemporalPlainDateTimeObject::toString(ExecutionState& state, Value options)
{
// Let resolvedOptions be ? GetOptionsObject(options).
@ -163,23 +141,13 @@ String* TemporalPlainDateTimeObject::toString(ExecutionState& state, Value optio
// Let precision be ToSecondsStringPrecisionRecord(smallestUnit, digits).
auto precision = Temporal::toSecondsStringPrecisionRecord(state, toDateTimeUnit(smallestUnit), digits);
// Let result be RoundISODateTime(plainDateTime.[[ISODateTime]], precision.[[Increment]], precision.[[Unit]], roundingMode).
auto result = Temporal::roundISODateTime(state, ISO8601::PlainDateTime(computeISODate(state), plainTime()), precision.increment, precision.unit, roundingMode);
// If ISODateTimeWithinLimits(result) is false, throw a RangeError exception.
auto roundedResult = TemporalPlainTimeObject::roundTime(state, m_plainDateTime->plainTime(), precision.increment, precision.unit, roundingMode);
auto plainTime = TemporalPlainTimeObject::toPlainTime(state, roundedResult);
double extraDays = roundedResult.days();
roundedResult.setYears(m_plainDateTime->plainDate().year());
roundedResult.setMonths(m_plainDateTime->plainDate().month());
roundedResult.setDays(m_plainDateTime->plainDate().day());
if (extraDays) {
ASSERT(extraDays == 1);
incrementDay(roundedResult);
}
auto plainDate = TemporalPlainDateObject::toPlainDate(state, roundedResult);
// Return ISODateTimeToString(result, plainDateTime.[[Calendar]], precision.[[Precision]], showCalendar).
StringBuilder sb;
sb.appendString(TemporalPlainDateObject::temporalDateToString(plainDate, m_calendarID, showCalendar));
sb.appendString(TemporalPlainDateObject::temporalDateToString(result.plainDate(), m_calendarID, showCalendar));
sb.appendChar('T');
sb.appendString(TemporalPlainTimeObject::temporalTimeToString(plainTime, precision.precision));
sb.appendString(TemporalPlainTimeObject::temporalTimeToString(result.plainTime(), precision.precision));
return sb.finalize();
}
@ -327,6 +295,86 @@ ISO8601::Duration TemporalPlainDateTimeObject::differenceTemporalPlainDateTime(E
return result;
}
TemporalPlainDateTimeObject* TemporalPlainDateTimeObject::round(ExecutionState& state, Value roundToInput)
{
Optional<Object*> roundTo;
// If roundTo is undefined, then
if (roundToInput.isUndefined()) {
// Throw a TypeError exception.
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid roundTo value");
} else if (roundToInput.isString()) {
// If roundTo is a String, then
// Let paramString be roundTo.
// Set roundTo to OrdinaryObjectCreate(null).
// Perform ! CreateDataPropertyOrThrow(roundTo, "smallestUnit", paramString).
roundTo = new Object(state, Object::PrototypeIsNull);
roundTo->directDefineOwnProperty(state, state.context()->staticStrings().lazySmallestUnit(),
ObjectPropertyDescriptor(roundToInput, ObjectPropertyDescriptor::AllPresent));
} else {
// Else,
// Set roundTo to ? GetOptionsObject(roundTo).
roundTo = Intl::getOptionsObject(state, roundToInput);
}
// NOTE: The following steps read options and perform independent validation in alphabetical order (GetRoundingIncrementOption reads "roundingIncrement" and GetRoundingModeOption reads "roundingMode").
// Let roundingIncrement be ? GetRoundingIncrementOption(roundTo).
auto roundingIncrement = Temporal::getRoundingIncrementOption(state, roundTo);
// Let roundingMode be ? GetRoundingModeOption(roundTo, half-expand).
auto roundingMode = Temporal::getRoundingModeOption(state, roundTo, state.context()->staticStrings().lazyHalfExpand().string());
// Let smallestUnit be ? GetTemporalUnitValuedOption(roundTo, "smallestUnit", required).
auto smallestUnit = Temporal::getTemporalUnitValuedOption(state, roundTo,
state.context()->staticStrings().lazySmallestUnit().string(), Value(Value::EmptyValue));
// Perform ? ValidateTemporalUnitValue(smallestUnit, time, « day »).
TemporalUnit extraValues[1] = { TemporalUnit::Day };
Temporal::validateTemporalUnitValue(state, smallestUnit, ISO8601::DateTimeUnitCategory::Time, extraValues, 1);
Optional<unsigned> maximum;
bool inclusive;
// If smallestUnit is day, then
if (smallestUnit == TemporalUnit::Day) {
// Let maximum be 1.
maximum = 1;
// Let inclusive be true.
inclusive = true;
} else {
// Else,
// Let maximum be MaximumTemporalDurationRoundingIncrement(smallestUnit).
maximum = Temporal::maximumTemporalDurationRoundingIncrement(toDateTimeUnit(smallestUnit.value()));
// Assert: maximum is not unset.
// Let inclusive be false.
inclusive = false;
}
// Perform ? ValidateTemporalRoundingIncrement(roundingIncrement, maximum, inclusive).
Temporal::validateTemporalRoundingIncrement(state, roundingIncrement, maximum.value(), inclusive);
// If smallestUnit is nanosecond and roundingIncrement = 1, then
if (smallestUnit == TemporalUnit::Nanosecond && roundingIncrement == 1) {
// Return ! CreateTemporalDateTime(plainDateTime.[[ISODateTime]], plainDateTime.[[Calendar]]).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(), computeISODate(state), plainTime(), calendarID());
}
// Let result be RoundISODateTime(plainDateTime.[[ISODateTime]], roundingIncrement, smallestUnit, roundingMode).
auto result = Temporal::roundISODateTime(state, ISO8601::PlainDateTime(computeISODate(state), plainTime()), roundingIncrement, toDateTimeUnit(smallestUnit).value(), roundingMode);
// Return ? CreateTemporalDateTime(result, plainDateTime.[[Calendar]]).
return new TemporalPlainDateTimeObject(state, state.context()->globalObject()->temporalPlainDateTimePrototype(), result.plainDate(), result.plainTime(), calendarID());
}
bool TemporalPlainDateTimeObject::equals(ExecutionState& state, Value otherInput)
{
// Set other to ? ToTemporalDateTime(other).
auto other = Temporal::toTemporalDateTime(state, otherInput, Value());
// If CompareISODateTime(plainDateTime.[[ISODateTime]], other.[[ISODateTime]]) ≠ 0, return false.
auto isoDateTime1 = computeISODate(state);
auto isoDateTime2 = other->computeISODate(state);
if (isoDateTime1 != isoDateTime2 || plainTime() != other->plainTime()) {
return false;
}
// Return CalendarEquals(plainDateTime.[[Calendar]], other.[[Calendar]]).
return calendarID() == other->calendarID();
}
} // namespace Escargot
#endif

View file

@ -137,6 +137,12 @@ public:
};
ISO8601::Duration differenceTemporalPlainDateTime(ExecutionState& state, DifferenceTemporalPlainDateTime operation, Value other, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.round
TemporalPlainDateTimeObject* round(ExecutionState& state, Value roundToInput);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.equals
bool equals(ExecutionState& state, Value otherInput);
private:
ISO8601::PlainDateTime* m_plainDateTime;
Calendar m_calendarID;

View file

@ -408,6 +408,11 @@ public:
&& m_microsecond == other.m_microsecond && m_nanosecond == other.m_nanosecond;
}
bool operator!=(const PlainTime& other) const
{
return !operator==(other);
}
private:
uint8_t m_hour{ 0 };
uint8_t m_minute{ 0 };
@ -465,6 +470,11 @@ public:
&& m_day == other.m_day;
}
bool operator!=(const PlainDate& other) const
{
return !operator==(other);
}
// https://tc39.es/proposal-temporal/#sec-temporal-compareisodate
int compare(const PlainDate& other) const
{

View file

@ -575,85 +575,14 @@
<test id="built-ins/Temporal/PlainDateTime/compare/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/compare/use-internal-slots"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/compare/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/datetime-math"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/from/overflow-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-plaindate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-invalid-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-iso-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-calendar-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-critical-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-date-with-utc-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-minus-sign"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-multiple-calendar"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-multiple-time-zone"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-separators"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-time-zone-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-unknown-annotation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-string-with-utc-designator"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/calendar-temporal-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/cast"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/equals/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/balance"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-nan"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-non-integer"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-out-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-expand"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfCeil"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfEven"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfExpand"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfFloor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfTrunc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-plurals-accepted"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-string-shorthand"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/subclassing-ignored"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/since/argument-plaindate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/since/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/since/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
@ -1654,9 +1583,6 @@
<test id="intl402/Temporal/PlainDateTime/compare/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/calendar-not-supporting-eras"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/from/canonicalize-era-codes"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/equals/calendar-checked"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/equals/canonicalize-calendar"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/equals/infinity-throws-rangeerror"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/calendar-mismatch"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/dateStyle"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/dateStyle-timeStyle-undefined"><reason>TODO</reason></test>