From 4decd11c4bc2bd5a45337c82916848ae686b3f97 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 6 Aug 2021 12:03:42 -0300 Subject: [PATCH] Fix emoji / CoreText crash. --- Signal/test/util/EmojiTests.swift | 39 +++++++++++++++++++------------ 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/Signal/test/util/EmojiTests.swift b/Signal/test/util/EmojiTests.swift index 37fb731b70..0527d970fb 100644 --- a/Signal/test/util/EmojiTests.swift +++ b/Signal/test/util/EmojiTests.swift @@ -13,14 +13,6 @@ class EmojiTests: SignalBaseTest { } func testSimpleEmojiCases() { - XCTAssertFalse("".isSingleEmoji) - XCTAssertTrue("๐Ÿ˜ƒ".isSingleEmoji) - XCTAssertFalse("๐Ÿ˜ƒ๐Ÿ˜ƒ".isSingleEmoji) - XCTAssertFalse("a".isSingleEmoji) - XCTAssertFalse(" ๐Ÿ˜ƒ".isSingleEmoji) - XCTAssertFalse("๐Ÿ˜ƒ ".isSingleEmoji) - XCTAssertTrue("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".isSingleEmoji) - XCTAssertFalse("".isSingleEmojiUsingEmojiWithSkinTones) XCTAssertTrue("๐Ÿ˜ƒ".isSingleEmojiUsingEmojiWithSkinTones) XCTAssertFalse("๐Ÿ˜ƒ๐Ÿ˜ƒ".isSingleEmojiUsingEmojiWithSkinTones) @@ -28,6 +20,7 @@ class EmojiTests: SignalBaseTest { XCTAssertFalse(" ๐Ÿ˜ƒ".isSingleEmojiUsingEmojiWithSkinTones) XCTAssertFalse("๐Ÿ˜ƒ ".isSingleEmojiUsingEmojiWithSkinTones) XCTAssertTrue("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".isSingleEmojiUsingEmojiWithSkinTones) + XCTAssertTrue("๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป".isSingleEmojiUsingEmojiWithSkinTones) XCTAssertFalse("".isSingleEmojiUsingCoreText) XCTAssertTrue("๐Ÿ˜ƒ".isSingleEmojiUsingCoreText) @@ -36,6 +29,8 @@ class EmojiTests: SignalBaseTest { XCTAssertFalse(" ๐Ÿ˜ƒ".isSingleEmojiUsingCoreText) XCTAssertFalse("๐Ÿ˜ƒ ".isSingleEmojiUsingCoreText) XCTAssertTrue("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".isSingleEmojiUsingCoreText) + // CoreText considers this two glyphs. + XCTAssertFalse("๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป".isSingleEmojiUsingCoreText) XCTAssertFalse("".isSingleEmojiUsingCount) XCTAssertTrue("๐Ÿ˜ƒ".isSingleEmojiUsingCount) @@ -44,16 +39,19 @@ class EmojiTests: SignalBaseTest { XCTAssertFalse(" ๐Ÿ˜ƒ".isSingleEmojiUsingCount) XCTAssertFalse("๐Ÿ˜ƒ ".isSingleEmojiUsingCount) XCTAssertTrue("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".isSingleEmojiUsingCount) + XCTAssertTrue("๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป".isSingleEmojiUsingCount) } func testEmojiCounts() { - XCTAssertEqual("".count, 0) - XCTAssertEqual("๐Ÿ˜ƒ".count, 1) - XCTAssertEqual("๐Ÿ˜ƒ๐Ÿ˜ƒ".count, 2) - XCTAssertEqual("a".count, 1) - XCTAssertEqual(" ๐Ÿ˜ƒ".count, 2) - XCTAssertEqual("๐Ÿ˜ƒ ".count, 2) - XCTAssertEqual("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".count, 1) + XCTAssertEqual("".glyphCount, 0) + XCTAssertEqual("๐Ÿ˜ƒ".glyphCount, 1) + XCTAssertEqual("๐Ÿ˜ƒ๐Ÿ˜ƒ".glyphCount, 2) + XCTAssertEqual("a".glyphCount, 1) + XCTAssertEqual(" ๐Ÿ˜ƒ".glyphCount, 2) + XCTAssertEqual("๐Ÿ˜ƒ ".glyphCount, 2) + XCTAssertEqual("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".glyphCount, 1) + // CoreText considers this two glyphs. + XCTAssertEqual("๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป".glyphCount, 2) XCTAssertEqual("".count, 0) XCTAssertEqual("๐Ÿ˜ƒ".count, 1) @@ -62,6 +60,7 @@ class EmojiTests: SignalBaseTest { XCTAssertEqual(" ๐Ÿ˜ƒ".count, 2) XCTAssertEqual("๐Ÿ˜ƒ ".count, 2) XCTAssertEqual("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ".count, 1) + XCTAssertEqual("๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป".count, 1) } func testFancyEmojiCases() { @@ -142,6 +141,16 @@ class EmojiTests: SignalBaseTest { XCTAssertEqual(fancyEmoji.count, 1) } + do { + // This emoji has two skin tones. + let fancyEmoji = "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป" + XCTAssertTrue(fancyEmoji.isSingleEmojiUsingEmojiWithSkinTones) + // CoreText considers this two glyphs. + XCTAssertFalse(fancyEmoji.isSingleEmojiUsingCoreText) + XCTAssertTrue(fancyEmoji.isSingleEmojiUsingCount) + XCTAssertEqual(fancyEmoji.count, 1) + } + do { let fancyEmoji = "๐Ÿณ" // EmojiWithSkinTones doesn't recognize this as an emoji...