Implement ECMA-402 Intl.supportedValuesOf

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-07-11 16:09:42 +09:00 committed by MuHong Byun
commit 1d1abe1e69
11 changed files with 1434 additions and 279 deletions

View file

@ -1125,6 +1125,198 @@ static Value builtinIntlGetCanonicalLocales(ExecutionState& state, Value thisVal
return Object::createArrayFromList(state, ll);
}
static ValueVector availableCalendars()
{
ValueVector resultVector;
auto ns = Intl::calendarsForLocale(String::emptyString());
for (const auto& s : ns) {
resultVector.pushBack(String::fromUTF8(s.data(), s.length()));
}
return resultVector;
}
static ValueVector availableCollation()
{
ValueVector resultVector;
UErrorCode status = U_ZERO_ERROR;
LocalResourcePointer<UEnumeration> collation(
ucol_getKeywordValues("collation", &status),
[](UEnumeration* fmt) { uenum_close(fmt); });
if (!U_SUCCESS(status)) {
return {};
}
const char* buffer;
int32_t bufferLength = 0;
while ((buffer = uenum_next(collation.get(), &bufferLength, &status)) && U_SUCCESS(status)) {
std::string co(uloc_toUnicodeLocaleType("co", buffer));
if (co == "search") {
continue;
}
if (co == "standard") {
continue;
}
resultVector.pushBack(String::fromUTF8(co.data(), co.size()));
}
if (!U_SUCCESS(status)) {
return {};
}
return resultVector;
}
static ValueVector availableCurrency()
{
ValueVector resultVector;
UErrorCode status = U_ZERO_ERROR;
LocalResourcePointer<UEnumeration> curr(
ucurr_getKeywordValuesForLocale("currency", "", false, &status),
[](UEnumeration* fmt) { uenum_close(fmt); });
if (!U_SUCCESS(status)) {
return {};
}
const char* buffer;
int32_t bufferLength = 0;
while ((buffer = uenum_next(curr.get(), &bufferLength, &status)) && U_SUCCESS(status)) {
resultVector.pushBack(String::fromUTF8(buffer, bufferLength));
}
if (!U_SUCCESS(status)) {
return {};
}
return resultVector;
}
static ValueVector availableNumberingSystem()
{
ValueVector resultVector;
auto ns = Intl::numberingSystemsForLocale(String::emptyString());
for (const auto& s : ns) {
resultVector.pushBack(String::fromUTF8(s.data(), s.length()));
}
return resultVector;
}
static ValueVector availableTimeZone()
{
// 1. Let records be AvailableNamedTimeZoneIdentifiers().
// 2. Let result be a new empty List.
// 3. For each element timeZoneIdentifierRecord of records, do
// a. If timeZoneIdentifierRecord.[[Identifier]] is timeZoneIdentifierRecord.[[PrimaryIdentifier]], then
// i. Append timeZoneIdentifierRecord.[[Identifier]] to result.
// 4. Return result.
ValueVector resultVector;
UErrorCode status = U_ZERO_ERROR;
LocalResourcePointer<UEnumeration> tzs(ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL_LOCATION, nullptr, nullptr, &status),
[](UEnumeration* fmt) { uenum_close(fmt); });
if (!U_SUCCESS(status)) {
return {};
}
const char* buffer;
int32_t bufferLength = 0;
while ((buffer = uenum_next(tzs.get(), &bufferLength, &status)) && U_SUCCESS(status)) {
std::string id(buffer, bufferLength);
if (id == "UTC" || (id.find("Etc/GMT") != std::string::npos)) {
continue;
}
resultVector.pushBack(String::fromUTF8(buffer, bufferLength));
}
resultVector.pushBack(String::fromASCII("UTC"));
for (int i = 1; i <= 12; i++) {
std::string s;
s += "Etc/GMT+" + std::to_string(i);
resultVector.pushBack(String::fromASCII(s.data(), s.length()));
s = "";
s += "Etc/GMT-" + std::to_string(i);
resultVector.pushBack(String::fromASCII(s.data(), s.length()));
}
resultVector.pushBack(String::fromASCII("Etc/GMT-13"));
resultVector.pushBack(String::fromASCII("Etc/GMT-14"));
if (!U_SUCCESS(status)) {
return {};
}
return resultVector;
}
static ValueVector availableUnit()
{
// ecma402 #sec-issanctionedsimpleunitidentifier
ValueVector resultVector;
std::array<const char*, 45> data = {
"acre", "bit", "byte", "celsius",
"centimeter", "day", "degree", "fahrenheit",
"fluid-ounce", "foot", "gallon", "gigabit",
"gigabyte", "gram", "hectare", "hour",
"inch", "kilobit", "kilobyte", "kilogram",
"kilometer", "liter", "megabit", "megabyte",
"meter", "microsecond", "mile", "mile-scandinavian",
"millimeter", "milliliter", "millisecond", "minute",
"month", "nanosecond", "ounce", "percent",
"petabyte", "pound", "second", "stone",
"terabit", "terabyte", "week", "yard",
"year"
};
for (size_t i = 0; i < data.size(); i++) {
resultVector.pushBack(String::fromASCII(data[i], strlen(data[i])));
}
return resultVector;
}
// https://402.ecma-international.org/12.0/index.html#sec-intl.supportedvaluesof
static Value builtinIntlSupportedValuesOf(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
// Let key be ? ToString(key).
String* key = argv[0].toString(state);
ValueVector resultVector;
// If key is "calendar", then
if (key->equals("calendar")) {
resultVector = availableCalendars();
} else if (key->equals("collation")) {
// Else if key is "collation", then
resultVector = availableCollation();
} else if (key->equals("currency")) {
// Else if key is "currency", then
resultVector = availableCurrency();
} else if (key->equals("numberingSystem")) {
// Else if key is "numberingSystem", then
resultVector = availableNumberingSystem();
} else if (key->equals("timeZone")) {
// Else if key is "timeZone", then
resultVector = availableTimeZone();
} else if (key->equals("unit")) {
// Else if key is "unit", then
resultVector = availableUnit();
} else {
// Throw a RangeError exception.
ErrorObject::throwBuiltinError(state, ErrorCode::RangeError, "Invalid key");
}
ArrayObject* arr = Object::createArrayFromList(state, resultVector);
arr->sort(state, arr->length(state), [](const Value& a, const Value& b) -> bool {
return *a.asString() < *b.asString();
});
return arr;
}
void GlobalObject::initializeIntl(ExecutionState& state)
{
ObjectPropertyNativeGetterSetterData* nativeData = new ObjectPropertyNativeGetterSetterData(true, false, true, [](ExecutionState& state, Object* self, const Value& receiver, const EncodedValue& privateDataFromObjectPrivateArea) -> Value {
@ -1457,6 +1649,10 @@ void GlobalObject::installIntl(ExecutionState& state)
FunctionObject* getCanonicalLocales = new NativeFunctionObject(state, NativeFunctionInfo(strings->getCanonicalLocales, builtinIntlGetCanonicalLocales, 1, NativeFunctionInfo::Strict));
m_intl->directDefineOwnProperty(state, ObjectPropertyName(strings->getCanonicalLocales),
ObjectPropertyDescriptor(getCanonicalLocales, (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_intl->directDefineOwnProperty(state, ObjectPropertyName(strings->lazySupportedValuesOf()),
ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazySupportedValuesOf(), builtinIntlSupportedValuesOf, 1, NativeFunctionInfo::Strict)),
(ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
}
#else

View file

@ -1679,25 +1679,33 @@ String* Intl::icuLocaleToBCP47Tag(String* string)
std::string Intl::convertICUCalendarKeywordToBCP47KeywordIfNeeds(const std::string& icuCalendar)
{
if (icuCalendar == std::string("gregorian")) {
if (icuCalendar == "gregorian") {
return "gregory";
} else if (icuCalendar == std::string("islamic-civil")) {
return "islamicc";
} else if (icuCalendar == std::string("ethiopic-amete-alem")) {
} else if (icuCalendar == "ethiopic-amete-alem") {
return "ethioaa";
}
return icuCalendar;
}
std::string Intl::convertBCP47KeywordToICUCalendarKeywordIfNeeds(const std::string& keyword)
{
if (keyword == "gregory") {
return "gregorian";
} else if (keyword == "ethioaa") {
return "ethiopic-amete-alem";
}
return keyword;
}
std::string Intl::convertICUCollationKeywordToBCP47KeywordIfNeeds(const std::string& icuCollation)
{
if (icuCollation == std::string("dictionary")) {
if (icuCollation == "dictionary") {
return "dict";
} else if (icuCollation == std::string("gb2312han")) {
} else if (icuCollation == "gb2312han") {
return "gb2312";
} else if (icuCollation == std::string("phonebook")) {
} else if (icuCollation == "phonebook") {
return "phonebk";
} else if (icuCollation == std::string("traditional")) {
} else if (icuCollation == "traditional") {
return "trad";
}
return icuCollation;
@ -2357,9 +2365,13 @@ std::vector<std::string> Intl::numberingSystemsForLocale(String* locale)
std::string defaultSystemName(unumsys_getName(defaultSystem));
unumsys_close(defaultSystem);
std::vector<std::string> numberingSystems;
numberingSystems.push_back(defaultSystemName);
numberingSystems.insert(numberingSystems.end(), availableNumberingSystems.begin(), availableNumberingSystems.end());
std::vector<std::string> numberingSystems = availableNumberingSystems;
auto iter = std::find(numberingSystems.begin(), numberingSystems.end(), defaultSystemName);
if (iter != numberingSystems.end()) {
numberingSystems.erase(iter);
}
numberingSystems.insert(numberingSystems.begin(), defaultSystemName);
return numberingSystems;
}

View file

@ -52,6 +52,7 @@ public:
static std::string preferredLanguage(const std::string& language);
static String* icuLocaleToBCP47Tag(String* string);
static std::string convertICUCalendarKeywordToBCP47KeywordIfNeeds(const std::string& icuCalendar);
static std::string convertBCP47KeywordToICUCalendarKeywordIfNeeds(const std::string& icuCalendar);
static std::string convertICUCollationKeywordToBCP47KeywordIfNeeds(const std::string& icuCollation);
static std::vector<std::string> calendarsForLocale(String* locale);
static std::vector<std::string> numberingSystemsForLocale(String* locale);

View file

@ -220,9 +220,7 @@ static String* canonicalCodeForDisplayNames(ExecutionState& state, String* type,
// b. Let code be the result of mapping code to lower case as described in 6.1.
// c. Return code.
if (code->equals("gregory")) {
code = String::fromASCII("gregorian", sizeof("gregorian") - 1);
} else if (code->equals("islamicc")) {
if (code->equals("islamicc")) {
code = String::fromASCII("islamic-civil", sizeof("islamic-civil") - 1);
} else if (code->equals("ethioaa")) {
code = String::fromASCII("ethiopic-amete-alem", sizeof("ethiopic-amete-alem") - 1);
@ -291,7 +289,8 @@ Value IntlDisplayNamesObject::of(ExecutionState& state, const Value& codeInput)
} else if (m_type->equals("script")) {
result = INTL_ICU_STRING_BUFFER_OPERATION(uldn_scriptDisplayName, m_icuLocaleDisplayNames, code->toNonGCUTF8StringData().data());
} else if (m_type->equals("calendar")) {
result = INTL_ICU_STRING_BUFFER_OPERATION(uldn_keyValueDisplayName, m_icuLocaleDisplayNames, "calendar", code->toNonGCUTF8StringData().data());
auto icuKey = Intl::convertBCP47KeywordToICUCalendarKeywordIfNeeds(code->toNonGCUTF8StringData());
result = INTL_ICU_STRING_BUFFER_OPERATION(uldn_keyValueDisplayName, m_icuLocaleDisplayNames, "calendar", icuKey.data());
} else if (m_type->equals("currency")) {
UCurrNameStyle style = UCURR_LONG_NAME;
if (m_style->equals("long")) {

View file

@ -212,11 +212,15 @@ static bool isSanctionedSimpleUnitIdentifier(const std::string& s)
return true;
} else if (s == "millisecond") {
return true;
} else if (s == "microsecond") {
return true;
} else if (s == "minute") {
return true;
}
return (s == "month");
}
case 'n':
return (s == "nanosecond");
case 'o':
return (s == "ounce");
case 'p':
@ -296,6 +300,8 @@ static const char* findICUUnitTypeFromUnitString(const std::string& s)
COMPARE_ONCE(volume, milliliter)
COMPARE_ONCE(length, millimeter)
COMPARE_ONCE(duration, millisecond)
COMPARE_ONCE(duration, microsecond)
COMPARE_ONCE(duration, nanosecond)
COMPARE_ONCE(duration, minute)
COMPARE_ONCE(duration, month)
COMPARE_ONCE(mass, ounce)

View file

@ -815,6 +815,7 @@ namespace Escargot {
F(SmallLetterNaN, "nan") \
F(Standard, "standard") \
F(Style, "style") \
F(SupportedValuesOf, "supportedValuesOf") \
F(TextInfo, "textInfo") \
F(Time, "time") \
F(TimeStyle, "timeStyle") \

View file

@ -47,6 +47,7 @@
#define uloc_getCharacterOrientation RuntimeICUBinder::ICU::instance().uloc_getCharacterOrientation
#define uloc_countAvailable RuntimeICUBinder::ICU::instance().uloc_countAvailable
#define uloc_getAvailable RuntimeICUBinder::ICU::instance().uloc_getAvailable
#define uloc_toUnicodeLocaleType RuntimeICUBinder::ICU::instance().uloc_toUnicodeLocaleType
#define u_getIntPropertyValue RuntimeICUBinder::ICU::instance().u_getIntPropertyValue
#define u_getIntPropertyMaxValue RuntimeICUBinder::ICU::instance().u_getIntPropertyMaxValue
@ -74,6 +75,7 @@
#define ucol_getAvailable RuntimeICUBinder::ICU::instance().ucol_getAvailable
#define ucol_setAttribute RuntimeICUBinder::ICU::instance().ucol_setAttribute
#define ucol_close RuntimeICUBinder::ICU::instance().ucol_close
#define ucol_getKeywordValues RuntimeICUBinder::ICU::instance().ucol_getKeywordValues
#define ucol_getKeywordValuesForLocale RuntimeICUBinder::ICU::instance().ucol_getKeywordValuesForLocale
#define ucol_open RuntimeICUBinder::ICU::instance().ucol_open
#define ucol_strcollIter RuntimeICUBinder::ICU::instance().ucol_strcollIter
@ -207,6 +209,8 @@
#define ucurr_getName RuntimeICUBinder::ICU::instance().ucurr_getName
#define ucurr_getDefaultFractionDigits RuntimeICUBinder::ICU::instance().ucurr_getDefaultFractionDigits
#define ucurr_getDefaultFractionDigitsForUsage RuntimeICUBinder::ICU::instance().ucurr_getDefaultFractionDigitsForUsage
#define ucurr_openISOCurrencies RuntimeICUBinder::ICU::instance().ucurr_openISOCurrencies
#define ucurr_getKeywordValuesForLocale RuntimeICUBinder::ICU::instance().ucurr_getKeywordValuesForLocale
#define ureldatefmt_open RuntimeICUBinder::ICU::instance().ureldatefmt_open
#define ureldatefmt_openResult RuntimeICUBinder::ICU::instance().ureldatefmt_openResult

View file

@ -6301,6 +6301,49 @@ typedef enum UNumberCompactStyle {
/** @stable ICU 51 */
} UNumberCompactStyle;
/**
* Selector constants for ucurr_openCurrencies().
*
* @see ucurr_openCurrencies
* @stable ICU 3.2
*/
typedef enum UCurrCurrencyType {
/**
* Select all ISO-4217 currency codes.
* @stable ICU 3.2
*/
UCURR_ALL = INT32_MAX,
/**
* Select only ISO-4217 commonly used currency codes.
* These currencies can be found in common use, and they usually have
* bank notes or coins associated with the currency code.
* This does not include fund codes, precious metals and other
* various ISO-4217 codes limited to special financial products.
* @stable ICU 3.2
*/
UCURR_COMMON = 1,
/**
* Select ISO-4217 uncommon currency codes.
* These codes respresent fund codes, precious metals and other
* various ISO-4217 codes limited to special financial products.
* A fund code is a monetary resource associated with a currency.
* @stable ICU 3.2
*/
UCURR_UNCOMMON = 2,
/**
* Select only deprecated ISO-4217 codes.
* These codes are no longer in general public use.
* @stable ICU 3.2
*/
UCURR_DEPRECATED = 4,
/**
* Select only non-deprecated ISO-4217 codes.
* These codes are in general public use.
* @stable ICU 3.2
*/
UCURR_NON_DEPRECATED = 8
} UCurrCurrencyType;
/**
* Constants for specifying currency spacing
* @stable ICU 4.8

View file

@ -71,6 +71,7 @@ namespace RuntimeICUBinder {
F(uloc_getCharacterOrientation, ULayoutType (*)(const char* localeID, UErrorCode* err), ULayoutType) \
F(uloc_countAvailable, int32_t (*)(), int32_t) \
F(uloc_getAvailable, const char* (*)(int32_t n), const char*) \
F(uloc_toUnicodeLocaleType, const char* (*)(const char*, const char*), const char*) \
F(ucnv_open, UConverter* (*)(const char* converterName, UErrorCode* err), UConverter*) \
F(ucnv_compareNames, int (*)(const char* name1, const char* name2), int) \
F(ucnv_getDisplayName, int32_t (*)(const UConverter* converter, const char* displayLocale, UChar* displayName, int32_t displayNameCapacity, UErrorCode* err), int32_t) \
@ -106,6 +107,7 @@ namespace RuntimeICUBinder {
F(vzone_getRawOffset, int32_t (*)(VZone*), int32_t) \
F(ucol_countAvailable, int32_t (*)(), int32_t) \
F(ucol_getAvailable, const char* (*)(int32_t), const char*) \
F(ucol_getKeywordValues, UEnumeration* (*)(const char* key, UErrorCode* status), UEnumeration*) \
F(ucol_getKeywordValuesForLocale, UEnumeration* (*)(const char* key, const char* locale, UBool commonlyUsed, UErrorCode* status), UEnumeration*) \
F(ucol_open, UCollator* (*)(const char* loc, UErrorCode* status), UCollator*) \
F(ucol_strcollIter, UCollationResult (*)(const UCollator* coll, UCharIterator* sIter, UCharIterator* tIter, UErrorCode* status), UCollationResult) \
@ -176,6 +178,8 @@ namespace RuntimeICUBinder {
F(ucurr_getName, const UChar* (*)(const UChar* currency, const char* locale, UCurrNameStyle nameStyle, UBool* isChoiceFormat, int32_t* len, UErrorCode* ec), const UChar*) \
F(ucurr_getDefaultFractionDigits, int32_t (*)(const UChar* currency, UErrorCode* ec), int32_t) \
F(ucurr_getDefaultFractionDigitsForUsage, int32_t (*)(const UChar* currency, const UCurrencyUsage usage, UErrorCode* ec), int32_t) \
F(ucurr_openISOCurrencies, UEnumeration* (*)(uint32_t currType, UErrorCode *pErrorCode), UEnumeration*) \
F(ucurr_getKeywordValuesForLocale, UEnumeration* (*)(const char *key, const char *locale, UBool commonlyUsed, UErrorCode *status), UEnumeration*) \
F(ureldatefmt_open, URelativeDateTimeFormatter* (*)(const char*, UNumberFormat*, UDateRelativeDateTimeFormatterStyle, UDisplayContext, UErrorCode*), URelativeDateTimeFormatter*) \
F(ureldatefmt_openResult, UFormattedRelativeDateTime* (*)(UErrorCode * ec), UFormattedRelativeDateTime*) \
F(ureldatefmt_resultAsValue, const UFormattedValue* (*)(const UFormattedRelativeDateTime* ufrdt, UErrorCode* ec), const UFormattedValue*) \

View file

@ -326,7 +326,6 @@
<test id="built-ins/Iterator/prototype/Symbol.toStringTag/weird-setter"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/constructor/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/constructor/weird-setter"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/drop/argument-validation-failure-closes-underlying"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/filter/argument-validation-failure-closes-underlying"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/find/argument-validation-failure-closes-underlying"><reason>TODO</reason></test>
<test id="built-ins/Iterator/prototype/flatMap/argument-validation-failure-closes-underlying"><reason>TODO</reason></test>
@ -4734,7 +4733,6 @@
<test id="intl402/Array/prototype/toLocaleString/invoke-element-tolocalestring"><reason>TODO</reason></test>
<test id="intl402/Collator/constructor-options-throwing-getters"><reason>TODO</reason></test>
<test id="intl402/Collator/prototype/compare/ignorePunctuation"><reason>TODO</reason></test>
<test id="intl402/Collator/prototype/resolvedOptions/basic"><reason>TODO</reason></test>
<test id="intl402/Collator/prototype/resolvedOptions/ignorePunctuation-default"><reason>TODO</reason></test>
<test id="intl402/Collator/prototype/resolvedOptions/resolved-collation-unicode-extensions-and-options"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/canonicalize-calendar"><reason>TODO</reason></test>
@ -4801,7 +4799,6 @@
<test id="intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-not-overlapping-options"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-resolved-time-zone"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/formatToParts/temporal-zoneddatetime-not-supported"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/resolvedOptions/basic"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/resolvedOptions/hourCycle-default"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/resolvedOptions/hourCycle-timeStyle"><reason>TODO</reason></test>
<test id="intl402/DateTimeFormat/prototype/resolvedOptions/offset-timezone-basic"><reason>TODO</reason></test>
@ -4939,33 +4936,9 @@
<test id="intl402/Intl/getCanonicalLocales/unicode-ext-canonicalize-timezone"><reason>TODO</reason></test>
<test id="intl402/Intl/getCanonicalLocales/unicode-ext-canonicalize-yes-to-true"><reason>TODO</reason></test>
<test id="intl402/Intl/getCanonicalLocales/unicode-ext-key-with-digit"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/builtin"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/calendars"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/calendars-accepted-by-DateTimeFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/calendars-accepted-by-DisplayNames"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/coerced-to-string"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/collations"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/collations-accepted-by-Collator"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/currencies"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/currencies-accepted-by-DisplayNames"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/currencies-accepted-by-NumberFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/invalid-key"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/length"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/name"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/numberingSystems"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/numberingSystems-accepted-by-DateTimeFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/numberingSystems-accepted-by-NumberFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/numberingSystems-accepted-by-RelativeTimeFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/numberingSystems-with-simple-digit-mappings"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/prop-desc"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/timeZones"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/timeZones-accepted-by-DateTimeFormat"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/timeZones-include-non-continental"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/units"><reason>TODO</reason></test>
<test id="intl402/Intl/supportedValuesOf/units-accepted-by-NumberFormat"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-apply-options-canonicalizes-twice"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-getter-order"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-non-iana-canon"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-options-canonicalized"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-options-firstDayOfWeek-invalid"><reason>TODO</reason></test>
<test id="intl402/Locale/constructor-options-firstDayOfWeek-valid"><reason>TODO</reason></test>
@ -5019,7 +4992,6 @@
<test id="intl402/Locale/prototype/getWeekInfo/output-object"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/getWeekInfo/output-object-keys"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/getWeekInfo/prop-desc"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/minimize/removing-likely-subtags-first-adds-likely-subtags"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/variants/name"><reason>TODO</reason></test>
<test id="intl402/Locale/prototype/variants/prop-desc"><reason>TODO</reason></test>
<test id="intl402/Locale/reject-duplicate-variants-in-tlang"><reason>TODO</reason></test>
@ -5034,7 +5006,6 @@
<test id="intl402/NumberFormat/constructor-signDisplay-negative"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/constructor-trailingZeroDisplay"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/constructor-trailingZeroDisplay-invalid"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/constructor-unit"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/currency-digits-nonstandard-notation"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/dft-currency-mnfd-range-check-mxfd"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/format-rounding-increment-10"><reason>TODO</reason></test>
@ -5072,7 +5043,6 @@
<test id="intl402/NumberFormat/prototype/format/signDisplay-negative-ja-JP"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/signDisplay-negative-ko-KR"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/signDisplay-negative-zh-TW"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/units"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/useGrouping-extended-de-DE"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/useGrouping-extended-en-IN"><reason>TODO</reason></test>
<test id="intl402/NumberFormat/prototype/format/useGrouping-extended-en-US"><reason>TODO</reason></test>
@ -6290,9 +6260,6 @@
<test id="staging/sm/Iterator/from/wrap-next-forwards-value"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/from/wrap-next-not-object-throws"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/from/wrap-return-closes-iterator"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/drop/drop-more-than-available"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/drop/length"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/drop/name"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/find/check-fn-after-getting-iterator"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-complete-throws"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/flatMap/close-iterator-when-inner-next-throws"><reason>TODO</reason></test>
@ -6313,8 +6280,6 @@
<test id="staging/sm/Iterator/prototype/lazy-methods-iterator-not-closed-on-value-throws"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-iterator-returns-done-generator-finishes"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-multiple-return-close-iterator-once"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-pass-through-lastValue"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-pass-value-through-chain"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-proxy-accesses"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-reentry-not-close-iterator"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/lazy-methods-return-closes-iterator"><reason>TODO</reason></test>
@ -6326,7 +6291,6 @@
<test id="staging/sm/Iterator/prototype/map/proxy-accesses"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/reduce/check-fn-after-getting-iterator"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/some/check-fn-after-getting-iterator"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/take-drop-throw-eagerly-on-negative"><reason>TODO</reason></test>
<test id="staging/sm/Iterator/prototype/take/take-more-than-available"><reason>TODO</reason></test>
<test id="staging/sm/JSON/parse-number-syntax"><reason>TODO</reason></test>
<test id="staging/sm/JSON/parse-syntax-errors-03"><reason>TODO</reason></test>
@ -6386,9 +6350,7 @@
<test id="staging/sm/Set/is-superset-of"><reason>TODO</reason></test>
<test id="staging/sm/String/AdvanceStringIndex"><reason>TODO</reason></test>
<test id="staging/sm/String/matchAll"><reason>TODO</reason></test>
<test id="staging/sm/String/string-code-point-upper-lower-mapping"><reason>TODO</reason></test>
<test id="staging/sm/String/string-pad-start-end"><reason>TODO</reason></test>
<test id="staging/sm/String/string-upper-lower-mapping"><reason>TODO</reason></test>
<test id="staging/sm/String/unicode-braced"><reason>TODO</reason></test>
<test id="staging/sm/Symbol/as-base-value"><reason>TODO</reason></test>
<test id="staging/sm/Symbol/comparisons"><reason>TODO</reason></test>

File diff suppressed because it is too large Load diff