Home | History | Annotate | Download | only in widget
      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