mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-22 10:01:50 +00:00
Implement Temporal.PlainTime.{ toString, add, subtract, from }
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
parent
84a305785a
commit
d7c2db8f3f
9 changed files with 486 additions and 124 deletions
|
|
@ -352,6 +352,54 @@ static Value builtinTemporalPlainTimeFrom(ExecutionState& state, Value thisValue
|
|||
return TemporalPlainTimeObject::toTemporalTime(state, argv[0], argc > 1 ? argv[1] : Value());
|
||||
}
|
||||
|
||||
#define RESOLVE_THIS_BINDING_TO_PLAINTIME(NAME, BUILT_IN_METHOD) \
|
||||
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainTimeObject()) { \
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainTime().string(), true, state.context()->staticStrings().lazy##BUILT_IN_METHOD().string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \
|
||||
} \
|
||||
TemporalPlainTimeObject* NAME = thisValue.asObject()->asTemporalPlainTimeObject();
|
||||
|
||||
#define RESOLVE_THIS_BINDING_TO_PLAINTIME2(NAME, BUILT_IN_METHOD) \
|
||||
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainTimeObject()) { \
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainTime().string(), true, state.context()->staticStrings().BUILT_IN_METHOD.string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \
|
||||
} \
|
||||
TemporalPlainTimeObject* NAME = thisValue.asObject()->asTemporalPlainTimeObject();
|
||||
|
||||
static Value builtinTemporalPlainTimeToString(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME2(plainTime, toString);
|
||||
return plainTime->toString(state, argc ? argv[0] : Value());
|
||||
}
|
||||
|
||||
static Value builtinTemporalPlainTimeToJSON(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME2(plainTime, toJSON);
|
||||
return plainTime->toString(state, Value());
|
||||
}
|
||||
|
||||
static Value builtinTemporalPlainTimeToLocaleString(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME2(plainTime, toLocaleString);
|
||||
return plainTime->toString(state, Value());
|
||||
}
|
||||
|
||||
static Value builtinTemporalPlainTimeWith(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME2(plainTime, with);
|
||||
return plainTime->with(state, argv[0], argc > 1 ? argv[1] : Value());
|
||||
}
|
||||
|
||||
static Value builtinTemporalPlainTimeAdd(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME2(plainTime, add);
|
||||
return plainTime->addDurationToTime(state, TemporalPlainTimeObject::AddDurationToTimeOperation::Add, argv[0]);
|
||||
}
|
||||
|
||||
static Value builtinTemporalPlainTimeSubtract(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
|
||||
{
|
||||
RESOLVE_THIS_BINDING_TO_PLAINTIME(plainTime, Subtract);
|
||||
return plainTime->addDurationToTime(state, TemporalPlainTimeObject::AddDurationToTimeOperation::Subtract, argv[0]);
|
||||
}
|
||||
|
||||
#define RESOLVE_THIS_BINDING_TO_PLAINDATE(NAME, BUILT_IN_METHOD) \
|
||||
if (!thisValue.isObject() || !thisValue.asObject()->isTemporalPlainDateObject()) { \
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, state.context()->staticStrings().lazyCapitalPlainDate().string(), true, state.context()->staticStrings().lazy##BUILT_IN_METHOD().string(), ErrorObject::Messages::GlobalObject_CalledOnIncompatibleReceiver); \
|
||||
|
|
@ -641,7 +689,13 @@ void GlobalObject::installTemporal(ExecutionState& state)
|
|||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(state.context()->vmInstance()->globalSymbols().toStringTag),
|
||||
ObjectPropertyDescriptor(Value(strings->lazyTemporalDotPlainTime().string()), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toString), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toString, builtinTemporalPlainTimeToString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toJSON), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toJSON, builtinTemporalPlainTimeToJSON, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->toLocaleString), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->toLocaleString, builtinTemporalPlainTimeToLocaleString, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->valueOf), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->valueOf, builtinTemporalAnyInstanceValueOf, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->with), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->with, builtinTemporalPlainTimeWith, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->add), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->add, builtinTemporalPlainTimeAdd, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
m_temporalPlainTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySubtract()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySubtract(), builtinTemporalPlainTimeSubtract, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
|
||||
|
||||
#define DEFINE_PLAINTIME_PROTOTYPE_GETTER_PROPERTY(name, stringName, Name) \
|
||||
{ \
|
||||
|
|
|
|||
|
|
@ -1,7 +1,30 @@
|
|||
#if defined(ENABLE_TEMPORAL)
|
||||
/*
|
||||
* Copyright (C) 2021 Sony Interactive Entertainment Inc.
|
||||
* Copyright (C) 2021-2023 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2021 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2022 Sony Interactive Entertainment Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2025-present Samsung Electronics Co., Ltd
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
|
|
@ -510,7 +533,7 @@ ISO8601::InternalDuration TemporalDurationObject::toInternalDurationRecordWith24
|
|||
// Set timeDuration to ! Add24HourDaysToTimeDuration(timeDuration, duration.[[Days]]).
|
||||
timeDuration = add24HourDaysToTimeDuration(state, timeDuration, duration.days());
|
||||
// Let dateDuration be ! CreateDateDurationRecord(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], 0).
|
||||
ISO8601::Duration dateDuration = ISO8601::Duration{ duration.years(), duration.months(), duration.weeks(), 0, 0, 0, 0, 0, 0, 0 };
|
||||
ISO8601::Duration dateDuration = ISO8601::Duration{ duration.years(), duration.months(), duration.weeks(), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
|
||||
return ISO8601::InternalDuration::combineDateAndTimeDuration(dateDuration, timeDuration);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,29 @@
|
|||
#if defined(ENABLE_TEMPORAL)
|
||||
/*
|
||||
* Copyright (C) 2021 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2022 Sony Interactive Entertainment Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2022-present Samsung Electronics Co., Ltd
|
||||
*
|
||||
|
|
@ -1071,6 +1096,99 @@ TemporalOverflowOption Temporal::getTemporalOverflowOption(ExecutionState& state
|
|||
return TemporalOverflowOption::Reject;
|
||||
}
|
||||
|
||||
bool Temporal::isPartialTemporalObject(ExecutionState& state, Value value)
|
||||
{
|
||||
// If value is not an Object, return false.
|
||||
if (!value.isObject()) {
|
||||
return false;
|
||||
}
|
||||
// TODO If value has an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], [[InitializedTemporalTime]],
|
||||
// [[InitializedTemporalYearMonth]], or [[InitializedTemporalZonedDateTime]] internal slot, return false.
|
||||
if (value.asObject()->isTemporalPlainTimeObject()) {
|
||||
return false;
|
||||
}
|
||||
// Let calendarProperty be ? Get(value, "calendar").
|
||||
Value calendarProperty = value.asObject()->get(state, state.context()->staticStrings().lazyCalendar()).value(state, value);
|
||||
// If calendarProperty is not undefined, return false.
|
||||
if (!calendarProperty.isUndefined()) {
|
||||
return false;
|
||||
}
|
||||
// Let timeZoneProperty be ? Get(value, "timeZone").
|
||||
Value timeZoneProperty = value.asObject()->get(state, state.context()->staticStrings().lazyTimeZone()).value(state, value);
|
||||
// If timeZoneProperty is not undefined, return false.
|
||||
if (!timeZoneProperty.isUndefined()) {
|
||||
return false;
|
||||
}
|
||||
// Return true.
|
||||
return true;
|
||||
}
|
||||
|
||||
static double nonNegativeModulo(double x, double y)
|
||||
{
|
||||
double result = std::fmod(x, y);
|
||||
if (!result)
|
||||
return 0;
|
||||
if (result < 0)
|
||||
result += y;
|
||||
return result;
|
||||
}
|
||||
|
||||
static double nonNegativeModulo(int64_t x, int64_t y)
|
||||
{
|
||||
int64_t result = x % y;
|
||||
if (!result)
|
||||
return 0;
|
||||
if (result < 0)
|
||||
result += y;
|
||||
return result;
|
||||
}
|
||||
|
||||
static int64_t int64Floor(int64_t x, int64_t y)
|
||||
{
|
||||
if (x > 0) {
|
||||
return x / y;
|
||||
}
|
||||
if (x % y) {
|
||||
return x / y - 1;
|
||||
} else {
|
||||
return x / y;
|
||||
}
|
||||
}
|
||||
|
||||
ISO8601::Duration Temporal::balanceTime(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond)
|
||||
{
|
||||
microsecond += std::floor(nanosecond / 1000);
|
||||
nanosecond = nonNegativeModulo(nanosecond, 1000);
|
||||
millisecond += std::floor(microsecond / 1000);
|
||||
microsecond = nonNegativeModulo(microsecond, 1000);
|
||||
second += std::floor(millisecond / 1000);
|
||||
millisecond = nonNegativeModulo(millisecond, 1000);
|
||||
minute += std::floor(second / 60);
|
||||
second = nonNegativeModulo(second, 60);
|
||||
hour += std::floor(minute / 60);
|
||||
minute = nonNegativeModulo(minute, 60);
|
||||
double days = std::floor(hour / 24);
|
||||
hour = nonNegativeModulo(hour, 24);
|
||||
return ISO8601::Duration({ 0.0, 0.0, 0.0, days, hour, minute, second, millisecond, microsecond, nanosecond });
|
||||
}
|
||||
|
||||
ISO8601::Duration Temporal::balanceTime(int64_t hour, int64_t minute, int64_t second, int64_t millisecond, int64_t microsecond, int64_t nanosecond)
|
||||
{
|
||||
microsecond += int64Floor(nanosecond, 1000);
|
||||
nanosecond = nonNegativeModulo(nanosecond, 1000);
|
||||
millisecond += int64Floor(microsecond, 1000);
|
||||
microsecond = nonNegativeModulo(microsecond, 1000);
|
||||
second += int64Floor(millisecond, 1000);
|
||||
millisecond = nonNegativeModulo(millisecond, 1000);
|
||||
minute += int64Floor(second, 60);
|
||||
second = nonNegativeModulo(second, 60);
|
||||
hour += int64Floor(minute, 60);
|
||||
minute = nonNegativeModulo(minute, 60);
|
||||
int64_t days = int64Floor(hour, 24);
|
||||
hour = nonNegativeModulo(hour, 24);
|
||||
return ISO8601::Duration({ int64_t(0), int64_t(0), int64_t(0), days, hour, minute, second, millisecond, microsecond, nanosecond });
|
||||
}
|
||||
|
||||
TemporalObject::TemporalObject(ExecutionState& state)
|
||||
: TemporalObject(state, state.context()->globalObject()->objectPrototype())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -386,6 +386,13 @@ public:
|
|||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal-gettemporaloverflowoption
|
||||
static TemporalOverflowOption getTemporalOverflowOption(ExecutionState& state, Optional<Object*> options);
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal-ispartialtemporalobject
|
||||
static bool isPartialTemporalObject(ExecutionState& state, Value value);
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal-balancetime
|
||||
static ISO8601::Duration balanceTime(double hour, double minute, double second, double millisecond, double microsecond, double nanosecond);
|
||||
static ISO8601::Duration balanceTime(int64_t hour, int64_t minute, int64_t second, int64_t millisecond, int64_t microsecond, int64_t nanosecond);
|
||||
};
|
||||
|
||||
class TemporalObject : public DerivedObject {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,29 @@
|
|||
#if defined(ENABLE_TEMPORAL)
|
||||
/*
|
||||
* Copyright (C) 2021 Apple Inc. All rights reserved.
|
||||
* Copyright (C) 2022 Sony Interactive Entertainment Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2025-present Samsung Electronics Co., Ltd
|
||||
*
|
||||
|
|
@ -20,6 +45,7 @@
|
|||
|
||||
#include "Escargot.h"
|
||||
#include "TemporalPlainTimeObject.h"
|
||||
#include "TemporalDurationObject.h"
|
||||
#include "intl/Intl.h"
|
||||
#include "util/ISO8601.h"
|
||||
|
||||
|
|
@ -174,6 +200,225 @@ ISO8601::PlainTime TemporalPlainTimeObject::regulateTime(ExecutionState& state,
|
|||
return ISO8601::PlainTime(hour, minute, second, millisecond, microsecond, nanosecond);
|
||||
}
|
||||
|
||||
ISO8601::Duration TemporalPlainTimeObject::roundTime(ExecutionState& state, ISO8601::PlainTime plainTime, double increment, ISO8601::DateTimeUnit unit, ISO8601::RoundingMode roundingMode)
|
||||
{
|
||||
auto fractionalSecond = [](ISO8601::PlainTime plainTime) -> double {
|
||||
return plainTime.second() + plainTime.millisecond() * 1e-3 + plainTime.microsecond() * 1e-6 + plainTime.nanosecond() * 1e-9;
|
||||
};
|
||||
|
||||
double quantity = 0;
|
||||
switch (unit) {
|
||||
case ISO8601::DateTimeUnit::Day: {
|
||||
double length = 8.64 * 1e13;
|
||||
quantity = (((((plainTime.hour() * 60.0 + plainTime.minute()) * 60.0 + plainTime.second()) * 1000.0 + plainTime.millisecond()) * 1000.0 + plainTime.microsecond()) * 1000.0 + plainTime.nanosecond()) / length;
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return ISO8601::Duration({ 0.0, 0.0, 0.0, result, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 });
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Hour: {
|
||||
quantity = (fractionalSecond(plainTime) / 60.0 + plainTime.minute()) / 60.0 + plainTime.hour();
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(result, 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Minute: {
|
||||
quantity = fractionalSecond(plainTime) / 60.0 + plainTime.minute();
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(plainTime.hour(), result, 0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Second: {
|
||||
quantity = fractionalSecond(plainTime);
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(plainTime.hour(), plainTime.minute(), result, 0.0, 0.0, 0.0);
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Millisecond: {
|
||||
quantity = plainTime.millisecond() + plainTime.microsecond() * 1e-3 + plainTime.nanosecond() * 1e-6;
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(plainTime.hour(), plainTime.minute(), plainTime.second(), result, 0.0, 0.0);
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Microsecond: {
|
||||
quantity = plainTime.microsecond() + plainTime.nanosecond() * 1e-3;
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(plainTime.hour(), plainTime.minute(), plainTime.second(), plainTime.millisecond(), result, 0.0);
|
||||
}
|
||||
case ISO8601::DateTimeUnit::Nanosecond: {
|
||||
quantity = plainTime.nanosecond();
|
||||
auto result = roundNumberToIncrement(quantity, increment, roundingMode);
|
||||
return Temporal::balanceTime(plainTime.hour(), plainTime.minute(), plainTime.second(), plainTime.millisecond(), plainTime.microsecond(), result);
|
||||
}
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
break;
|
||||
}
|
||||
return ISO8601::Duration();
|
||||
}
|
||||
|
||||
|
||||
TemporalPlainTimeObject* TemporalPlainTimeObject::addDurationToTime(ExecutionState& state, AddDurationToTimeOperation operation, Value temporalDurationLike)
|
||||
{
|
||||
// Let duration be ? ToTemporalDuration(temporalDurationLike).
|
||||
auto duration = Temporal::toTemporalDuration(state, temporalDurationLike)->duration();
|
||||
// If operation is subtract, set duration to CreateNegatedTemporalDuration(duration).
|
||||
if (operation == AddDurationToTimeOperation::Subtract) {
|
||||
duration = TemporalDurationObject::createNegatedTemporalDuration(duration);
|
||||
}
|
||||
|
||||
if (!duration.isValid()) {
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid duration");
|
||||
}
|
||||
|
||||
// Let internalDuration be ToInternalDurationRecord(duration).
|
||||
// Let result be AddTime(temporalTime.[[Time]], internalDuration.[[Time]]).
|
||||
// Return ! CreateTemporalTime(result).
|
||||
auto result = Temporal::balanceTime(int64_t(duration.hours()) + int64_t(plainTime().hour()), int64_t(duration.minutes()) + int64_t(plainTime().minute()), int64_t(duration.seconds()) + int64_t(plainTime().second()),
|
||||
int64_t(duration.milliseconds()) + int64_t(plainTime().millisecond()), int64_t(duration.microseconds()) + int64_t(plainTime().microsecond()), int64_t(duration.nanoseconds()) + int64_t(plainTime().nanosecond()));
|
||||
return new TemporalPlainTimeObject(state, state.context()->globalObject()->temporalPlainTimePrototype(), ISO8601::PlainTime(result.hours(), result.minutes(), result.seconds(), result.milliseconds(), result.microseconds(), result.nanoseconds()));
|
||||
}
|
||||
|
||||
TemporalPlainTimeObject* TemporalPlainTimeObject::with(ExecutionState& state, Value temporalTimeLike, Value options)
|
||||
{
|
||||
// Let plainTime be the this value.
|
||||
// Perform ? RequireInternalSlot(plainTime, [[InitializedTemporalTime]]).
|
||||
// If ? IsPartialTemporalObject(temporalTimeLike) is false, throw a TypeError exception.
|
||||
if (!Temporal::isPartialTemporalObject(state, temporalTimeLike)) {
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::TypeError, "Invalid temporalTimeLike");
|
||||
}
|
||||
// Let partialTime be ? ToTemporalTimeRecord(temporalTimeLike, partial).
|
||||
auto partialTime = toTemporalTimeRecord(state, temporalTimeLike, false);
|
||||
// Step 5..16
|
||||
#define DEFINE_ISO8601_PLAIN_TIME_FIELD(name, capitalizedName) \
|
||||
int64_t name; \
|
||||
if (partialTime.name()) { \
|
||||
name = partialTime.name().value(); \
|
||||
} else { \
|
||||
name = plainTime().name(); \
|
||||
}
|
||||
PLAIN_TIME_UNITS(DEFINE_ISO8601_PLAIN_TIME_FIELD);
|
||||
#undef DEFINE_ISO8601_PLAIN_TIME_FIELD
|
||||
|
||||
// Let resolvedOptions be ? GetOptionsObject(options).
|
||||
auto resolvedOptions = Intl::getOptionsObject(state, options);
|
||||
// Let overflow be ? GetTemporalOverflowOption(resolvedOptions).
|
||||
auto overflow = Temporal::getTemporalOverflowOption(state, resolvedOptions);
|
||||
// Let result be ? RegulateTime(hour, minute, second, millisecond, microsecond, nanosecond, overflow).
|
||||
auto result = regulateTime(state, hour, minute, second, millisecond, microsecond, nanosecond, overflow);
|
||||
// Return ! CreateTemporalTime(result).
|
||||
return new TemporalPlainTimeObject(state, state.context()->globalObject()->temporalPlainTimePrototype(), result);
|
||||
}
|
||||
|
||||
static String* temporalTimeToString(ISO8601::PlainTime plainTime, Value precision)
|
||||
{
|
||||
if (precision.isString() && precision.asString()->equals("minute")) {
|
||||
std::string s;
|
||||
s = pad('0', 2, std::to_string(plainTime.hour()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.minute()));
|
||||
return String::fromASCII(s.data(), s.length());
|
||||
}
|
||||
|
||||
int64_t milliseconds = plainTime.millisecond();
|
||||
int64_t microseconds = plainTime.microsecond();
|
||||
int64_t nanoseconds = plainTime.nanosecond();
|
||||
int64_t fractionNanoseconds = milliseconds * 1000000 + microseconds * 1000 + nanoseconds;
|
||||
if (precision.isString() && precision.asString()->equals("auto")) {
|
||||
if (!fractionNanoseconds) {
|
||||
std::string s;
|
||||
s = pad('0', 2, std::to_string(plainTime.hour()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.minute()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.second()));
|
||||
return String::fromASCII(s.data(), s.length());
|
||||
}
|
||||
auto fraction = std::to_string(fractionNanoseconds);
|
||||
unsigned paddingLength = 9 - fraction.size();
|
||||
unsigned index = fraction.size();
|
||||
Optional<unsigned> validLength;
|
||||
while (index--) {
|
||||
if (fraction[index] != '0') {
|
||||
validLength = index + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (validLength) {
|
||||
size_t popCount = fraction.size() - validLength.value();
|
||||
for (size_t i = 0; i < popCount; i++) {
|
||||
fraction.pop_back();
|
||||
}
|
||||
} else {
|
||||
fraction.clear();
|
||||
}
|
||||
|
||||
std::string s;
|
||||
s = pad('0', 2, std::to_string(plainTime.hour()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.minute()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.second()));
|
||||
s += ".";
|
||||
s += pad('0', paddingLength, "");
|
||||
s += fraction;
|
||||
return String::fromASCII(s.data(), s.length());
|
||||
}
|
||||
int32_t precisionValue = 0;
|
||||
if (precision.isInt32()) {
|
||||
precisionValue = precision.asInt32();
|
||||
}
|
||||
if (!precisionValue) {
|
||||
std::string s;
|
||||
s = pad('0', 2, std::to_string(plainTime.hour()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.minute()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.second()));
|
||||
return String::fromASCII(s.data(), s.length());
|
||||
}
|
||||
auto fraction = std::to_string(fractionNanoseconds);
|
||||
int32_t paddingLength = 9 - fraction.size();
|
||||
paddingLength = std::min(paddingLength, precisionValue);
|
||||
precisionValue -= paddingLength;
|
||||
fraction.resize(precisionValue);
|
||||
|
||||
std::string s;
|
||||
s = pad('0', 2, std::to_string(plainTime.hour()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.minute()));
|
||||
s += ":";
|
||||
s += pad('0', 2, std::to_string(plainTime.second()));
|
||||
s += ".";
|
||||
s += pad('0', paddingLength, "");
|
||||
s += fraction;
|
||||
return String::fromASCII(s.data(), s.length());
|
||||
}
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.tostring
|
||||
String* TemporalPlainTimeObject::toString(ExecutionState& state, Value options)
|
||||
{
|
||||
// Let plainTime be the this value.
|
||||
// Perform ? RequireInternalSlot(plainTime, [[InitializedTemporalTime]]).
|
||||
// Let resolvedOptions be ? GetOptionsObject(options).
|
||||
auto resolvedOptions = Intl::getOptionsObject(state, options);
|
||||
// NOTE: The following steps read options and perform independent validation in alphabetical order (GetTemporalFractionalSecondDigitsOption reads "fractionalSecondDigits" and GetRoundingModeOption reads "roundingMode").
|
||||
// Let digits be ? GetTemporalFractionalSecondDigitsOption(resolvedOptions).
|
||||
auto digits = Temporal::getTemporalFractionalSecondDigitsOption(state, resolvedOptions);
|
||||
// Let roundingMode be ? GetRoundingModeOption(resolvedOptions, trunc).
|
||||
auto roundingMode = Temporal::getRoundingModeOption(state, resolvedOptions, state.context()->staticStrings().trunc.string());
|
||||
// Let smallestUnit be ? GetTemporalUnitValuedOption(resolvedOptions, "smallestUnit", unset).
|
||||
auto smallestUnit = Temporal::getTemporalUnitValuedOption(state, resolvedOptions, state.context()->staticStrings().lazySmallestUnit().string(), NullOption);
|
||||
// Perform ? ValidateTemporalUnitValue(smallestUnit, time).
|
||||
Temporal::validateTemporalUnitValue(state, smallestUnit, ISO8601::DateTimeUnitCategory::Time, nullptr, 0);
|
||||
// If smallestUnit is hour, throw a RangeError exception.
|
||||
if (smallestUnit == TemporalUnit::Hour) {
|
||||
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid smallestUnit");
|
||||
}
|
||||
// Let precision be ToSecondsStringPrecisionRecord(smallestUnit, digits).
|
||||
auto precision = Temporal::toSecondsStringPrecisionRecord(state, toDateTimeUnit(smallestUnit), digits);
|
||||
// Let roundResult be RoundTime(plainTime.[[Time]], precision.[[Increment]], precision.[[Unit]], roundingMode).
|
||||
auto roundResult = roundTime(state, plainTime(), precision.increment, precision.unit, roundingMode);
|
||||
// Return TimeRecordToString(roundResult, precision.[[Precision]]).
|
||||
return temporalTimeToString(ISO8601::PlainTime(roundResult.hours(), roundResult.minutes(), roundResult.seconds(), roundResult.milliseconds(),
|
||||
roundResult.microseconds(), roundResult.nanoseconds()),
|
||||
precision.precision);
|
||||
}
|
||||
|
||||
} // namespace Escargot
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -44,11 +44,27 @@ public:
|
|||
static ISO8601::PlainTime regulateTime(ExecutionState& state, int64_t hour, int64_t minute, int64_t second,
|
||||
int64_t millisecond, int64_t microsecond, int64_t nanosecond, TemporalOverflowOption overflow);
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal-roundtime
|
||||
static ISO8601::Duration roundTime(ExecutionState& state, ISO8601::PlainTime plainTime, double increment, ISO8601::DateTimeUnit unit, ISO8601::RoundingMode roundingMode);
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal-adddurationtotime
|
||||
enum class AddDurationToTimeOperation {
|
||||
Add,
|
||||
Subtract
|
||||
};
|
||||
TemporalPlainTimeObject* addDurationToTime(ExecutionState& state, AddDurationToTimeOperation operation, Value temporalDurationLike);
|
||||
|
||||
ISO8601::PlainTime plainTime() const
|
||||
{
|
||||
return *m_plainTime;
|
||||
}
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.with
|
||||
TemporalPlainTimeObject* with(ExecutionState& state, Value temporalTimeLike, Value options);
|
||||
|
||||
// https://tc39.es/proposal-temporal/#sec-temporal.plaintime.prototype.tostring
|
||||
String* toString(ExecutionState& state, Value options);
|
||||
|
||||
private:
|
||||
ISO8601::PlainTime* m_plainTime;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -153,9 +153,13 @@ static void handleFraction(Duration& duration, int factor, std::string fractionS
|
|||
duration.setNanoseconds(fraction % nsPerMicrosecond);
|
||||
}
|
||||
|
||||
static double parseInt(std::string src)
|
||||
static Optional<double> parseInt(std::string src)
|
||||
{
|
||||
return std::stod(src);
|
||||
try {
|
||||
return std::stod(src);
|
||||
} catch (...) {
|
||||
return NullOption;
|
||||
}
|
||||
}
|
||||
|
||||
DateTimeUnitCategory toDateTimeCategory(DateTimeUnit u)
|
||||
|
|
@ -223,7 +227,12 @@ Optional<Duration> Duration::parseDurationString(String* input)
|
|||
while (digits < buffer.lengthRemaining() && isdigit(buffer[digits]))
|
||||
digits++;
|
||||
|
||||
double integer = factor * parseInt(buffer.first(digits));
|
||||
auto mayInteger = parseInt(buffer.first(digits));
|
||||
if (!mayInteger) {
|
||||
return NullOption;
|
||||
}
|
||||
|
||||
double integer = factor * mayInteger.value();
|
||||
buffer.advanceBy(digits);
|
||||
if (buffer.atEnd())
|
||||
return NullOption;
|
||||
|
|
@ -274,7 +283,12 @@ Optional<Duration> Duration::parseDurationString(String* input)
|
|||
digits++;
|
||||
}
|
||||
|
||||
double integer = factor * parseInt(buffer.first(digits));
|
||||
auto mayInteger = parseInt(buffer.first(digits));
|
||||
if (!mayInteger) {
|
||||
return NullOption;
|
||||
}
|
||||
|
||||
double integer = factor * mayInteger.value();
|
||||
buffer.advanceBy(digits);
|
||||
if (buffer.atEnd()) {
|
||||
return NullOption;
|
||||
|
|
|
|||
|
|
@ -212,7 +212,8 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
Duration(std::initializer_list<double> list)
|
||||
template <typename T>
|
||||
Duration(std::initializer_list<T> list)
|
||||
{
|
||||
size_t idx = 0;
|
||||
for (auto n : list) {
|
||||
|
|
|
|||
|
|
@ -182,7 +182,6 @@
|
|||
<test id="built-ins/Temporal/Duration/from/argument-duration-max"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/from/argument-duration-out-of-range"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/from/argument-duration-precision-exact-numerical-values"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/from/argument-string-is-infinity"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/large-number"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/Duration/max"><reason>TODO</reason></test>
|
||||
|
|
@ -1808,33 +1807,6 @@
|
|||
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-balance-negative-time-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/from/argument-zoneddatetime-negative-epochnanoseconds"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/from/order-of-operations"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-duration"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-duration-max"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-duration-out-of-range"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-duration-precision-exact-numerical-values"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-higher-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-mixed-sign"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-not-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-string-duration-too-large"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-string-fractional-units-rounding-mode"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/argument-string-negative-fractional-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/balance-negative-time-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/builtin"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/length"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/name"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/negative-infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/non-integer-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/not-a-constructor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/options-ignored"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/order-of-operations"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/precision-exact-mathematical-values-1"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/precision-exact-mathematical-values-2"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/add/subclassing-ignored"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-cast"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-string-calendar-annotation"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/equals/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
|
||||
|
|
@ -1969,77 +1941,7 @@
|
|||
<test id="built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/since/smallestunit-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/since/year-zero"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-duration"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-duration-max"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-duration-out-of-range"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-duration-precision-exact-numerical-values"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-mixed-sign"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-not-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-string-duration-too-large"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-string-fractional-units-rounding-mode"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/argument-string-negative-fractional-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/balance-negative-time-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/builtin"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/length"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/name"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/negative-infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/non-integer-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/not-a-constructor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/options-ignored"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/order-of-operations"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/precision-exact-mathematical-values-1"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/precision-exact-mathematical-values-2"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/subtract/subclassing-ignored"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/basic"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/builtin"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/length"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/name"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/not-a-constructor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toJSON/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toLocaleString/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toLocaleString/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/basic"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-nan"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/options-invalid"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/options-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/options-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/order-of-operations"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-expand"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfCeil"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfEven"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfFloor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfTrunc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/roundingmode-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-plurals-accepted"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/toString/smallestunit-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-cast"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-string-calendar-annotation"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/until/argument-string-calendar-annotation-invalid-key"><reason>TODO</reason></test>
|
||||
|
|
@ -2108,25 +2010,7 @@
|
|||
<test id="built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/until/smallestunit-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/until/year-zero"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/basic"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/branding"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/builtin"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/copy-properties-not-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/infinity-throws-rangeerror"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/length"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/name"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/not-a-constructor"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/options-object"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/options-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/options-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/order-of-operations"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/overflow-undefined"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/overflow-wrong-type"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/plaintimelike-invalid"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/prop-desc"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/subclassing-ignored"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/prototype/with/throws-if-time-is-invalid-when-overflow-is-reject"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainTime/throws-if-time-is-invalid"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainYearMonth/argument-invalid"><reason>TODO</reason></test>
|
||||
<test id="built-ins/Temporal/PlainYearMonth/basic"><reason>TODO</reason></test>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue