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