// |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 );
Messung V0.5 C=90 H=97 G=93
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland