| /* |
| * Copyright (C) 2014 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.support.test.testapp; |
| |
| import static android.support.test.espresso.Espresso.onData; |
| import static android.support.test.espresso.Espresso.onView; |
| import static android.support.test.espresso.action.ViewActions.clearText; |
| import static android.support.test.espresso.action.ViewActions.click; |
| import static android.support.test.espresso.action.ViewActions.scrollTo; |
| import static android.support.test.espresso.action.ViewActions.typeText; |
| import static android.support.test.espresso.action.ViewActions.typeTextIntoFocusedView; |
| import static android.support.test.espresso.assertion.ViewAssertions.matches; |
| import static android.support.test.espresso.matcher.RootMatchers.isPlatformPopup; |
| import static android.support.test.espresso.matcher.ViewMatchers.withId; |
| import static android.support.test.espresso.matcher.ViewMatchers.withText; |
| import static org.hamcrest.Matchers.allOf; |
| import static org.hamcrest.Matchers.instanceOf; |
| import static org.hamcrest.Matchers.is; |
| |
| import android.support.test.filters.SdkSuppress; |
| |
| import android.test.ActivityInstrumentationTestCase2; |
| import android.test.suitebuilder.annotation.LargeTest; |
| |
| /** |
| * Demonstrates dealing with multiple windows. |
| * |
| * Espresso provides the ability to switch the default window matcher used in both onView and onData |
| * interactions. |
| * |
| * @see android.support.test.espresso.Espresso#onView |
| * @see android.support.test.espresso.Espresso#onData |
| */ |
| @LargeTest |
| public class MultipleWindowTest extends ActivityInstrumentationTestCase2<SendActivity> { |
| |
| @SuppressWarnings("deprecation") |
| public MultipleWindowTest() { |
| // This constructor was deprecated - but we want to support lower API levels. |
| super("android.support.test.testapp", SendActivity.class); |
| } |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| // Espresso will not launch our activity for us, we must launch it via getActivity(). |
| getActivity(); |
| } |
| |
| // Froyo's AutoCompleteTextBox is broken - do not bother testing with it. |
| @SdkSuppress(minSdkVersion=10) |
| public void testInteractionsWithAutoCompletePopup() { |
| // Android's Window system allows multiple view hierarchies to layer on top of each other. |
| // |
| // A real world analogy would be an overhead projector with multiple transparencies placed |
| // on top of each other. Each Window is a transparency, and what is drawn on top of this |
| // transparency is the view hierarchy. |
| // |
| // By default Espresso uses a heuristic to guess which Window you intend to interact with. |
| // This heuristic is normally 'good enough' however if you want to interact with a Window |
| // that it does not select then you'll have to swap in your own root window matcher. |
| |
| |
| // Initially we only have 1 window, but by typing into the auto complete text view another |
| // window will be layered on top of the screen. Espresso ignore's this layer because it is |
| // not connected to the keyboard/ime. |
| onView(withId(R.id.auto_complete_text_view)) |
| .perform(scrollTo()) |
| .perform(typeText("So")); |
| |
| // As you can see, we continue typing oblivious to the new window on the screen. |
| // At the moment there should be 2 completions (South China Sea and Southern Ocean) |
| // Lets narrow that down to 1 completion. |
| onView(withId(R.id.auto_complete_text_view)) |
| .perform(typeTextIntoFocusedView("uth ")); |
| |
| // Now we may want to explicitly tap on a completion. We must override Espresso's |
| // default window selection heuristic with our own. |
| onView(withText("South China Sea")) |
| .inRoot(isPlatformPopup()) |
| .perform(click()); |
| |
| // And by clicking on the auto complete term, the text should be filled in. |
| onView(withId(R.id.auto_complete_text_view)) |
| .check(matches(withText("South China Sea"))); |
| |
| |
| // NB: The autocompletion box is implemented with a ListView, so the preferred way |
| // to interact with it is onData(). We can use inRoot here too! |
| onView(withId(R.id.auto_complete_text_view)) |
| .perform(clearText()) |
| .perform(typeText("S")); |
| |
| // Which is useful because some of the completions may not be part of the View Hierarchy |
| // unless you scroll around the list. |
| onData(allOf(instanceOf(String.class), is("Baltic Sea"))) |
| .inRoot(isPlatformPopup()) |
| .perform(click()); |
| |
| onView(withId(R.id.auto_complete_text_view)) |
| .check(matches(withText("Baltic Sea"))); |
| } |
| |
| } |