1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 08:17:35 +00:00

LibJS: Start implementing the stage 3 Intl.DurationFormat proposal

This commit is contained in:
Idan Horowitz 2022-06-30 00:58:40 +03:00
parent e1ee33ba7c
commit 97fe37bcc2
14 changed files with 998 additions and 0 deletions

View file

@ -0,0 +1,3 @@
test("basic functionality", () => {
expect(Intl.DurationFormat.prototype[Symbol.toStringTag]).toBe("Intl.DurationFormat");
});

View file

@ -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();
});
});
});