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 org.hamcrest.CoreMatchers.instanceOf; 20 import static org.junit.Assert.assertEquals; 21 import static org.junit.Assert.assertNotNull; 22 import static org.junit.Assert.assertNull; 23 import static org.junit.Assert.assertSame; 24 import static org.junit.Assert.assertThat; 25 import static org.mockito.Mockito.mock; 26 import static org.mockito.Mockito.times; 27 import static org.mockito.Mockito.verify; 28 29 import android.support.test.InstrumentationRegistry; 30 import android.support.test.filters.SdkSuppress; 31 import android.support.test.filters.SmallTest; 32 import android.support.test.runner.AndroidJUnit4; 33 import android.text.TextWatcher; 34 import android.text.method.KeyListener; 35 import android.view.inputmethod.EditorInfo; 36 import android.view.inputmethod.InputConnection; 37 import android.widget.EditText; 38 39 import androidx.emoji.text.EmojiCompat; 40 41 import org.junit.Before; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.mockito.ArgumentCaptor; 45 46 @SmallTest 47 @RunWith(AndroidJUnit4.class) 48 @SdkSuppress(minSdkVersion = 19) 49 public class EmojiEditTextHelperTest { 50 EmojiEditTextHelper mEmojiEditTextHelper; 51 EditText mEditText; 52 53 @Before 54 public void setup() { 55 EmojiCompat.reset(mock(EmojiCompat.class)); 56 mEditText = new EditText(InstrumentationRegistry.getTargetContext()); 57 mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText); 58 } 59 60 @Test(expected = NullPointerException.class) 61 public void testGetKeyListener_withNull_throwsException() { 62 mEmojiEditTextHelper.getKeyListener(null); 63 } 64 65 @Test 66 public void testGetKeyListener_returnsEmojiKeyListener() { 67 final KeyListener keyListener = mEmojiEditTextHelper.getKeyListener( 68 mock(KeyListener.class)); 69 70 assertThat(keyListener, instanceOf(EmojiKeyListener.class)); 71 } 72 73 @Test 74 public void testGetKeyListener_doesNotCreateNewInstance() { 75 KeyListener mockKeyListener = mock(KeyListener.class); 76 final KeyListener keyListener1 = mEmojiEditTextHelper.getKeyListener(mockKeyListener); 77 final KeyListener keyListener2 = mEmojiEditTextHelper.getKeyListener(keyListener1); 78 assertSame(keyListener1, keyListener2); 79 } 80 81 @Test 82 public void testGetOnCreateInputConnection_withNullAttrs_returnsInputConnection() { 83 final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection( 84 mock(InputConnection.class), null); 85 assertNotNull(inputConnection); 86 assertThat(inputConnection, instanceOf(EmojiInputConnection.class)); 87 } 88 89 @Test 90 public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() { 91 InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null, 92 new EditorInfo()); 93 assertNull(inputConnection); 94 } 95 96 @Test 97 public void testGetOnCreateInputConnection_returnsEmojiInputConnection() { 98 final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection( 99 mock(InputConnection.class), null); 100 assertNotNull(inputConnection); 101 assertThat(inputConnection, instanceOf(EmojiInputConnection.class)); 102 } 103 104 @Test 105 public void testGetOnCreateInputConnection_doesNotCreateNewInstance() { 106 final InputConnection ic1 = mEmojiEditTextHelper.onCreateInputConnection( 107 mock(InputConnection.class), null); 108 final InputConnection ic2 = mEmojiEditTextHelper.onCreateInputConnection(ic1, null); 109 110 assertSame(ic1, ic2); 111 } 112 113 @Test 114 public void testAttachesTextWatcher() { 115 mEditText = mock(EditText.class); 116 mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText); 117 118 final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass( 119 TextWatcher.class); 120 121 verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture()); 122 assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class)); 123 } 124 125 @Test 126 public void testSetMaxCount() { 127 mEditText = mock(EditText.class); 128 mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText); 129 // capture TextWatcher 130 final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass( 131 TextWatcher.class); 132 verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture()); 133 assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class)); 134 final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue(); 135 136 mEmojiEditTextHelper.setMaxEmojiCount(1); 137 138 assertEquals(1, emojiTextWatcher.getMaxEmojiCount()); 139 } 140 141 @Test 142 public void testSetEmojiReplaceStrategy() { 143 mEditText = mock(EditText.class); 144 mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText); 145 146 //assert the default value 147 assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT, 148 mEmojiEditTextHelper.getEmojiReplaceStrategy()); 149 150 // capture TextWatcher 151 final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass( 152 TextWatcher.class); 153 verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture()); 154 assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class)); 155 final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue(); 156 157 mEmojiEditTextHelper.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT); 158 159 assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT, 160 mEmojiEditTextHelper.getEmojiReplaceStrategy()); 161 162 assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT, 163 emojiTextWatcher.getEmojiReplaceStrategy()); 164 } 165 166 } 167