/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.widget; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; import android.test.FlakyTest; import android.test.suitebuilder.annotation.MediumTest; /** * A collection of tests on aspects of the AutoCompleteTextView's popup * * TODO: tests fail intermittently. Add back MediumTest annotation when fixed */ public class AutoCompleteTextViewPopup extends ActivityInstrumentationTestCase2<AutoCompleteTextViewSimple> { // ms to sleep when checking for intermittent UI state private static final int SLEEP_TIME = 50; // number of times to poll when checking expected UI state // total wait time will be LOOP_AMOUNT * SLEEP_TIME private static final int LOOP_AMOUNT = 10; public AutoCompleteTextViewPopup() { super("com.android.frameworks.coretests", AutoCompleteTextViewSimple.class); } /** Test that we can move the selection and it responds as expected */ @FlakyTest(tolerance=3) public void testPopupSetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); final Instrumentation instrumentation = getInstrumentation(); // focus and type textView.requestFocus(); instrumentation.waitForIdleSync(); sendKeys("A"); // No initial selection waitAssertListSelection(textView, ListView.INVALID_POSITION); // set and check runTestOnUiThread(new Runnable() { public void run() { textView.setListSelection(0); } }); instrumentation.waitForIdleSync(); waitAssertListSelection("set selection to (0)", textView, 0); // Use movement to cross-check the movement sendKeys("DPAD_DOWN"); waitAssertListSelection("move selection to (1)", textView, 1); // TODO: FlakyTest repeat runs will not currently call setUp, clear state clearText(textView); } /** Test that we can look at the selection as we move around */ @FlakyTest(tolerance=3) public void testPopupGetListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); final Instrumentation instrumentation = getInstrumentation(); // focus and type textView.requestFocus(); instrumentation.waitForIdleSync(); sendKeys("A"); // No initial selection waitAssertListSelection(textView, ListView.INVALID_POSITION); // check for selection position as expected sendKeys("DPAD_DOWN"); waitAssertListSelection("move selection to (0)", textView, 0); // Repeat for one more movement sendKeys("DPAD_DOWN"); waitAssertListSelection("move selection to (1)", textView, 1); // TODO: FlakyTest repeat runs will not currently call setUp, clear state clearText(textView); } /** Test that we can clear the selection */ @FlakyTest(tolerance=3) public void testPopupClearListSelection() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); final Instrumentation instrumentation = getInstrumentation(); // focus and type textView.requestFocus(); instrumentation.waitForIdleSync(); sendKeys("A"); // No initial selection waitAssertListSelection(textView, ListView.INVALID_POSITION); // check for selection position as expected sendKeys("DPAD_DOWN"); waitAssertListSelection(textView, 0); // clear it runTestOnUiThread(new Runnable() { public void run() { textView.clearListSelection(); } }); instrumentation.waitForIdleSync(); waitAssertListSelection("setListSelection(ListView.INVALID_POSITION)", textView, ListView.INVALID_POSITION); // TODO: FlakyTest repeat runs will not currently call setUp, clear state clearText(textView); } /** Make sure we handle an empty adapter properly */ @FlakyTest(tolerance=3) public void testPopupNavigateNoAdapter() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); final Instrumentation instrumentation = getInstrumentation(); // focus and type textView.requestFocus(); instrumentation.waitForIdleSync(); sendKeys("A"); // No initial selection waitAssertListSelection(textView, ListView.INVALID_POSITION); // check for selection position as expected sendKeys("DPAD_DOWN"); waitAssertListSelection(textView, 0); // Now get rid of the adapter runTestOnUiThread(new Runnable() { public void run() { textView.setAdapter((ArrayAdapter<?>) null); } }); instrumentation.waitForIdleSync(); // now try moving "down" - nothing should happen since there's no longer an adapter sendKeys("DPAD_DOWN"); // TODO: FlakyTest repeat runs will not currently call setUp, clear state clearText(textView); } /** Test the show/hide behavior of the drop-down. */ @FlakyTest(tolerance=3) public void testPopupShow() throws Throwable { AutoCompleteTextViewSimple theActivity = getActivity(); final AutoCompleteTextView textView = theActivity.getTextView(); final Instrumentation instrumentation = getInstrumentation(); // Drop-down should not be showing when no text has been entered assertFalse("isPopupShowing() on start", textView.isPopupShowing()); // focus and type textView.requestFocus(); instrumentation.waitForIdleSync(); sendKeys("A"); // Drop-down should now be visible waitAssertPopupShowState("isPopupShowing() after typing", textView, true); // Clear the text runTestOnUiThread(new Runnable() { public void run() { textView.setText(""); } }); instrumentation.waitForIdleSync(); // Drop-down should be hidden when text is cleared waitAssertPopupShowState("isPopupShowing() after text cleared", textView, false); // Set the text, without filtering runTestOnUiThread(new Runnable() { public void run() { textView.setText("a", false); } }); instrumentation.waitForIdleSync(); // Drop-down should still be hidden waitAssertPopupShowState("isPopupShowing() after setText(\"a\", false)", textView, false); // Set the text, now with filtering runTestOnUiThread(new Runnable() { public void run() { textView.setText("a"); } }); instrumentation.waitForIdleSync(); // Drop-down should show up after setText() with filtering waitAssertPopupShowState("isPopupShowing() after text set", textView, true); // TODO: FlakyTest repeat runs will not currently call setUp, clear state clearText(textView); } private void waitAssertPopupShowState(String message, AutoCompleteTextView textView, boolean expected) throws InterruptedException { for (int i = 0; i < LOOP_AMOUNT; i++) { if (textView.isPopupShowing() == expected) { return; } Thread.sleep(SLEEP_TIME); } assertEquals(message, expected, textView.isPopupShowing()); } private void waitAssertListSelection(AutoCompleteTextView textView, int expected) throws Exception { waitAssertListSelection("getListSelection()", textView, expected); } private void waitAssertListSelection(String message, AutoCompleteTextView textView, int expected) throws Exception { int currentSelection = ListView.INVALID_POSITION; for (int i = 0; i < LOOP_AMOUNT; i++) { currentSelection = textView.getListSelection(); if (expected == currentSelection) { return; } Thread.sleep(SLEEP_TIME); } assertEquals(message, expected, textView.getListSelection()); } private void clearText(final AutoCompleteTextView textView) throws Throwable { runTestOnUiThread(new Runnable() { public void run() { textView.setText(""); } }); } }