import { isSingleEmoji } from "./emoji.js"; describe("isSingleEmoji", () => { it("takes one emoji however many code points it is made of", () => { expect(isSingleEmoji(`๐Ÿ‘`)).toBe(true); // A skin tone, a ZWJ family and a flag are 2, 7 and 2 code points that each draw as one mark. expect(isSingleEmoji(`๐Ÿ‘๐Ÿฝ`)).toBe(true); expect(isSingleEmoji(`๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ`)).toBe(true); expect(isSingleEmoji(`๐Ÿ‡ต๐Ÿ‡ฑ`)).toBe(true); expect(isSingleEmoji(`๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ`)).toBe(true); // A keycap leads with an ASCII digit, which is why the pictographic property alone would refuse it. expect(isSingleEmoji(`1๏ธโƒฃ`)).toBe(true); }); it("refuses everything that is not exactly one mark", () => { expect(isSingleEmoji(``)).toBe(false); expect(isSingleEmoji(`๐Ÿ‘๐Ÿ‘Ž`)).toBe(false); expect(isSingleEmoji(`a`)).toBe(false); expect(isSingleEmoji(`lgtm`)).toBe(false); // The one a length check alone would let through: an emoji with a word stuck to it. expect(isSingleEmoji(`๐Ÿ‘!`)).toBe(false); expect(isSingleEmoji(` `)).toBe(false); }); it("refuses a string too long to be one grapheme without segmenting it", () => { expect(isSingleEmoji(`๐Ÿ‘`.repeat(40))).toBe(false); }); });