mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 16:07:46 +00:00
LibJS: Start implementing the stage 3 Intl.DurationFormat proposal
This commit is contained in:
parent
e1ee33ba7c
commit
97fe37bcc2
14 changed files with 998 additions and 0 deletions
|
@ -0,0 +1,3 @@
|
|||
test("basic functionality", () => {
|
||||
expect(Intl.DurationFormat.prototype[Symbol.toStringTag]).toBe("Intl.DurationFormat");
|
||||
});
|
|
@ -0,0 +1,389 @@
|
|||
describe("errors", () => {
|
||||
test("called without new", () => {
|
||||
expect(() => {
|
||||
Intl.DurationFormat();
|
||||
}).toThrowWithMessage(
|
||||
TypeError,
|
||||
"Intl.DurationFormat constructor must be called with 'new'"
|
||||
);
|
||||
});
|
||||
|
||||
test("structurally invalid tag", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("root");
|
||||
}).toThrowWithMessage(RangeError, "root is not a structurally valid language tag");
|
||||
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en-");
|
||||
}).toThrowWithMessage(RangeError, "en- is not a structurally valid language tag");
|
||||
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("Latn");
|
||||
}).toThrowWithMessage(RangeError, "Latn is not a structurally valid language tag");
|
||||
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en-u-aa-U-aa");
|
||||
}).toThrowWithMessage(RangeError, "en-u-aa-U-aa is not a structurally valid language tag");
|
||||
});
|
||||
|
||||
test("options is an invalid type", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", null);
|
||||
}).toThrowWithMessage(TypeError, "Options is not an object");
|
||||
});
|
||||
|
||||
test("localeMatcher option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { localeMatcher: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option localeMatcher");
|
||||
});
|
||||
|
||||
test("style option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option style");
|
||||
});
|
||||
|
||||
test("years option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { years: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option years");
|
||||
});
|
||||
|
||||
test("yearsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { yearsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option yearsDisplay");
|
||||
});
|
||||
|
||||
test("months option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { months: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option months");
|
||||
});
|
||||
|
||||
test("monthsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { monthsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option monthsDisplay");
|
||||
});
|
||||
|
||||
test("weeks option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { weeks: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option weeks");
|
||||
});
|
||||
|
||||
test("weeksDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { weeksDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option weeksDisplay");
|
||||
});
|
||||
|
||||
test("days option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { days: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option days");
|
||||
});
|
||||
|
||||
test("daysDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { daysDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option daysDisplay");
|
||||
});
|
||||
|
||||
test("hours option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { hours: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option hours");
|
||||
});
|
||||
|
||||
test("hoursDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { hoursDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option hoursDisplay");
|
||||
});
|
||||
|
||||
test("minutes option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { minutes: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option minutes");
|
||||
});
|
||||
|
||||
test("minutesDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { minutesDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option minutesDisplay");
|
||||
});
|
||||
|
||||
test("seconds option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { seconds: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option seconds");
|
||||
});
|
||||
|
||||
test("secondsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { secondsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option secondsDisplay");
|
||||
});
|
||||
|
||||
test("milliseconds option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { milliseconds: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option milliseconds");
|
||||
});
|
||||
|
||||
test("millisecondsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { millisecondsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(
|
||||
RangeError,
|
||||
"hello! is not a valid value for option millisecondsDisplay"
|
||||
);
|
||||
});
|
||||
|
||||
test("microseconds option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { microseconds: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option microseconds");
|
||||
});
|
||||
|
||||
test("microsecondsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { microsecondsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(
|
||||
RangeError,
|
||||
"hello! is not a valid value for option microsecondsDisplay"
|
||||
);
|
||||
});
|
||||
|
||||
test("nanoseconds option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { nanoseconds: "hello!" });
|
||||
}).toThrowWithMessage(RangeError, "hello! is not a valid value for option nanoseconds");
|
||||
});
|
||||
|
||||
test("nanosecondsDisplay option is invalid", () => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { nanosecondsDisplay: "hello!" });
|
||||
}).toThrowWithMessage(
|
||||
RangeError,
|
||||
"hello! is not a valid value for option nanosecondsDisplay"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("normal behavior", () => {
|
||||
test("length is 0", () => {
|
||||
expect(Intl.DurationFormat).toHaveLength(0);
|
||||
});
|
||||
|
||||
test("all valid localeMatcher options", () => {
|
||||
["lookup", "best fit"].forEach(localeMatcher => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { localeMatcher: localeMatcher });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid style options", () => {
|
||||
["long", "short", "narrow", "digital"].forEach(style => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: style });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid years options", () => {
|
||||
["long", "short", "narrow"].forEach(years => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { years: years });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid yearsDisplay options", () => {
|
||||
["always", "auto"].forEach(yearsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { yearsDisplay: yearsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid months options", () => {
|
||||
["long", "short", "narrow"].forEach(months => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { months: months });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid monthsDisplay options", () => {
|
||||
["always", "auto"].forEach(monthsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { monthsDisplay: monthsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid weeks options", () => {
|
||||
["long", "short", "narrow"].forEach(weeks => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { weeks: weeks });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid weeksDisplay options", () => {
|
||||
["always", "auto"].forEach(weeksDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { weeksDisplay: weeksDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid days options", () => {
|
||||
["long", "short", "narrow"].forEach(days => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { days: days });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid daysDisplay options", () => {
|
||||
["always", "auto"].forEach(daysDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { daysDisplay: daysDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid hours options", () => {
|
||||
["long", "short", "narrow"].forEach(hours => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { hours: hours });
|
||||
}).not.toThrow();
|
||||
});
|
||||
["numeric", "2-digit"].forEach(seconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", hours: seconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid hoursDisplay options", () => {
|
||||
["always", "auto"].forEach(hoursDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { hoursDisplay: hoursDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid minutes options", () => {
|
||||
["long", "short", "narrow"].forEach(minutes => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { minutes: minutes });
|
||||
}).not.toThrow();
|
||||
});
|
||||
["numeric", "2-digit"].forEach(seconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", minutes: seconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid minutesDisplay options", () => {
|
||||
["always", "auto"].forEach(minutesDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { minutesDisplay: minutesDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid seconds options", () => {
|
||||
["long", "short", "narrow"].forEach(seconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { seconds: seconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
["numeric", "2-digit"].forEach(seconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", seconds: seconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid secondsDisplay options", () => {
|
||||
["always", "auto"].forEach(secondsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { secondsDisplay: secondsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid milliseconds options", () => {
|
||||
["long", "short", "narrow"].forEach(milliseconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { milliseconds: milliseconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", milliseconds: "numeric" });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
test("all valid millisecondsDisplay options", () => {
|
||||
["always", "auto"].forEach(millisecondsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { millisecondsDisplay: millisecondsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid microseconds options", () => {
|
||||
["long", "short", "narrow"].forEach(microseconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { microseconds: microseconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", microseconds: "numeric" });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
test("all valid microsecondsDisplay options", () => {
|
||||
["always", "auto"].forEach(microsecondsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { microsecondsDisplay: microsecondsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid nanoseconds options", () => {
|
||||
["long", "short", "narrow", "numeric"].forEach(nanoseconds => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { nanoseconds: nanoseconds });
|
||||
}).not.toThrow();
|
||||
});
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { style: "digital", nanoseconds: "numeric" });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
test("all valid nanosecondsDisplay options", () => {
|
||||
["always", "auto"].forEach(nanosecondsDisplay => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { nanosecondsDisplay: nanosecondsDisplay });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
test("all valid fractionalDigits options", () => {
|
||||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(fractionalDigits => {
|
||||
expect(() => {
|
||||
new Intl.DurationFormat("en", { fractionalDigits: fractionalDigits });
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue