Home | History | Annotate | Download | only in espresso
      1 /*
      2  * Copyright (C) 2016 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.espresso;
     18 
     19 import static android.support.test.espresso.Espresso.onView;
     20 import static android.support.test.espresso.assertion.ViewAssertions.matches;
     21 import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
     22 import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
     23 import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
     24 import static android.support.test.espresso.matcher.ViewMatchers.withId;
     25 import static android.support.test.espresso.matcher.ViewMatchers.withText;
     26 
     27 import org.hamcrest.Matcher;
     28 
     29 import android.support.test.espresso.NoMatchingRootException;
     30 import android.support.test.espresso.NoMatchingViewException;
     31 import android.support.test.espresso.UiController;
     32 import android.support.test.espresso.ViewAction;
     33 import android.support.test.espresso.ViewInteraction;
     34 import android.support.test.espresso.action.GeneralLocation;
     35 import android.support.test.espresso.action.Press;
     36 import android.support.test.espresso.action.Tap;
     37 import android.view.View;
     38 
     39 public final class SuggestionsPopupwindowUtils {
     40     private static final int id = com.android.internal.R.id.suggestionWindowContainer;
     41 
     42     private SuggestionsPopupwindowUtils() {};
     43 
     44     public static ViewInteraction onSuggestionsPopup() {
     45         return onView(withId(id)).inRoot(withDecorView(hasDescendant(withId(id))));
     46     }
     47 
     48     private static ViewInteraction onSuggestionsPopupItem(Matcher<View> matcher) {
     49         return onView(matcher).inRoot(withDecorView(hasDescendant(withId(id))));
     50     }
     51 
     52     /**
     53      * Asserts that the suggestions popup is displayed on screen.
     54      *
     55      * @throws AssertionError if the assertion fails
     56      */
     57     public static void assertSuggestionsPopupIsDisplayed() {
     58         onSuggestionsPopup().check(matches(isDisplayed()));
     59     }
     60 
     61     /**
     62      * Asserts that the suggestions popup is not displayed on screen.
     63      *
     64      * @throws AssertionError if the assertion fails
     65      */
     66     public static void assertSuggestionsPopupIsNotDisplayed() {
     67         try {
     68             onSuggestionsPopup().check(matches(isDisplayed()));
     69         } catch (NoMatchingRootException | NoMatchingViewException | AssertionError e) {
     70             return;
     71         }
     72         throw new AssertionError("Suggestions popup is displayed");
     73     }
     74 
     75     /**
     76      * Asserts that the suggestions popup contains the specified item.
     77      *
     78      * @param itemLabel label of the item.
     79      * @throws AssertionError if the assertion fails
     80      */
     81     public static void assertSuggestionsPopupContainsItem(String itemLabel) {
     82         onSuggestionsPopupItem(withText(itemLabel)).check(matches(isDisplayed()));
     83     }
     84 
     85     /**
     86      * Click on the specified item in the suggestions popup.
     87      *
     88      * @param itemLabel label of the item.
     89      */
     90     public static void clickSuggestionsPopupItem(String itemLabel) {
     91         onSuggestionsPopupItem(withText(itemLabel)).perform(new SuggestionItemClickAction());
     92     }
     93 
     94     /**
     95      * Click action to avoid checking ViewClickAction#getConstraints().
     96      * TODO: Use Espresso.onData instead of this.
     97      */
     98     private static final class SuggestionItemClickAction implements ViewAction {
     99         private final ViewClickAction mViewClickAction;
    100 
    101         public SuggestionItemClickAction() {
    102             mViewClickAction =
    103                     new ViewClickAction(Tap.SINGLE, GeneralLocation.VISIBLE_CENTER, Press.FINGER);
    104         }
    105 
    106         @Override
    107         public Matcher<View> getConstraints() {
    108             return isDisplayed();
    109         }
    110 
    111         @Override
    112         public String getDescription() {
    113             return mViewClickAction.getDescription();
    114         }
    115 
    116         @Override
    117         public void perform(UiController uiController, View view) {
    118             mViewClickAction.perform(uiController, view);
    119         }
    120     }
    121 }
    122