182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/*
282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Copyright (C) 2017 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 */
1682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpackage android.support.text.emoji;
1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
1882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.Emoji.EMOJI_SINGLE_CODEPOINT;
1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.EmojiMatcher.hasEmoji;
2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.EmojiMatcher.hasEmojiCount;
2182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
223dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinirimport static org.junit.Assert.assertEquals;
233dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinirimport static org.junit.Assert.assertFalse;
2482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.junit.Assert.assertThat;
253dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinirimport static org.junit.Assert.assertTrue;
2682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Matchers.any;
2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.doThrow;
2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.mock;
2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.times;
3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.verify;
3182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
329546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.annotation.TargetApi;
3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.content.Context;
343dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinirimport android.graphics.Color;
3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.InstrumentationRegistry;
369546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress;
3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest;
3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4;
3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.util.TestString;
4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Before;
4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test;
4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith;
4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest
4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class)
4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class ConfigTest {
4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    Context mContext;
5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Before
5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void setup() {
5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        mContext = InstrumentationRegistry.getTargetContext();
5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
5682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test(expected = NullPointerException.class)
5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testConstructor_throwsExceptionIfMetadataLoaderNull() {
5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        new TestConfigBuilder.TestConfig(null);
5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test(expected = NullPointerException.class)
6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testInitCallback_throwsExceptionIfNull() {
6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        new ValidTestConfig().registerInitCallback(null);
6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test(expected = NullPointerException.class)
6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testUnregisterInitCallback_throwsExceptionIfNull() {
6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        new ValidTestConfig().unregisterInitCallback(null);
6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
729546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19)
739546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @TargetApi(19)
7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testBuild_withDefaultValues() {
7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new ValidTestConfig().setReplaceAll(true);
7682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final CharSequence processed = emojiCompat.process(new TestString(EMOJI_SINGLE_CODEPOINT)
8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .toString());
8182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        assertThat(processed, hasEmojiCount(1));
8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        assertThat(processed, hasEmoji(EMOJI_SINGLE_CODEPOINT));
8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testInitCallback_callsSuccessCallback() {
8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new ValidTestConfig().registerInitCallback(initCallback1)
9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(initCallback2);
9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        EmojiCompat.reset(config);
9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback1, times(1)).onInitialized();
9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback2, times(1)).onInitialized();
9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
1009546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19) //Fail callback never called for pre 19
1019546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @TargetApi(19)
10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testInitCallback_callsFailCallback() {
10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.MetadataLoader loader = mock(EmojiCompat.MetadataLoader.class);
10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        doThrow(new RuntimeException("")).when(loader).load(any(EmojiCompat.LoaderCallback
10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .class));
10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(initCallback1)
11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(initCallback2);
11282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        EmojiCompat.reset(config);
11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
11482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
11582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback1, times(1)).onFailed(any(Throwable.class));
11682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback2, times(1)).onFailed(any(Throwable.class));
11782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
11882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
1193dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    @Test
1203dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    public void testBuild_withEmojiSpanIndicator() {
1213dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        EmojiCompat.Config config = new ValidTestConfig();
1223dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        EmojiCompat emojiCompat = EmojiCompat.reset(config);
1233dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1243dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        assertFalse(emojiCompat.isEmojiSpanIndicatorEnabled());
1253dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1263dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        config = new ValidTestConfig().setEmojiSpanIndicatorEnabled(true);
1273dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        emojiCompat = EmojiCompat.reset(config);
1283dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1293dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        assertTrue(emojiCompat.isEmojiSpanIndicatorEnabled());
1303dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    }
1313dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1323dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    @Test
1333dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    public void testBuild_withEmojiSpanIndicatorColor() {
1343dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        EmojiCompat.Config config = new ValidTestConfig();
1353dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        EmojiCompat emojiCompat = EmojiCompat.reset(config);
1363dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1373dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        assertEquals(Color.GREEN, emojiCompat.getEmojiSpanIndicatorColor());
1383dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1393dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        config = new ValidTestConfig().setEmojiSpanIndicatorColor(Color.RED);
1403dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        emojiCompat = EmojiCompat.reset(config);
1413dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1423dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        assertEquals(Color.RED, emojiCompat.getEmojiSpanIndicatorColor());
1433dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    }
1443dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1453dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    @Test
1463dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    public void testBuild_defaultEmojiSpanIndicatorColor() {
1473dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        final EmojiCompat.Config config = new ValidTestConfig().setEmojiSpanIndicatorEnabled(true);
1483dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
1493dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
1503dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir        assertTrue(emojiCompat.isEmojiSpanIndicatorEnabled());
1513dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir    }
1523dc8b512ac3a1a8fb0b7b2618246d50fd2f3367bSiyamed Sinir
15382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    private static class ValidTestConfig extends EmojiCompat.Config {
15482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        ValidTestConfig() {
15582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            super(new TestConfigBuilder.TestEmojiDataLoader());
15682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        }
15782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
15882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir}
159