Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2008 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 android.widget.cts;
     18 
     19 import static org.junit.Assert.assertEquals;
     20 import static org.junit.Assert.assertNotNull;
     21 import static org.junit.Assert.assertNull;
     22 import static org.junit.Assert.assertSame;
     23 import static org.junit.Assert.assertTrue;
     24 
     25 import android.app.Activity;
     26 import android.app.Instrumentation;
     27 import android.content.Context;
     28 import android.support.test.InstrumentationRegistry;
     29 import android.support.test.annotation.UiThreadTest;
     30 import android.support.test.filters.SmallTest;
     31 import android.support.test.rule.ActivityTestRule;
     32 import android.support.test.runner.AndroidJUnit4;
     33 import android.text.Editable;
     34 import android.text.TextUtils;
     35 import android.text.method.ArrowKeyMovementMethod;
     36 import android.text.method.MovementMethod;
     37 import android.util.AttributeSet;
     38 import android.util.DisplayMetrics;
     39 import android.util.TypedValue;
     40 import android.util.Xml;
     41 import android.widget.EditText;
     42 import android.widget.TextView.BufferType;
     43 
     44 import org.junit.Before;
     45 import org.junit.Rule;
     46 import org.junit.Test;
     47 import org.junit.runner.RunWith;
     48 import org.xmlpull.v1.XmlPullParser;
     49 
     50 @SmallTest
     51 @RunWith(AndroidJUnit4.class)
     52 public class EditTextTest {
     53     private Activity mActivity;
     54     private EditText mEditText1;
     55     private EditText mEditText2;
     56     private AttributeSet mAttributeSet;
     57     private Instrumentation mInstrumentation;
     58 
     59     @Rule
     60     public ActivityTestRule<EditTextCtsActivity> mActivityRule =
     61             new ActivityTestRule<>(EditTextCtsActivity.class);
     62 
     63     @Before
     64     public void setup() {
     65         mInstrumentation = InstrumentationRegistry.getInstrumentation();
     66         mActivity = mActivityRule.getActivity();
     67         mEditText1 = (EditText) mActivity.findViewById(R.id.edittext_simple1);
     68         mEditText2 = (EditText) mActivity.findViewById(R.id.edittext_simple2);
     69 
     70         XmlPullParser parser = mActivity.getResources().getXml(R.layout.edittext_layout);
     71         mAttributeSet = Xml.asAttributeSet(parser);
     72     }
     73 
     74     @Test
     75     public void testConstructor() {
     76         new EditText(mActivity);
     77 
     78         new EditText(mActivity, null);
     79 
     80         new EditText(mActivity, null, 0);
     81 
     82         new EditText(mActivity, mAttributeSet);
     83 
     84         new EditText(mActivity, mAttributeSet, 0);
     85     }
     86 
     87     @Test(expected=NullPointerException.class)
     88     public void testConstructorNullContext1() {
     89         new EditText(null);
     90     }
     91 
     92     @Test(expected=NullPointerException.class)
     93     public void testConstructorNullContext2() {
     94         new EditText(null, null);
     95     }
     96 
     97     @UiThreadTest
     98     @Test
     99     public void testAccessText() {
    100         mEditText1.setText("android", BufferType.NORMAL);
    101         assertTrue(TextUtils.equals("android", mEditText1.getText()));
    102 
    103         mEditText1.setText("", BufferType.SPANNABLE);
    104         assertEquals(0, mEditText1.getText().length());
    105 
    106         mEditText1.setText(null, BufferType.EDITABLE);
    107         assertEquals(0, mEditText1.getText().length());
    108     }
    109 
    110     @UiThreadTest
    111     @Test
    112     public void testSetSelectionIndex() {
    113         mEditText1.setText("android", BufferType.EDITABLE);
    114         int position = 4;
    115         mEditText1.setSelection(position);
    116         assertEquals(position, mEditText1.getSelectionStart());
    117         assertEquals(position, mEditText1.getSelectionEnd());
    118 
    119         position = 0;
    120         mEditText1.setSelection(position);
    121         assertEquals(position, mEditText1.getSelectionStart());
    122         assertEquals(position, mEditText1.getSelectionEnd());
    123     }
    124 
    125     @UiThreadTest
    126     @Test(expected=IndexOutOfBoundsException.class)
    127     public void testSetSelectionIndexBeforeFirst() {
    128         mEditText1.setText("android", BufferType.EDITABLE);
    129         mEditText1.setSelection(-1);
    130     }
    131 
    132     @UiThreadTest
    133     @Test(expected=IndexOutOfBoundsException.class)
    134     public void testSetSelectionIndexAfterLast() {
    135         mEditText1.setText("android", BufferType.EDITABLE);
    136         mEditText1.setSelection(mEditText1.getText().length() + 1);
    137     }
    138 
    139     @UiThreadTest
    140     @Test
    141     public void testSetSelectionStartEnd() {
    142         mEditText1.setText("android", BufferType.EDITABLE);
    143         int start = 1;
    144         int end = 2;
    145         mEditText1.setSelection(start, end);
    146         assertEquals(start, mEditText1.getSelectionStart());
    147         assertEquals(end, mEditText1.getSelectionEnd());
    148 
    149         start = 0;
    150         end = 0;
    151         mEditText1.setSelection(start, end);
    152         assertEquals(start, mEditText1.getSelectionStart());
    153         assertEquals(end, mEditText1.getSelectionEnd());
    154 
    155         start = 7;
    156         end = 1;
    157         mEditText1.setSelection(start, end);
    158         assertEquals(start, mEditText1.getSelectionStart());
    159         assertEquals(end, mEditText1.getSelectionEnd());
    160     }
    161 
    162     @UiThreadTest
    163     @Test(expected=IndexOutOfBoundsException.class)
    164     public void testSetSelectionStartEndBeforeFirst() {
    165         mEditText1.setText("android", BufferType.EDITABLE);
    166         mEditText1.setSelection(-5, -1);
    167     }
    168 
    169     @UiThreadTest
    170     @Test(expected=IndexOutOfBoundsException.class)
    171     public void testSetSelectionStartEndAfterLast() {
    172         mEditText1.setText("android", BufferType.EDITABLE);
    173         mEditText1.setSelection(5, mEditText1.getText().length() + 1);
    174     }
    175 
    176     @UiThreadTest
    177     @Test
    178     public void testSelectAll() {
    179         String string = "android";
    180         mEditText1.setText(string, BufferType.EDITABLE);
    181         mEditText1.selectAll();
    182         assertEquals(0, mEditText1.getSelectionStart());
    183         assertEquals(string.length(), mEditText1.getSelectionEnd());
    184 
    185         mEditText1.setText("", BufferType.EDITABLE);
    186         mEditText1.selectAll();
    187         assertEquals(0, mEditText1.getSelectionStart());
    188         assertEquals(0, mEditText1.getSelectionEnd());
    189 
    190         mEditText1.setText(null, BufferType.EDITABLE);
    191         mEditText1.selectAll();
    192         assertEquals(0, mEditText1.getSelectionStart());
    193         assertEquals(0, mEditText1.getSelectionEnd());
    194     }
    195 
    196     @UiThreadTest
    197     @Test
    198     public void testExtendSelection() {
    199         mEditText1.setText("android", BufferType.EDITABLE);
    200         int start = 0;
    201         int end = 0;
    202         mEditText1.setSelection(start, end);
    203         assertEquals(start, mEditText1.getSelectionStart());
    204         assertEquals(end, mEditText1.getSelectionEnd());
    205 
    206         end = 6;
    207         mEditText1.extendSelection(end);
    208         assertEquals(start, mEditText1.getSelectionStart());
    209         assertEquals(end, mEditText1.getSelectionEnd());
    210 
    211         start = 0;
    212         end = 0;
    213         mEditText1.setSelection(start);
    214         mEditText1.extendSelection(end);
    215         assertEquals(start, mEditText1.getSelectionStart());
    216         assertEquals(end, mEditText1.getSelectionEnd());
    217     }
    218 
    219     @UiThreadTest
    220     @Test(expected=IndexOutOfBoundsException.class)
    221     public void testExtendSelectionBeyondLast() {
    222         mEditText1.setText("android", BufferType.EDITABLE);
    223         mEditText1.setSelection(0, 4);
    224         mEditText1.extendSelection(10);
    225     }
    226 
    227     @Test
    228     public void testGetDefaultEditable() {
    229         MockEditText mockEditText = new MockEditText(mActivity, mAttributeSet);
    230 
    231         assertTrue(mockEditText.getDefaultEditable());
    232     }
    233 
    234     @Test
    235     public void testAutoSizeNotSupported() {
    236         DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
    237         EditText autoSizeEditText = (EditText) mActivity.findViewById(R.id.edittext_autosize);
    238 
    239         // If auto-size would work then the text size would be less then 50dp (the value set in the
    240         // layout file).
    241         final int sizeSetInPixels = (int) (0.5f + TypedValue.applyDimension(
    242                 TypedValue.COMPLEX_UNIT_DIP, 50f, metrics));
    243         assertEquals(sizeSetInPixels, (int) autoSizeEditText.getTextSize());
    244     }
    245 
    246     @Test
    247     public void testGetDefaultMovementMethod() {
    248         MockEditText mockEditText = new MockEditText(mActivity, mAttributeSet);
    249         MovementMethod method1 = mockEditText.getDefaultMovementMethod();
    250         MovementMethod method2 = mockEditText.getDefaultMovementMethod();
    251 
    252         assertNotNull(method1);
    253         assertTrue(method1 instanceof ArrowKeyMovementMethod);
    254 
    255         assertSame(method1, method2);
    256     }
    257 
    258     @UiThreadTest
    259     @Test
    260     public void testSetEllipsize() {
    261         assertNull(mEditText1.getEllipsize());
    262 
    263         mEditText1.setEllipsize(TextUtils.TruncateAt.START);
    264         assertSame(TextUtils.TruncateAt.START, mEditText1.getEllipsize());
    265     }
    266 
    267     @UiThreadTest
    268     @Test(expected=IllegalArgumentException.class)
    269     public void testSetEllipsizeMarquee() {
    270         mEditText1.setEllipsize(TextUtils.TruncateAt.MARQUEE);
    271     }
    272 
    273     @UiThreadTest
    274     @Test
    275     public void testOnSaveInstanceState_savesTextStateWhenFreezesTextIsTrue() {
    276         // prepare EditText for before saveInstanceState
    277         final String testStr = "This is a test str";
    278         mEditText1.setFreezesText(true);
    279         mEditText1.setText(testStr);
    280 
    281         // prepare EditText for after saveInstanceState
    282         mEditText2.setFreezesText(true);
    283 
    284         mEditText2.onRestoreInstanceState(mEditText1.onSaveInstanceState());
    285 
    286         assertTrue(TextUtils.equals(mEditText1.getText(), mEditText2.getText()));
    287     }
    288 
    289     @UiThreadTest
    290     @Test
    291     public void testOnSaveInstanceState_savesTextStateWhenFreezesTextIfFalse() {
    292         // prepare EditText for before saveInstanceState
    293         final String testStr = "This is a test str";
    294         mEditText1.setFreezesText(false);
    295         mEditText1.setText(testStr);
    296 
    297         // prepare EditText for after saveInstanceState
    298         mEditText2.setFreezesText(false);
    299 
    300         mEditText2.onRestoreInstanceState(mEditText1.onSaveInstanceState());
    301 
    302         assertTrue(TextUtils.equals(mEditText1.getText(), mEditText2.getText()));
    303     }
    304 
    305     @UiThreadTest
    306     @Test
    307     public void testOnSaveInstanceState_savesSelectionStateWhenFreezesTextIsFalse() {
    308         // prepare EditText for before saveInstanceState
    309         final String testStr = "This is a test str";
    310         mEditText1.setFreezesText(false);
    311         mEditText1.setText(testStr);
    312         mEditText1.setSelection(2, testStr.length() - 2);
    313 
    314         // prepare EditText for after saveInstanceState
    315         mEditText2.setFreezesText(false);
    316 
    317         mEditText2.onRestoreInstanceState(mEditText1.onSaveInstanceState());
    318 
    319         assertEquals(mEditText1.getSelectionStart(), mEditText2.getSelectionStart());
    320         assertEquals(mEditText1.getSelectionEnd(), mEditText2.getSelectionEnd());
    321     }
    322 
    323     @UiThreadTest
    324     @Test
    325     public void testOnSaveInstanceState_savesSelectionStateWhenFreezesTextIsTrue() {
    326         // prepare EditText for before saveInstanceState
    327         final String testStr = "This is a test str";
    328         mEditText1.setFreezesText(true);
    329         mEditText1.setText(testStr);
    330         mEditText1.setSelection(2, testStr.length() - 2);
    331 
    332         // prepare EditText for after saveInstanceState
    333         mEditText2.setFreezesText(true);
    334 
    335         mEditText2.onRestoreInstanceState(mEditText1.onSaveInstanceState());
    336 
    337         assertEquals(mEditText1.getSelectionStart(), mEditText2.getSelectionStart());
    338         assertEquals(mEditText1.getSelectionEnd(), mEditText2.getSelectionEnd());
    339     }
    340 
    341     private class MockEditText extends EditText {
    342         public MockEditText(Context context) {
    343             super(context);
    344         }
    345 
    346         public MockEditText(Context context, AttributeSet attrs) {
    347             super(context, attrs);
    348         }
    349 
    350         public MockEditText(Context context, AttributeSet attrs, int defStyle) {
    351             super(context, attrs, defStyle);
    352         }
    353 
    354         @Override
    355         protected boolean getDefaultEditable() {
    356             return super.getDefaultEditable();
    357         }
    358 
    359         @Override
    360         protected MovementMethod getDefaultMovementMethod() {
    361             return super.getDefaultMovementMethod();
    362         }
    363     }
    364 
    365     @Test
    366     public void testGetTextNonEditable() {
    367         // This subclass calls getText before the object is fully constructed. This should not cause
    368         // a null pointer exception.
    369         GetTextEditText editText = new GetTextEditText(mActivity);
    370     }
    371 
    372     private class GetTextEditText extends EditText {
    373 
    374         GetTextEditText(Context context) {
    375             super(context);
    376         }
    377 
    378         @Override
    379         public void setText(CharSequence text, BufferType type) {
    380             Editable currentText = getText();
    381             super.setText(text, type);
    382         }
    383     }
    384 
    385     @Test
    386     public void testGetTextBeforeConstructor() {
    387         // This subclass calls getText before the TextView constructor. This should not cause
    388         // a null pointer exception.
    389         GetTextEditText2 editText = new GetTextEditText2(mActivity);
    390     }
    391 
    392     private class GetTextEditText2 extends EditText {
    393 
    394         GetTextEditText2(Context context) {
    395             super(context);
    396         }
    397 
    398         @Override
    399         public void setOverScrollMode(int overScrollMode) {
    400             // This method is called by the View constructor before the TextView/EditText
    401             // constructors.
    402             Editable text = getText();
    403         }
    404     }
    405 }
    406