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; 18 19 import android.app.Instrumentation; 20 import android.test.ActivityInstrumentationTestCase2; 21 import android.test.FlakyTest; 22 import android.test.suitebuilder.annotation.MediumTest; 23 24 /** 25 * A collection of tests on aspects of the AutoCompleteTextView's popup 26 * 27 * TODO: tests fail intermittently. Add back MediumTest annotation when fixed 28 */ 29 public class AutoCompleteTextViewPopup 30 extends ActivityInstrumentationTestCase2<AutoCompleteTextViewSimple> { 31 32 // ms to sleep when checking for intermittent UI state 33 private static final int SLEEP_TIME = 50; 34 // number of times to poll when checking expected UI state 35 // total wait time will be LOOP_AMOUNT * SLEEP_TIME 36 private static final int LOOP_AMOUNT = 10; 37 38 39 public AutoCompleteTextViewPopup() { 40 super("com.android.frameworks.coretests", AutoCompleteTextViewSimple.class); 41 } 42 43 /** Test that we can move the selection and it responds as expected */ 44 @FlakyTest(tolerance=3) 45 public void testPopupSetListSelection() throws Throwable { 46 AutoCompleteTextViewSimple theActivity = getActivity(); 47 final AutoCompleteTextView textView = theActivity.getTextView(); 48 final Instrumentation instrumentation = getInstrumentation(); 49 50 // focus and type 51 textView.requestFocus(); 52 instrumentation.waitForIdleSync(); 53 sendKeys("A"); 54 55 // No initial selection 56 waitAssertListSelection(textView, ListView.INVALID_POSITION); 57 58 // set and check 59 runTestOnUiThread(new Runnable() { 60 public void run() { 61 textView.setListSelection(0); 62 } 63 }); 64 instrumentation.waitForIdleSync(); 65 waitAssertListSelection("set selection to (0)", textView, 0); 66 67 // Use movement to cross-check the movement 68 sendKeys("DPAD_DOWN"); 69 waitAssertListSelection("move selection to (1)", textView, 1); 70 71 // TODO: FlakyTest repeat runs will not currently call setUp, clear state 72 clearText(textView); 73 } 74 75 /** Test that we can look at the selection as we move around */ 76 @FlakyTest(tolerance=3) 77 public void testPopupGetListSelection() throws Throwable { 78 AutoCompleteTextViewSimple theActivity = getActivity(); 79 final AutoCompleteTextView textView = theActivity.getTextView(); 80 final Instrumentation instrumentation = getInstrumentation(); 81 82 // focus and type 83 textView.requestFocus(); 84 instrumentation.waitForIdleSync(); 85 sendKeys("A"); 86 87 // No initial selection 88 waitAssertListSelection(textView, ListView.INVALID_POSITION); 89 90 // check for selection position as expected 91 sendKeys("DPAD_DOWN"); 92 waitAssertListSelection("move selection to (0)", textView, 0); 93 94 // Repeat for one more movement 95 sendKeys("DPAD_DOWN"); 96 waitAssertListSelection("move selection to (1)", textView, 1); 97 98 // TODO: FlakyTest repeat runs will not currently call setUp, clear state 99 clearText(textView); 100 } 101 102 /** Test that we can clear the selection */ 103 @FlakyTest(tolerance=3) 104 public void testPopupClearListSelection() throws Throwable { 105 AutoCompleteTextViewSimple theActivity = getActivity(); 106 final AutoCompleteTextView textView = theActivity.getTextView(); 107 final Instrumentation instrumentation = getInstrumentation(); 108 109 // focus and type 110 textView.requestFocus(); 111 instrumentation.waitForIdleSync(); 112 sendKeys("A"); 113 114 // No initial selection 115 waitAssertListSelection(textView, ListView.INVALID_POSITION); 116 117 // check for selection position as expected 118 sendKeys("DPAD_DOWN"); 119 waitAssertListSelection(textView, 0); 120 121 // clear it 122 runTestOnUiThread(new Runnable() { 123 public void run() { 124 textView.clearListSelection(); 125 } 126 }); 127 instrumentation.waitForIdleSync(); 128 waitAssertListSelection("setListSelection(ListView.INVALID_POSITION)", textView, 129 ListView.INVALID_POSITION); 130 131 // TODO: FlakyTest repeat runs will not currently call setUp, clear state 132 clearText(textView); 133 } 134 135 /** Make sure we handle an empty adapter properly */ 136 @FlakyTest(tolerance=3) 137 public void testPopupNavigateNoAdapter() throws Throwable { 138 AutoCompleteTextViewSimple theActivity = getActivity(); 139 final AutoCompleteTextView textView = theActivity.getTextView(); 140 final Instrumentation instrumentation = getInstrumentation(); 141 142 // focus and type 143 textView.requestFocus(); 144 instrumentation.waitForIdleSync(); 145 sendKeys("A"); 146 147 // No initial selection 148 waitAssertListSelection(textView, ListView.INVALID_POSITION); 149 150 // check for selection position as expected 151 sendKeys("DPAD_DOWN"); 152 waitAssertListSelection(textView, 0); 153 154 // Now get rid of the adapter 155 runTestOnUiThread(new Runnable() { 156 public void run() { 157 textView.setAdapter((ArrayAdapter<?>) null); 158 } 159 }); 160 instrumentation.waitForIdleSync(); 161 162 // now try moving "down" - nothing should happen since there's no longer an adapter 163 sendKeys("DPAD_DOWN"); 164 165 // TODO: FlakyTest repeat runs will not currently call setUp, clear state 166 clearText(textView); 167 } 168 169 /** Test the show/hide behavior of the drop-down. */ 170 @FlakyTest(tolerance=3) 171 public void testPopupShow() throws Throwable { 172 AutoCompleteTextViewSimple theActivity = getActivity(); 173 final AutoCompleteTextView textView = theActivity.getTextView(); 174 final Instrumentation instrumentation = getInstrumentation(); 175 176 // Drop-down should not be showing when no text has been entered 177 assertFalse("isPopupShowing() on start", textView.isPopupShowing()); 178 179 // focus and type 180 textView.requestFocus(); 181 instrumentation.waitForIdleSync(); 182 sendKeys("A"); 183 184 // Drop-down should now be visible 185 waitAssertPopupShowState("isPopupShowing() after typing", textView, true); 186 187 // Clear the text 188 runTestOnUiThread(new Runnable() { 189 public void run() { 190 textView.setText(""); 191 } 192 }); 193 instrumentation.waitForIdleSync(); 194 195 // Drop-down should be hidden when text is cleared 196 waitAssertPopupShowState("isPopupShowing() after text cleared", textView, false); 197 198 // Set the text, without filtering 199 runTestOnUiThread(new Runnable() { 200 public void run() { 201 textView.setText("a", false); 202 } 203 }); 204 instrumentation.waitForIdleSync(); 205 206 // Drop-down should still be hidden 207 waitAssertPopupShowState("isPopupShowing() after setText(\"a\", false)", textView, false); 208 209 // Set the text, now with filtering 210 runTestOnUiThread(new Runnable() { 211 public void run() { 212 textView.setText("a"); 213 } 214 }); 215 instrumentation.waitForIdleSync(); 216 217 // Drop-down should show up after setText() with filtering 218 waitAssertPopupShowState("isPopupShowing() after text set", textView, true); 219 220 // TODO: FlakyTest repeat runs will not currently call setUp, clear state 221 clearText(textView); 222 } 223 224 private void waitAssertPopupShowState(String message, AutoCompleteTextView textView, 225 boolean expected) throws InterruptedException { 226 for (int i = 0; i < LOOP_AMOUNT; i++) { 227 if (textView.isPopupShowing() == expected) { 228 return; 229 } 230 Thread.sleep(SLEEP_TIME); 231 } 232 assertEquals(message, expected, textView.isPopupShowing()); 233 } 234 235 private void waitAssertListSelection(AutoCompleteTextView textView, int expected) 236 throws Exception { 237 waitAssertListSelection("getListSelection()", textView, expected); 238 } 239 240 private void waitAssertListSelection(String message, AutoCompleteTextView textView, 241 int expected) throws Exception { 242 int currentSelection = ListView.INVALID_POSITION; 243 for (int i = 0; i < LOOP_AMOUNT; i++) { 244 currentSelection = textView.getListSelection(); 245 if (expected == currentSelection) { 246 return; 247 } 248 Thread.sleep(SLEEP_TIME); 249 } 250 assertEquals(message, expected, textView.getListSelection()); 251 } 252 253 private void clearText(final AutoCompleteTextView textView) throws Throwable { 254 runTestOnUiThread(new Runnable() { 255 public void run() { 256 textView.setText(""); 257 } 258 }); 259 } 260 } 261