blob: bb6fb347b3252a5f594ec95d638cbd01c3d79207 [file] [log] [blame]
// Copyright 2018 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.RelativeTimeFormat.prototype.formatToParts
description: Checks the behavior of Intl.RelativeTimeFormat.prototype.formatToParts() in English.
features: [Intl.RelativeTimeFormat]
locale: [en-US]
---*/
function verifyFormatParts(actual, expected, message) {
assert.sameValue(actual.length, expected.length, `${message}: length`);
for (let i = 0; i < actual.length; ++i) {
assert.sameValue(actual[i].type, expected[i].type, `${message}: parts[${i}].type`);
assert.sameValue(actual[i].value, expected[i].value, `${message}: parts[${i}].value`);
assert.sameValue(actual[i].unit, expected[i].unit, `${message}: parts[${i}].unit`);
}
}
function expected(key, unit, default_) {
// https://www.unicode.org/cldr/charts/33/summary/en.html#1530
const exceptions = {
"year": {
"-1": "last year",
"0": "this year",
"1": "next year",
},
"quarter": {
"-1": "last quarter",
"0": "this quarter",
"1": "next quarter",
},
"month": {
"-1": "last month",
"0": "this month",
"1": "next month",
},
"week": {
"-1": "last week",
"0": "this week",
"1": "next week",
},
"day": {
"-1": "yesterday",
"0": "today",
"1": "tomorrow",
},
"hour": {
"0": "this hour",
},
"minute": {
"0": "this minute",
},
"second": {
"0": "now",
},
};
const exception = exceptions[unit] || {};
if (key in exception) {
return [
{ "type": "literal", "value": exception[key] },
]
}
return default_;
}
const units = [
"second",
"minute",
"hour",
"day",
"week",
"month",
"quarter",
"year",
];
const rtf = new Intl.RelativeTimeFormat("en-US", { "numeric": "auto" });
assert.sameValue(typeof rtf.formatToParts, "function", "formatToParts should be supported");
for (const unit of units) {
verifyFormatParts(rtf.formatToParts(1000, unit), [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "1", "unit": unit },
{ "type": "group", "value": ",", "unit": unit },
{ "type": "integer", "value": "000", "unit": unit },
{ "type": "literal", "value": ` ${unit}s` },
], `formatToParts(1000, ${unit})`);
verifyFormatParts(rtf.formatToParts(10, unit), [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "10", "unit": unit },
{ "type": "literal", "value": ` ${unit}s` },
], `formatToParts(10, ${unit})`);
verifyFormatParts(rtf.formatToParts(2, unit), [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "2", "unit": unit },
{ "type": "literal", "value": ` ${unit}s` },
], `formatToParts(2, ${unit})`);
verifyFormatParts(rtf.formatToParts(1, unit), expected("1", unit, [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "1", "unit": unit },
{ "type": "literal", "value": ` ${unit}` },
]), `formatToParts(1, ${unit})`);
verifyFormatParts(rtf.formatToParts(0, unit), expected("0", unit, [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "0", "unit": unit },
{ "type": "literal", "value": ` ${unit}s` },
]), `formatToParts(0, ${unit})`);
verifyFormatParts(rtf.formatToParts(-0, unit), expected("0", unit, [
{ "type": "integer", "value": "0", "unit": unit },
{ "type": "literal", "value": ` ${unit}s ago` },
]), `formatToParts(-0, ${unit})`);
verifyFormatParts(rtf.formatToParts(-1, unit), expected("-1", unit, [
{ "type": "integer", "value": "1", "unit": unit },
{ "type": "literal", "value": ` ${unit} ago` },
]), `formatToParts(-1, ${unit})`);
verifyFormatParts(rtf.formatToParts(-2, unit), [
{ "type": "integer", "value": "2", "unit": unit },
{ "type": "literal", "value": ` ${unit}s ago` },
], `formatToParts(-2, ${unit})`);
verifyFormatParts(rtf.formatToParts(-10, unit), [
{ "type": "integer", "value": "10", "unit": unit },
{ "type": "literal", "value": ` ${unit}s ago` },
], `formatToParts(-10, ${unit})`);
verifyFormatParts(rtf.formatToParts(-1000, unit), [
{ "type": "integer", "value": "1", "unit": unit },
{ "type": "group", "value": ",", "unit": unit },
{ "type": "integer", "value": "000", "unit": unit },
{ "type": "literal", "value": ` ${unit}s ago` },
], `formatToParts(-1000, ${unit})`);
verifyFormatParts(rtf.formatToParts(123456.78, unit), [
{ "type": "literal", "value": "in " },
{ "type": "integer", "value": "123", "unit": unit },
{ "type": "group", "value": ",", "unit": unit },
{ "type": "integer", "value": "456", "unit": unit },
{ "type": "decimal", "value": ".", "unit": unit },
{ "type": "fraction", "value": "78", "unit": unit },
{ "type": "literal", "value": ` ${unit}s` },
], `formatToParts(123456.78, ${unit})`);
}