182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/* 2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project 382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License"); 582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * you may not use this file except in compliance with the License. 682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * You may obtain a copy of the License at 782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * http://www.apache.org/licenses/LICENSE-2.0 982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 1082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Unless required by applicable law or agreed to in writing, software 1182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS, 1282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * See the License for the specific language governing permissions and 1482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * limitations under the License. 1582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.emoji.text; 1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 1882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.junit.Assert.assertEquals; 1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.junit.Assert.assertSame; 2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 219546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress; 2282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest; 2382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4; 2482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 2582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Before; 2682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test; 2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith; 2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest 3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class) 319546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir@SdkSuppress(minSdkVersion = 19) 3282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class MetadataRepoTest { 3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir MetadataRepo mMetadataRepo; 3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Before 3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void clearResourceIndex() { 3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo = new MetadataRepo(); 3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test(expected = NullPointerException.class) 429546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void testPut_withNullMetadata() { 4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(null); 4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test(expected = IllegalArgumentException.class) 479546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void testPut_withEmptyKeys() { 4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(new TestEmojiMetadata(new int[0])); 4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 529546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void testPut_withSingleCodePointMapping() { 5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final int[] codePoint = new int[]{1}; 5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final TestEmojiMetadata metadata = new TestEmojiMetadata(codePoint); 5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(metadata); 5682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertSame(metadata, getNode(codePoint)); 5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 609546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void testPut_withMultiCodePointsMapping() { 6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final int[] codePoint = new int[]{1, 2, 3, 4}; 6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final TestEmojiMetadata metadata = new TestEmojiMetadata(codePoint); 6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(metadata); 6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertSame(metadata, getNode(codePoint)); 6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1})); 6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1, 2})); 6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1, 2, 3})); 6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1, 2, 3, 5})); 7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 739546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void testPut_sequentialCodePoints() { 7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final int[] codePoint1 = new int[]{1, 2, 3, 4}; 7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiMetadata metadata1 = new TestEmojiMetadata(codePoint1); 7682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final int[] codePoint2 = new int[]{1, 2, 3}; 7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiMetadata metadata2 = new TestEmojiMetadata(codePoint2); 7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final int[] codePoint3 = new int[]{1, 2}; 8182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiMetadata metadata3 = new TestEmojiMetadata(codePoint3); 8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(metadata1); 8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(metadata2); 8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mMetadataRepo.put(metadata3); 8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertSame(metadata1, getNode(codePoint1)); 8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertSame(metadata2, getNode(codePoint2)); 8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertSame(metadata3, getNode(codePoint3)); 9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1})); 9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(null, getNode(new int[]{1, 2, 3, 4, 5})); 9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiMetadata getNode(final int[] codepoints) { 9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir return getNode(mMetadataRepo.getRootNode(), codepoints, 0); 9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 99ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas final EmojiMetadata getNode(MetadataRepo.Node node, final int[] codepoints, int start) { 10082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir if (codepoints.length < start) return null; 10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir if (codepoints.length == start) return node.getData(); 10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 103ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas final MetadataRepo.Node childNode = node.get(codepoints[start]); 10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir if (childNode == null) return null; 10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir return getNode(childNode, codepoints, start + 1); 10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir} 108