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