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

LibJS: Implement Intl.ListFormat.prototype.formatToParts

This commit is contained in:
Timothy Flynn 2021-09-06 14:57:57 -04:00 committed by Linus Groh
parent cdba40f7ea
commit 5c06a91dfa
4 changed files with 291 additions and 0 deletions

View file

@ -0,0 +1,231 @@
describe("errors", () => {
function SomeError() {}
test("called on non-ListFormat object", () => {
expect(() => {
Intl.ListFormat.prototype.formatToParts([]);
}).toThrowWithMessage(TypeError, "Not a Intl.ListFormat object");
});
test("called with non-string iterable", () => {
expect(() => {
new Intl.ListFormat().formatToParts([1]);
}).toThrowWithMessage(TypeError, "1 is not a string");
});
test("called with iterable that throws immediately", () => {
let iterable = {
[Symbol.iterator]() {
throw new SomeError();
},
};
expect(() => {
new Intl.ListFormat().formatToParts(iterable);
}).toThrow(SomeError);
});
test("called with iterable that throws on step", () => {
let iterable = {
[Symbol.iterator]() {
return this;
},
next() {
throw new SomeError();
},
};
expect(() => {
new Intl.ListFormat().formatToParts(iterable);
}).toThrow(SomeError);
});
test("called with iterable that throws on value resolution", () => {
let iterable = {
[Symbol.iterator]() {
return this;
},
next() {
return {
done: false,
get value() {
throw new SomeError();
},
};
},
};
expect(() => {
new Intl.ListFormat().formatToParts(iterable);
}).toThrow(SomeError);
});
});
describe("correct behavior", () => {
test("length is 1", () => {
expect(Intl.ListFormat.prototype.formatToParts).toHaveLength(1);
});
test("undefined list returns empty string", () => {
expect(new Intl.ListFormat().formatToParts(undefined)).toEqual([]);
});
});
describe("type=conjunction", () => {
test("style=long", () => {
let en = new Intl.ListFormat("en", { type: "conjunction", style: "long" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " and " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", and " },
{ type: "element", value: "c" },
]);
});
test("style=short", () => {
let en = new Intl.ListFormat("en", { type: "conjunction", style: "short" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " & " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", & " },
{ type: "element", value: "c" },
]);
});
test("style=narrow", () => {
let en = new Intl.ListFormat("en", { type: "conjunction", style: "narrow" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", " },
{ type: "element", value: "c" },
]);
});
});
describe("type=disjunction", () => {
test("style=long", () => {
let en = new Intl.ListFormat("en", { type: "disjunction", style: "long" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " or " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", or " },
{ type: "element", value: "c" },
]);
});
test("style=short", () => {
let en = new Intl.ListFormat("en", { type: "disjunction", style: "short" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " or " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", or " },
{ type: "element", value: "c" },
]);
});
test("style=narrow", () => {
let en = new Intl.ListFormat("en", { type: "disjunction", style: "narrow" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " or " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", or " },
{ type: "element", value: "c" },
]);
});
});
describe("type=unit", () => {
test("style=long", () => {
let en = new Intl.ListFormat("en", { type: "unit", style: "long" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", " },
{ type: "element", value: "c" },
]);
});
test("style=short", () => {
let en = new Intl.ListFormat("en", { type: "unit", style: "short" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: ", " },
{ type: "element", value: "b" },
{ type: "literal", value: ", " },
{ type: "element", value: "c" },
]);
});
test("style=narrow", () => {
let en = new Intl.ListFormat("en", { type: "unit", style: "narrow" });
expect(en.formatToParts(["a"])).toEqual([{ type: "element", value: "a" }]);
expect(en.formatToParts(["a", "b"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " " },
{ type: "element", value: "b" },
]);
expect(en.formatToParts(["a", "b", "c"])).toEqual([
{ type: "element", value: "a" },
{ type: "literal", value: " " },
{ type: "element", value: "b" },
{ type: "literal", value: " " },
{ type: "element", value: "c" },
]);
});
});