1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.emoji.widget; 18 19 import static androidx.emoji.util.EmojiMatcher.sameCharSequence; 20 21 import static org.junit.Assert.assertEquals; 22 import static org.mockito.Matchers.any; 23 import static org.mockito.Matchers.anyInt; 24 import static org.mockito.Matchers.eq; 25 import static org.mockito.Mockito.mock; 26 import static org.mockito.Mockito.times; 27 import static org.mockito.Mockito.verify; 28 import static org.mockito.Mockito.when; 29 30 import android.support.test.filters.SmallTest; 31 import android.support.test.runner.AndroidJUnit4; 32 import android.text.Spannable; 33 import android.text.SpannableString; 34 import android.widget.EditText; 35 36 import androidx.emoji.text.EmojiCompat; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 42 @SmallTest 43 @RunWith(AndroidJUnit4.class) 44 public class EmojiTextWatcherTest { 45 46 private EmojiTextWatcher mTextWatcher; 47 private EmojiCompat mEmojiCompat; 48 49 @Before 50 public void setup() { 51 final EditText editText = mock(EditText.class); 52 mEmojiCompat = mock(EmojiCompat.class); 53 EmojiCompat.reset(mEmojiCompat); 54 mTextWatcher = new EmojiTextWatcher(editText); 55 } 56 57 @Test 58 public void testOnTextChanged_callsProcess() { 59 final Spannable testString = new SpannableString("abc"); 60 when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED); 61 62 mTextWatcher.onTextChanged(testString, 0, 0, 1); 63 64 verify(mEmojiCompat, times(1)).process(sameCharSequence(testString), eq(0), eq(1), 65 eq(Integer.MAX_VALUE), anyInt()); 66 verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class)); 67 } 68 69 @Test 70 public void testOnTextChanged_whenEmojiCompatLoading() { 71 final Spannable testString = new SpannableString("abc"); 72 when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING); 73 74 mTextWatcher.onTextChanged(testString, 0, 0, 1); 75 76 verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(), 77 anyInt()); 78 verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class)); 79 } 80 81 @Test 82 public void testOnTextChanged_whenEmojiCompatLoadFailed() { 83 final Spannable testString = new SpannableString("abc"); 84 when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED); 85 86 mTextWatcher.onTextChanged(testString, 0, 0, 1); 87 88 verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(), 89 anyInt()); 90 verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class)); 91 } 92 93 @Test 94 public void testSetEmojiReplaceStrategy() { 95 final Spannable testString = new SpannableString("abc"); 96 when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED); 97 98 assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT, mTextWatcher.getEmojiReplaceStrategy()); 99 100 mTextWatcher.onTextChanged(testString, 0, 0, 1); 101 102 verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(), 103 eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT)); 104 105 mTextWatcher.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_ALL); 106 107 mTextWatcher.onTextChanged(testString, 0, 0, 1); 108 109 verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(), 110 eq(EmojiCompat.REPLACE_STRATEGY_ALL)); 111 } 112 113 @Test 114 public void testFilter_withManualLoadStrategy() { 115 final Spannable testString = new SpannableString("abc"); 116 when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT); 117 118 mTextWatcher.onTextChanged(testString, 0, 0, 1); 119 120 verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt()); 121 verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class)); 122 } 123 } 124