Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!this.hasOwnProperty('Intl')||!Intl.hasOwnProperty("DurationFormat"))
const {
Integer, Group, Decimal, Fraction, Literal, Unit
} = NumberFormatParts;
const {
Year, Month, Week, Day, Hour, Minute, Second, Millisecond, Microsecond, Nanosecond
} = DurationFormatParts;
const tests = {
"en": [
{
options: {},
data: [
{
duration: {years: 1},
expected: [
...Year(Integer("1"), Literal(" "), Unit("yr")),
],
},
{
duration: {years: 2},
expected: [
...Year(Integer("2"), Literal(" "), Unit("yrs")),
],
},
],
},
],
"de": [
{
options: {style: "long"},
data: [
{
duration: {years: 1, months: 2, weeks: 3, days: 4},
expected: [
...Year(Integer("1"), Literal(" "), Unit("Jahr")),
Literal(", "),
...Month(Integer("2"), Literal(" "), Unit("Monate")),
Literal(", "),
...Week(Integer("3"), Literal(" "), Unit("Wochen")),
Literal(" und "),
...Day(Integer("4"), Literal(" "), Unit("Tage")),
],
},
{
duration: {hours: 1, minutes: 2},
expected: [
...Hour(Integer("1"), Literal(" "), Unit("Stunde")),
Literal(", "),
...Minute(Integer("2"), Literal(" "), Unit("Minuten")),
],
},
{
duration: {minutes: 3, seconds: 4},
expected: [
...Minute(Integer("3"), Literal(" "), Unit("Minuten")),
Literal(", "),
...Second(Integer("4"), Literal(" "), Unit("Sekunden")),
],
},
{
duration: {seconds: 5, milliseconds: 6},
expected: [
...Second(Integer("5"), Literal(" "), Unit("Sekunden")),
Literal(", "),
...Millisecond(Integer("6"), Literal(" "), Unit("Millisekunden")),
],
},
{
duration: {milliseconds: 7, microseconds: 8},
expected: [
...Millisecond(Integer("7"), Literal(" "), Unit("Millisekunden")),
Literal(", "),
...Microsecond(Integer("8"), Literal(" "), Unit("Mikrosekunden")),
],
},
{
duration: {microseconds: 9, nanoseconds: 10},
expected: [
...Microsecond(Integer("9"), Literal(" "), Unit("Mikrosekunden")),
Literal(", "),
...Nanosecond(Integer("10"), Literal(" "), Unit("Nanosekunden")),
],
},
// Gaps between time units.
{
duration: {hours: 1, seconds: 2},
expected: [
...Hour(Integer("1"), Literal(" "), Unit("Stunde")),
Literal(", "),
...Second(Integer("2"), Literal(" "), Unit("Sekunden")),
],
},
{
duration: {hours: 3, milliseconds: 4},
expected: [
...Hour(Integer("3"), Literal(" "), Unit("Stunden")),
Literal(", "),
...Millisecond(Integer("4"), Literal(" "), Unit("Millisekunden")),
],
},
{
duration: {hours: 5, microseconds: 6},
expected: [
...Hour(Integer("5"), Literal(" "), Unit("Stunden")),
Literal(", "),
...Microsecond(Integer("6"), Literal(" "), Unit("Mikrosekunden")),
],
},
{
duration: {hours: 7, nanoseconds: 9},
expected: [
...Hour(Integer("7"), Literal(" "), Unit("Stunden")),
Literal(", "),
...Nanosecond(Integer("9"), Literal(" "), Unit("Nanosekunden")),
],
},
],
},
{
options: {style: "short"},
data: [
{
duration: {years: 1, months: 2, weeks: 3, days: 4},
expected: [
...Year(Integer("1"), Literal(" "), Unit("J")),
Literal(", "),
...Month(Integer("2"), Literal(" "), Unit("Mon.")),
Literal(", "),
...Week(Integer("3"), Literal(" "), Unit("Wo.")),
Literal(" und "),
...Day(Integer("4"), Literal(" "), Unit("Tg.")),
],
},
{
duration: {hours: 1, minutes: 2},
expected: [
...Hour(Integer("1"), Literal(" "), Unit("Std.")),
Literal(", "),
...Minute(Integer("2"), Literal(" "), Unit("Min.")),
],
},
{
duration: {minutes: 3, seconds: 4},
expected: [
...Minute(Integer("3"), Literal(" "), Unit("Min.")),
Literal(", "),
...Second(Integer("4"), Literal(" "), Unit("Sek.")),
],
},
{
duration: {seconds: 5, milliseconds: 6},
expected: [
...Second(Integer("5"), Literal(" "), Unit("Sek.")),
Literal(", "),
...Millisecond(Integer("6"), Literal(" "), Unit("ms")),
],
},
{
duration: {milliseconds: 7, microseconds: 8},
expected: [
...Millisecond(Integer("7"), Literal(" "), Unit("ms")),
Literal(", "),
...Microsecond(Integer("8"), Literal(" "), Unit("μs")),
],
},
{
duration: {microseconds: 9, nanoseconds: 10},
expected: [
...Microsecond(Integer("9"), Literal(" "), Unit("μs")),
Literal(", "),
...Nanosecond(Integer("10"), Literal(" "), Unit("ns")),
],
},
],
},
{
options: {style: "narrow"},
data: [
{
duration: {years: 1, months: 2, weeks: 3, days: 4},
expected: [
...Year(Integer("1"), Literal(" "), Unit("J")),
Literal(", "),
...Month(Integer("2"), Literal(" "), Unit("M")),
Literal(", "),
...Week(Integer("3"), Literal(" "), Unit("W")),
Literal(" und "),
...Day(Integer("4"), Literal(" "), Unit("T")),
],
},
{
duration: {hours: 1, minutes: 2},
expected: [
...Hour(Integer("1"), Literal(" "), Unit("Std.")),
Literal(", "),
...Minute(Integer("2"), Literal(" "), Unit("Min.")),
],
},
{
duration: {minutes: 3, seconds: 4},
expected: [
...Minute(Integer("3"), Literal(" "), Unit("Min.")),
Literal(", "),
...Second(Integer("4"), Literal(" "), Unit("Sek.")),
],
},
{
duration: {seconds: 5, milliseconds: 6},
expected: [
...Second(Integer("5"), Literal(" "), Unit("Sek.")),
Literal(", "),
...Millisecond(Integer("6"), Literal(" "), Unit("ms")),
],
},
{
duration: {milliseconds: 7, microseconds: 8},
expected: [
...Millisecond(Integer("7"), Literal(" "), Unit("ms")),
Literal(", "),
...Microsecond(Integer("8"), Literal(" "), Unit("μs")),
],
},
{
duration: {microseconds: 9, nanoseconds: 10},
expected: [
...Microsecond(Integer("9"), Literal(" "), Unit("μs")),
Literal(", "),
...Nanosecond(Integer("10"), Literal(" "), Unit("ns")),
],
},
],
},
],
"fr": [
{
options: {style: "digital"},
data: [
// "digital" style defaults to "short" for non-numeric parts.
{
duration: {years: 111, months: 222, weeks: 333, days: 444},
expected: [
...Year(Integer("111"), Literal(" "), Unit("ans")),
Literal(", "),
...Month(Integer("222"), Literal(" "), Unit("m.")),
Literal(", "),
...Week(Integer("333"), Literal(" "), Unit("sem.")),
Literal(", "),
...Day(Integer("444"), Literal(" "), Unit("j")),
Literal(" et "),
...Hour(Integer("0")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("00")),
],
},
{
duration: {hours: 1, minutes: 0},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("00")),
],
},
{
duration: {hours: 1, minutes: 2},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("02")),
Literal(":"),
...Second(Integer("00")),
],
},
// Fractional digits default to min=0 and max=9.
{
duration: {hours: 1, minutes: 2, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("02")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
// Zero unit digital parts aren't omitted.
{
duration: {hours: 1, minutes: 0, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
],
},
{
options: {style: "digital", fractionalDigits: 9},
data: [
{
duration: {hours: 1, minutes: 2, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("02")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
{
duration: {hours: 1, minutes: 0, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
],
},
{
options: {
style: "digital",
hoursDisplay: "always",
minutesDisplay: "always",
secondsDisplay: "always",
fractionalDigits: 9,
},
data: [
{
duration: {hours: 1},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("00"), Decimal(","), Fraction("000000000")),
],
},
{
duration: {hours: 1, minutes: 2},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("02")),
Literal(":"),
...Second(Integer("00"), Decimal(","), Fraction("000000000")),
],
},
{
duration: {hours: 1, minutes: 2, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("02")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
{
duration: {hours: 1, minutes: 0, seconds: 3, milliseconds: 4, microseconds: 5, nanoseconds: 6},
expected: [
...Hour(Integer("1")),
Literal(":"),
...Minute(Integer("00")),
Literal(":"),
...Second(Integer("03"), Decimal(","), Fraction("004005006")),
],
},
],
},
],
"es": [
{
options: {
seconds: "2-digit",
fractionalDigits: 3,
},
data: [
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("000"))],
},
{
duration: {seconds: 0, milliseconds: 1, microseconds: 2, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 1002003},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 123001002003},
expected: [...Second(Integer("123"), Decimal(","), Fraction("001"))],
},
],
},
{
options: {
seconds: "2-digit",
fractionalDigits: 6,
},
data: [
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("000000"))],
},
{
duration: {seconds: 0, milliseconds: 1, microseconds: 2, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001002"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 1002003},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001002"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 123001002003},
expected: [...Second(Integer("123"), Decimal(","), Fraction("001002"))],
},
],
},
{
options: {
seconds: "2-digit",
fractionalDigits: 9,
},
data: [
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("000000003"))],
},
{
duration: {seconds: 0, milliseconds: 1, microseconds: 2, nanoseconds: 3},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001002003"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 1002003},
expected: [...Second(Integer("00"), Decimal(","), Fraction("001002003"))],
},
{
duration: {seconds: 0, milliseconds: 0, microseconds: 0, nanoseconds: 123001002003},
expected: [...Second(Integer("123"), Decimal(","), Fraction("001002003"))],
},
],
},
],
"ar-EG": [
{
options: {
years: "long",
months: "short",
weeks: "short",
days: "narrow",
yearsDisplay: "always",
monthsDisplay: "always",
weeksDisplay: "always",
daysDisplay: "always",
},
data: [
{
duration: {years: 100, months: 200, weeks: 0, days: 1000},
expected: [
...Year(Integer("١٠٠"), Literal(" "), Unit("سنة")),
Literal("، و"),
...Month(Integer("٢٠٠"), Literal(" "), Unit("شهر")),
Literal("، و"),
...Week(Integer("٠"), Literal(" "), Unit("أسبوع")),
Literal("، و"),
...Day(Integer("١"), Group("٬"), Integer("٠٠٠"), Literal(" "), Unit("ي")),
],
},
],
}
],
"zh": [
{
options: {
years: "narrow",
months: "narrow",
weeks: "short",
days: "short",
yearsDisplay: "always",
monthsDisplay: "always",
weeksDisplay: "always",
daysDisplay: "always",
hoursDisplay: "always",
minutesDisplay: "always",
secondsDisplay: "always",
millisecondsDisplay: "always",
microsecondsDisplay: "always",
nanosecondsDisplay: "always",
},
data: [
{
duration: {years: 100, months: 200, weeks: 0, days: 1000},
expected: [
...Year(Integer("100"), Unit("年")),
...Month(Integer("200"), Unit("个月")),
...Week(Integer("0"), Unit("周")),
...Day(Integer("1"), Group(","), Integer("000"), Unit("天")),
...Hour(Integer("0"), Unit("小时")),
...Minute(Integer("0"), Unit("分钟")),
...Second(Integer("0"), Unit("秒")),
...Millisecond(Integer("0"), Unit("毫秒")),
...Microsecond(Integer("0"), Unit("微秒")),
...Nanosecond(Integer("0"), Unit("纳秒")),
],
},
{
duration: {years: 0},
expected: [
...Year(Integer("0"), Unit("年")),
...Month(Integer("0"), Unit("个月")),
...Week(Integer("0"), Unit("周")),
...Day(Integer("0"), Unit("天")),
...Hour(Integer("0"), Unit("小时")),
...Minute(Integer("0"), Unit("分钟")),
...Second(Integer("0"), Unit("秒")),
...Millisecond(Integer("0"), Unit("毫秒")),
...Microsecond(Integer("0"), Unit("微秒")),
...Nanosecond(Integer("0"), Unit("纳秒")),
],
},
{
duration: {nanoseconds: 0},
expected: [
...Year(Integer("0"), Unit("年")),
...Month(Integer("0"), Unit("个月")),
...Week(Integer("0"), Unit("周")),
...Day(Integer("0"), Unit("天")),
...Hour(Integer("0"), Unit("小时")),
...Minute(Integer("0"), Unit("分钟")),
...Second(Integer("0"), Unit("秒")),
...Millisecond(Integer("0"), Unit("毫秒")),
...Microsecond(Integer("0"), Unit("微秒")),
...Nanosecond(Integer("0"), Unit("纳秒")),
],
},
],
}
],
};
for (let [locale, list] of Object.entries(tests)) {
for (let {options, data} of list) {
let df = new Intl.DurationFormat(locale, options);
for (let {duration, expected} of data) {
let str = PartsToString(expected);
assertEq(df.format(duration), str,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
let parts = df.formatToParts(duration);
assertEq(PartsToString(parts), str,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
assertEq(parts.length, expected.length,
`${locale} [${JSON.stringify(options)}]: ${JSON.stringify(duration)}`);
assertDeepEq(parts, expected);
}
}
}
if (typeof reportCompare === "function")
reportCompare(true, true);