Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
// Test number-format options are accepted by Intl.PluralRules.
for (let minimumIntegerDigits of [undefined, 1, 21]) {
for (let minimumFractionDigits of [undefined, 0, 20]) {
for (let maximumFractionDigits of [undefined, 0, 20]) {
for (let minimumSignificantDigits of [undefined, 0, 21]) {
for (let maximumSignificantDigits of [undefined, 0, 21]) {
for (let roundingPriority of [undefined, "morePrecision"]) {
for (let roundingIncrement of [undefined, 5000]) {
for (let roundingMode of [undefined, "trunc"]) {
for (let trailingZeroDisplay of [undefined, "stripIfInteger"]) {
let options = {
minimumIntegerDigits,
minimumFractionDigits,
maximumFractionDigits,
minimumSignificantDigits,
maximumSignificantDigits,
roundingPriority,
roundingIncrement,
roundingMode,
trailingZeroDisplay,
};
let pl;
try {
pl = new Intl.PluralRules("en", options);
} catch (e) {
// Ignore exception from conflicting options.
continue;
}
// InitializePluralRules:
// 8. Perform ? SetNumberFormatDigitOptions(pluralRules, options, +0𝔽, 3𝔽, "standard").
let mnfdDefault = 0;
let mxfdDefault = 3;
// SetNumberFormatDigitOptions:
// 13. If roundingIncrement is not 1, set mxfdDefault to mnfdDefault.
if (roundingIncrement > 1) {
mxfdDefault = mnfdDefault;
}
// 17. If mnsd is not undefined or mxsd is not undefined, then
// a. Let hasSd be true.
// 18. Else,
// a. Let hasSd be false.
let hasSd = minimumSignificantDigits !== undefined || maximumSignificantDigits !== undefined;
// 21. Let needSd be true.
// 22. Let needFd be true.
let needSd = true;
let needFd = true;
// 23. If roundingPriority is "auto", then
// a. Set needSd to hasSd.
// b. If needSd is true, or hasFd is false and notation is "compact", then
// i. Set needFd to false.
if ((roundingPriority ?? "auto") === "auto") {
needSd = hasSd;
if (needSd) {
needFd = false;
}
}
// 24. If needSd is true, then
// a. If hasSd is true, then
// i. Set intlObj.[[MinimumSignificantDigits]] to ? DefaultNumberOption(mnsd, 1, 21, 1).
// ii. Set intlObj.[[MaximumSignificantDigits]] to ? DefaultNumberOption(mxsd, intlObj.[[MinimumSignificantDigits]], 21, 21).
// b. Else,
// i. Set intlObj.[[MinimumSignificantDigits]] to 1.
// ii. Set intlObj.[[MaximumSignificantDigits]] to 21.
let mnsd = undefined;
let mxsd = undefined;
if (needSd) {
mnsd = minimumSignificantDigits ?? 1;
mxsd = maximumSignificantDigits ?? 21;
}
// 25. If needFd is true, then
// a. If hasFd is true, then
// i. Set mnfd to ? DefaultNumberOption(mnfd, 0, 20, undefined).
// ii. Set mxfd to ? DefaultNumberOption(mxfd, 0, 20, undefined).
// iii. If mnfd is undefined, set mnfd to min(mnfdDefault, mxfd).
// iv. Else if mxfd is undefined, set mxfd to max(mxfdDefault, mnfd).
// v. Else if mnfd is greater than mxfd, throw a RangeError exception.
// vi. Set intlObj.[[MinimumFractionDigits]] to mnfd.
// vii. Set intlObj.[[MaximumFractionDigits]] to mxfd.
// b. Else,
// i. Set intlObj.[[MinimumFractionDigits]] to mnfdDefault.
// ii. Set intlObj.[[MaximumFractionDigits]] to mxfdDefault.
let mnfd = undefined;
let mxfd = undefined;
if (needFd) {
mnfd = minimumFractionDigits ?? mnfdDefault;
mxfd = maximumFractionDigits ?? Math.max(mxfdDefault, mnfd);
}
// 26. If needSd is false and needFd is false, then
// a. Set intlObj.[[MinimumFractionDigits]] to 0.
// b. Set intlObj.[[MaximumFractionDigits]] to 0.
// c. Set intlObj.[[MinimumSignificantDigits]] to 1.
// d. Set intlObj.[[MaximumSignificantDigits]] to 2.
// e. Set intlObj.[[RoundingType]] to morePrecision.
if (!needSd && !needFd) {
mnfd = 0;
mxfd = 0;
mnsd = 1;
mxsd = 2;
}
let resolved = pl.resolvedOptions();
assertEq(resolved.minimumIntegerDigits, minimumIntegerDigits ?? 1);
assertEq(resolved.minimumFractionDigits, mnfd);
assertEq(resolved.maximumFractionDigits, mxfd);
assertEq(resolved.minimumSignificantDigits, mnsd);
assertEq(resolved.maximumSignificantDigits, mxsd);
assertEq(resolved.roundingPriority, roundingPriority ?? "auto");
assertEq(resolved.roundingIncrement, roundingIncrement ?? 1);
assertEq(resolved.roundingMode, roundingMode ?? "halfExpand");
assertEq(resolved.trailingZeroDisplay, trailingZeroDisplay ?? "auto");
}
}
}
}
}
}
}
}
}
if (typeof reportCompare === "function")
reportCompare(0, 0, 'ok');