-
Notifications
You must be signed in to change notification settings - Fork 306
/
MultipleWindowTest.java
119 lines (100 loc) · 4.82 KB
/
MultipleWindowTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
* 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 androidx.test.ui.app;
import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.clearText;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.scrollTo;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.action.ViewActions.typeTextIntoFocusedView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.RootMatchers.isPlatformPopup;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.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.test.ActivityInstrumentationTestCase2;
import androidx.test.filters.LargeTest;
import androidx.test.filters.SdkSuppress;
/**
* Demonstrates dealing with multiple windows.
*
* <p>Espresso provides the ability to switch the default window matcher used in both onView and
* onData interactions.
*
* @see androidx.test.espresso.Espresso#onView
* @see androidx.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("androidx.test.ui.app", 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 = 24)
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")));
}
}