package com.vdurmont.emoji; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.*; import static org.junit.Assert.assertTrue; /** * Test that checks emoji json. * <p> * Currently contains checks for: * <ul> * <li>Unicode emoji presents in json</li> * <li>Right fitzpatric flag for emoji</li> * </ul> * * <p> * The test data is taken from: <a href="http://unicode.org/Public/emoji/4.0/emoji-test.txt">Unicode test data</a> * related to unicode 9.0 */ @RunWith(Parameterized.class) public class EmojiJsonTest { @Parameterized.Parameters public static Collection<String> emojis() throws IOException { final InputStream is = EmojiJsonTest.class.getClassLoader().getResourceAsStream("emoji-test.txt"); return EmojiTestDataReader.getEmojiList(is); } private static final int[] FITZPATRIC_CODEPOINTS = new int[]{ EmojiTestDataReader.convertFromCodepoint("1F3FB"), EmojiTestDataReader.convertFromCodepoint("1F3FC"), EmojiTestDataReader.convertFromCodepoint("1F3FD"), EmojiTestDataReader.convertFromCodepoint("1F3FE"), EmojiTestDataReader.convertFromCodepoint("1F3FF") }; @Parameterized.Parameter public String emoji; @Ignore("1665 emoji still has not been added") @Test public void checkEmojiExisting() throws Exception { assertTrue("Asserting for emoji: " + emoji, EmojiManager.isEmoji(emoji)); } @Test public void checkEmojiFitzpatricFlag() throws Exception { final int len = emoji.toCharArray().length; boolean shouldContainFitzpatric = false; int codepoint; for (int i = 0; i < len; i++) { codepoint = emoji.codePointAt(i); shouldContainFitzpatric = Arrays.binarySearch(FITZPATRIC_CODEPOINTS, codepoint) >= 0; if (shouldContainFitzpatric) { break; } } if (shouldContainFitzpatric) { EmojiParser.parseFromUnicode(emoji, new EmojiParser.EmojiTransformer() { public String transform(EmojiParser.UnicodeCandidate unicodeCandidate) { if (unicodeCandidate.hasFitzpatrick()) { assertTrue("Asserting emoji contains fitzpatric: " + emoji + " " + unicodeCandidate.getEmoji(), unicodeCandidate.getEmoji().supportsFitzpatrick()); } return ""; } }); } } private static class EmojiTestDataReader { static List<String> getEmojiList(final InputStream emojiFileStream) throws IOException { final BufferedReader reader = new BufferedReader(new InputStreamReader(emojiFileStream)); final List<String> result = new LinkedList<String>(); String line = reader.readLine(); String [] lineSplit; while (line != null) { if (!line.startsWith("#") && !line.startsWith(" ") && !line.startsWith("\n") && line.length() != 0) { lineSplit = line.split(";"); result.add(convertToEmoji(lineSplit[0].trim())); } line = reader.readLine(); } return result; } private static String convertToEmoji(final String input) { String[] emojiCodepoints = input.split(" "); StringBuilder sb = new StringBuilder(); for (String emojiCodepoint : emojiCodepoints) { int codePoint = convertFromCodepoint(emojiCodepoint); sb.append(Character.toChars(codePoint)); } return sb.toString(); } static int convertFromCodepoint(String emojiCodepointAsString) { return Integer.parseInt(emojiCodepointAsString, 16); } } }