blob: 48c8c85a1517d94b46ba5bb02cf9dd2a88b8fe85 [file] [log] [blame]
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Adapted from Gecko's js/src/tests/Intl/NumberFormat/formatToParts.js,
// which was dedicated to the public domain.
// NOTE: Some of these tests exercise standard behavior (e.g. that format and
// formatToParts expose the same formatted string). But much of this,
// like the exact-formatted-string expectations, is technically
// implementation-dependent. This is necessary as a practical matter to
// properly test the conversion from ICU's nested-field exposure to
// ECMA-402's sequential-parts exposure.
if (this.Intl) {
function GenericPartCreator(type)
{
return function(str) { return { type, value: str }; };
}
var Nan = GenericPartCreator("nan");
var Inf = GenericPartCreator("infinity");
var Integer = GenericPartCreator("integer");
var Group = GenericPartCreator("group");
var Decimal = GenericPartCreator("decimal");
var Fraction = GenericPartCreator("fraction");
var MinusSign = GenericPartCreator("minusSign");
var PlusSign = GenericPartCreator("plusSign");
var PercentSign = GenericPartCreator("percentSign");
var Currency = GenericPartCreator("currency");
var Literal = GenericPartCreator("literal");
function assertParts(nf, x, expected)
{
var parts = nf.formatToParts(x);
assertEquals(nf.format(x),
parts.map(part => part.value).join(""));
var len = parts.length;
assertEquals(expected.length, len);
for (var i = 0; i < len; i++)
{
assertEquals(expected[i].type, parts[i].type);
assertEquals(expected[i].value, parts[i].value);
}
}
//-----------------------------------------------------------------------------
// Test behavior of a currency with code formatting.
var usdCodeOptions =
{
style: "currency",
currency: "USD",
currencyDisplay: "code",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
};
var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
assertParts(usDollarsCode, 25,
[Currency("USD"), Literal("\u00a0"), Integer("25")]);
// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
// followed by a third letter. ISO 3166 guarantees that no country code
// starting with "X" will ever be assigned. Stepping carefully around a few
// 4217-designated special "currencies", XQQ will never have a representation.
// Thus, yes: this really is specified to work, as unrecognized or unsupported
// codes pass into the string unmodified.
var xqqCodeOptions =
{
style: "currency",
currency: "XQQ",
currencyDisplay: "code",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
};
var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
assertParts(xqqMoneyCode, 25,
[Currency("XQQ"), Literal("\u00a0"), Integer("25")]);
// Test currencyDisplay: "name".
var usdNameOptions =
{
style: "currency",
currency: "USD",
currencyDisplay: "name",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
};
var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
assertParts(usDollarsName, 25,
[Integer("25"), Literal(" "), Currency("US dollars")]);
var usdNameGroupingOptions =
{
style: "currency",
currency: "USD",
currencyDisplay: "name",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
};
var usDollarsNameGrouping =
new Intl.NumberFormat("en-US", usdNameGroupingOptions);
assertParts(usDollarsNameGrouping, 12345678,
[Integer("12"),
Group(","),
Integer("345"),
Group(","),
Integer("678"),
Literal(" "),
Currency("US dollars")]);
// But if the implementation doesn't recognize the currency, the provided code
// is used in place of a proper name, unmolested.
var xqqNameOptions =
{
style: "currency",
currency: "XQQ",
currencyDisplay: "name",
minimumFractionDigits: 0,
maximumFractionDigits: 0,
};
var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
assertParts(xqqMoneyName, 25,
[Integer("25"), Literal(" "), Currency("XQQ")]);
// Test some currencies with fractional components.
var usdNameFractionOptions =
{
style: "currency",
currency: "USD",
currencyDisplay: "name",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
};
var usdNameFractionFormatter =
new Intl.NumberFormat("en-US", usdNameFractionOptions);
// The US national surplus (i.e. debt) as of October 18, 2016.
// (Replicating data from a comment in Intl.cpp.)
var usNationalSurplus = -19766580028249.41;
assertParts(usdNameFractionFormatter, usNationalSurplus,
[MinusSign("-"),
Integer("19"),
Group(","),
Integer("766"),
Group(","),
Integer("580"),
Group(","),
Integer("028"),
Group(","),
Integer("249"),
Decimal("."),
Fraction("41"),
Literal(" "),
Currency("US dollars")]);
// Percents in various forms.
var usPercentOptions =
{
style: "percent",
minimumFractionDigits: 1,
maximumFractionDigits: 1,
};
var usPercentFormatter =
new Intl.NumberFormat("en-US", usPercentOptions);
assertParts(usPercentFormatter, 0.375,
[Integer("37"), Decimal("."), Fraction("5"), PercentSign("%")]);
assertParts(usPercentFormatter, -1284.375,
[MinusSign("-"),
Integer("128"),
Group(","),
Integer("437"),
Decimal("."),
Fraction("5"),
PercentSign("%")]);
assertParts(usPercentFormatter, NaN,
[Nan("NaN"), PercentSign("%")]);
assertParts(usPercentFormatter, Infinity,
[Inf("∞"), PercentSign("%")]);
assertParts(usPercentFormatter, -Infinity,
[MinusSign("-"), Inf("∞"), PercentSign("%")]);
var arPercentOptions =
{
style: "percent",
minimumFractionDigits: 2,
};
var arPercentFormatter =
new Intl.NumberFormat("ar-IQ", arPercentOptions);
assertParts(arPercentFormatter, -135.32,
[Literal("\u{061C}"),
MinusSign("-"),
Integer("١٣"),
Group("٬"),
Integer("٥٣٢"),
Decimal("٫"),
Fraction("٠٠"),
PercentSign("٪"),
Literal("\u{061C}")]);
// Decimals.
var usDecimalOptions =
{
style: "decimal",
maximumFractionDigits: 7 // minimum defaults to 0
};
var usDecimalFormatter =
new Intl.NumberFormat("en-US", usDecimalOptions);
assertParts(usDecimalFormatter, 42,
[Integer("42")]);
assertParts(usDecimalFormatter, 1337,
[Integer("1"), Group(","), Integer("337")]);
assertParts(usDecimalFormatter, -6.25,
[MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
assertParts(usDecimalFormatter, -1376.25,
[MinusSign("-"),
Integer("1"),
Group(","),
Integer("376"),
Decimal("."),
Fraction("25")]);
assertParts(usDecimalFormatter, 124816.8359375,
[Integer("124"),
Group(","),
Integer("816"),
Decimal("."),
Fraction("8359375")]);
var usNoGroupingDecimalOptions =
{
style: "decimal",
useGrouping: false,
maximumFractionDigits: 7 // minimum defaults to 0
};
var usNoGroupingDecimalFormatter =
new Intl.NumberFormat("en-US", usNoGroupingDecimalOptions);
assertParts(usNoGroupingDecimalFormatter, 1337,
[Integer("1337")]);
assertParts(usNoGroupingDecimalFormatter, -6.25,
[MinusSign("-"), Integer("6"), Decimal("."), Fraction("25")]);
assertParts(usNoGroupingDecimalFormatter, -1376.25,
[MinusSign("-"),
Integer("1376"),
Decimal("."),
Fraction("25")]);
assertParts(usNoGroupingDecimalFormatter, 124816.8359375,
[Integer("124816"),
Decimal("."),
Fraction("8359375")]);
var deDecimalOptions =
{
style: "decimal",
maximumFractionDigits: 7 // minimum defaults to 0
};
var deDecimalFormatter =
new Intl.NumberFormat("de-DE", deDecimalOptions);
assertParts(deDecimalFormatter, 42,
[Integer("42")]);
assertParts(deDecimalFormatter, 1337,
[Integer("1"), Group("."), Integer("337")]);
assertParts(deDecimalFormatter, -6.25,
[MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
assertParts(deDecimalFormatter, -1376.25,
[MinusSign("-"),
Integer("1"),
Group("."),
Integer("376"),
Decimal(","),
Fraction("25")]);
assertParts(deDecimalFormatter, 124816.8359375,
[Integer("124"),
Group("."),
Integer("816"),
Decimal(","),
Fraction("8359375")]);
var deNoGroupingDecimalOptions =
{
style: "decimal",
useGrouping: false,
maximumFractionDigits: 7 // minimum defaults to 0
};
var deNoGroupingDecimalFormatter =
new Intl.NumberFormat("de-DE", deNoGroupingDecimalOptions);
assertParts(deNoGroupingDecimalFormatter, 1337,
[Integer("1337")]);
assertParts(deNoGroupingDecimalFormatter, -6.25,
[MinusSign("-"), Integer("6"), Decimal(","), Fraction("25")]);
assertParts(deNoGroupingDecimalFormatter, -1376.25,
[MinusSign("-"),
Integer("1376"),
Decimal(","),
Fraction("25")]);
assertParts(deNoGroupingDecimalFormatter, 124816.8359375,
[Integer("124816"),
Decimal(","),
Fraction("8359375")]);
}