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 org.mockito.Matchers.any;
1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.doThrow;
2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.mock;
2182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.times;
2282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.verify;
2382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
249546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.annotation.NonNull;
2582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.InstrumentationRegistry;
269546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress;
2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest;
2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4;
2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.TestConfigBuilder.TestConfig;
3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.TestConfigBuilder.WaitingDataLoader;
3182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
3282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test;
3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith;
3482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest
3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class)
3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class InitCallbackTest {
3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testRegisterInitCallback_callsSuccessCallback() {
4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = TestConfigBuilder.config();
4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback1);
4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback2);
4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback1, times(1)).onInitialized();
5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback2, times(1)).onInitialized();
5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
569546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19)
5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testRegisterInitCallback_callsFailCallback() {
5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.MetadataLoader loader = mock(EmojiCompat.MetadataLoader.class);
6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        doThrow(new RuntimeException("")).when(loader).load(any(EmojiCompat.LoaderCallback
6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .class));
6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new TestConfig(loader);
6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback1);
6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback2);
6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback1, times(1)).onFailed(any(Throwable.class));
7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback2, times(1)).onFailed(any(Throwable.class));
7382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
769546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19)
7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testRegisterInitCallback_callsFailCallback_whenOnFailCalledByLoader() {
7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class);
7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() {
8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            @Override
819546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir            public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                loaderCallback.onFailed(new RuntimeException(""));
8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            }
8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        };
8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new TestConfig(loader);
8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback);
8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback, times(1)).onFailed(any(Throwable.class));
9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
959546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19)
9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testRegisterInitCallback_callsFailCallback_whenMetadataRepoIsNull() {
9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class);
9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() {
9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            @Override
1009546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir            public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                loaderCallback.onLoaded(null);
10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            }
10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        };
10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new TestConfig(loader);
10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback);
10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback, times(1)).onFailed(any(Throwable.class));
11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
11282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
1149546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir    @SdkSuppress(minSdkVersion = 19)
11582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testUnregisterInitCallback_doesNotInteractWithCallback()
11682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir            throws InterruptedException {
11782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // will be registered
11882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback callback = mock(EmojiCompat.InitCallback.class);
11982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // will be registered, and then unregistered before metadata load is complete
12082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback callbackUnregister = mock(EmojiCompat.InitCallback.class);
12182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // will be registered to config
12282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback callbackConfigUnregister = mock(
12382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                EmojiCompat.InitCallback.class);
12482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // will be registered to config and then unregistered
12582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback callbackConfig = mock(EmojiCompat.InitCallback.class);
12682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
12782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        //make sure that loader does not load before unregister
12882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final WaitingDataLoader metadataLoader = new WaitingDataLoader(false/*fail*/);
12982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = new TestConfig(metadataLoader)
13082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(callbackConfig)
13182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(callbackConfigUnregister)
13282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .unregisterInitCallback(callbackConfigUnregister);
13382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
13482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // register before metadata is loaded
13582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(callbackUnregister);
13682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(callback);
13782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
13882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // unregister before metadata is loaded
13982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.unregisterInitCallback(callbackUnregister);
14082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
14182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        // fire metadata loaded event
14282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        metadataLoader.getLoaderLatch().countDown();
14382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        metadataLoader.getTestLatch().await();
14482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
14582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
14682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(callbackUnregister, times(0)).onFailed(any(Throwable.class));
14782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(callbackConfigUnregister, times(0)).onFailed(any(Throwable.class));
14882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(callback, times(1)).onFailed(any(Throwable.class));
14982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(callbackConfig, times(1)).onFailed(any(Throwable.class));
15082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
15182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
15282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    @Test
15382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    public void testInitCallback_addedToConfigAndInstance_callsSuccess() {
15482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
15582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
15682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
15782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat.Config config = TestConfigBuilder.config()
15882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir                .registerInitCallback(initCallback1);
15982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        final EmojiCompat emojiCompat = EmojiCompat.reset(config);
16082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        emojiCompat.registerInitCallback(initCallback2);
16182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
16282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
16382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
16482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback1, times(1)).onInitialized();
16582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir        verify(initCallback2, times(1)).onInitialized();
16682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir    }
16782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir
16882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir}
169