From 31eb74fb2bc33aea6a8054c861a6e7aac7c41f4b Mon Sep 17 00:00:00 2001 From: Keisuke Kuroyanagi Date: Wed, 6 Apr 2016 19:37:46 +0900 Subject: [PATCH] Rewrite SuggestionsPopupWindowTest using espresso. - Rewrite existing test about text appearance. - Add new tests for suggestions popup. Bug: 25904136 Bug: 27765262 Change-Id: I12e522436a83fa264cd22176d054877eec411708 --- .../android/widget/SuggestionsPopupWindowTest.java | 414 ++++++++++++++------- .../android/widget/TextViewActivityMouseTest.java | 25 +- .../src/android/widget/TextViewActivityTest.java | 10 +- .../espresso/FloatingToolbarEspressoUtils.java | 25 +- .../espresso/SuggestionsPopupwindowUtils.java | 121 ++++++ 5 files changed, 448 insertions(+), 147 deletions(-) create mode 100644 core/tests/coretests/src/android/widget/espresso/SuggestionsPopupwindowUtils.java diff --git a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java index 59ffd566909f..eafe42723780 100644 --- a/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java +++ b/core/tests/coretests/src/android/widget/SuggestionsPopupWindowTest.java @@ -16,13 +16,35 @@ package android.widget; -import android.app.Activity; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.Espresso.pressBack; +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.replaceText; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.RootMatchers.withDecorView; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static android.widget.espresso.DragHandleUtils.onHandleView; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; +import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupContainsItem; +import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsDisplayed; +import static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsNotDisplayed; +import static android.widget.espresso.SuggestionsPopupwindowUtils.clickSuggestionsPopupItem; +import static android.widget.espresso.SuggestionsPopupwindowUtils.onSuggestionsPopup; +import static android.widget.espresso.TextViewActions.clickOnTextAtIndex; +import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex; +import static org.hamcrest.Matchers.is; import android.content.res.TypedArray; +import android.support.test.espresso.NoMatchingViewException; +import android.support.test.espresso.ViewAssertion; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.Suppress; import android.text.Selection; -import android.text.SpannableStringBuilder; +import android.text.Spannable; import android.text.Spanned; import android.text.TextPaint; import android.text.style.SuggestionSpan; @@ -42,55 +64,215 @@ public class SuggestionsPopupWindowTest extends ActivityInstrumentationTestCase2 super(TextViewActivity.class); } + @Override + protected void setUp() throws Exception { + super.setUp(); + getActivity(); + } + + private void setSuggestionSpan(SuggestionSpan span, int start, int end) { + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + textView.post( + () -> { + final Spannable text = (Spannable) textView.getText(); + text.setSpan(span, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE); + Selection.setSelection(text, (start + end) / 2); + }); + getInstrumentation().waitForIdleSync(); + } + + @SmallTest + public void testOnTextContextMenuItem() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + textView.post(() -> textView.onTextContextMenuItem(TextView.ID_REPLACE)); + getInstrumentation().waitForIdleSync(); + + assertSuggestionsPopupIsDisplayed(); + } + + @SmallTest + public void testSelectionActionMode() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('e'))); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarContainsItem( + getActivity().getString(com.android.internal.R.string.replace)); + sleepForFloatingToolbarPopup(); + clickFloatingToolbarItem( + getActivity().getString(com.android.internal.R.string.replace)); + + assertSuggestionsPopupIsDisplayed(); + } + + @SmallTest + public void testInsertionActionMode() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); + onHandleView(com.android.internal.R.id.insertion_handle).perform(click()); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarContainsItem( + getActivity().getString(com.android.internal.R.string.replace)); + clickFloatingToolbarItem( + getActivity().getString(com.android.internal.R.string.replace)); + + assertSuggestionsPopupIsDisplayed(); + } + + private void showSuggestionsPopup() { + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + textView.post(() -> textView.onTextContextMenuItem(TextView.ID_REPLACE)); + getInstrumentation().waitForIdleSync(); + assertSuggestionsPopupIsDisplayed(); + } + + @SmallTest + public void testSuggestionItems() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + showSuggestionsPopup(); + + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("DEF"); + assertSuggestionsPopupContainsItem("Def"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); + + // Select an item. + clickSuggestionsPopupItem("DEF"); + assertSuggestionsPopupIsNotDisplayed(); + onView(withId(R.id.textview)).check(matches(withText("abc DEF ghi"))); + + showSuggestionsPopup(); + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("def"); + assertSuggestionsPopupContainsItem("Def"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); + + // Delete + clickSuggestionsPopupItem( + getActivity().getString(com.android.internal.R.string.delete)); + assertSuggestionsPopupIsNotDisplayed(); + onView(withId(R.id.textview)).check(matches(withText("abc ghi"))); + } + + @SmallTest + public void testMisspelled() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_MISSPELLED); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + showSuggestionsPopup(); + + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("DEF"); + assertSuggestionsPopupContainsItem("Def"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.addToDictionary)); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); + + // Click "Add to dictionary". + clickSuggestionsPopupItem( + getActivity().getString(com.android.internal.R.string.addToDictionary)); + // TODO: Check if add to dictionary dialog is displayed. + } + + @SmallTest + public void testEasyCorrect() { + final String text = "abc def ghi"; + + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + new String[]{"DEF", "Def"}, + SuggestionSpan.FLAG_EASY_CORRECT | SuggestionSpan.FLAG_MISSPELLED); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + + onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); + + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("DEF"); + assertSuggestionsPopupContainsItem("Def"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); + + // Select an item. + clickSuggestionsPopupItem("DEF"); + assertSuggestionsPopupIsNotDisplayed(); + onView(withId(R.id.textview)).check(matches(withText("abc DEF ghi"))); + + onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); + assertSuggestionsPopupIsNotDisplayed(); + + showSuggestionsPopup(); + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("def"); + assertSuggestionsPopupContainsItem("Def"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); + } + @SmallTest - @Suppress public void testTextAppearanceInSuggestionsPopup() { - final Activity activity = getActivity(); + final String text = "abc def ghi"; - final String sampleText = "abc def ghi"; final String[] singleWordCandidates = {"DEF", "Def"}; - final SuggestionSpan singleWordSuggestionSpan = new SuggestionSpan(activity, - singleWordCandidates, SuggestionSpan.FLAG_AUTO_CORRECTION); - final int singleWordSpanStart = 4; - final int singleWordSpanEnd = 7; - + final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), + singleWordCandidates, SuggestionSpan.FLAG_MISSPELLED); final String[] multiWordCandidates = {"ABC DEF GHI", "Abc Def Ghi"}; - final SuggestionSpan multiWordSuggestionSpan = new SuggestionSpan(activity, - multiWordCandidates, SuggestionSpan.FLAG_AUTO_CORRECTION); - final int multiWordSpanStart = 0; - final int multiWordSpanEnd = 11; + final SuggestionSpan multiWordSuggestionSpan = new SuggestionSpan(getActivity(), + multiWordCandidates, SuggestionSpan.FLAG_MISSPELLED); - TypedArray array = activity.obtainStyledAttributes(com.android.internal.R.styleable.Theme); - int id = array.getResourceId( + final TypedArray array = + getActivity().obtainStyledAttributes(com.android.internal.R.styleable.Theme); + final int id = array.getResourceId( com.android.internal.R.styleable.Theme_textEditSuggestionHighlightStyle, 0); array.recycle(); - - TextAppearanceSpan expectedSpan = new TextAppearanceSpan(activity, id); - TextPaint tmpTp = new TextPaint(); + final TextAppearanceSpan expectedSpan = new TextAppearanceSpan(getActivity(), id); + final TextPaint tmpTp = new TextPaint(); expectedSpan.updateDrawState(tmpTp); final int expectedHighlightTextColor = tmpTp.getColor(); final float expectedHighlightTextSize = tmpTp.getTextSize(); - - final EditText editText = (EditText) activity.findViewById(R.id.textview); - final Editor editor = editText.getEditorForTesting(); - assertNotNull(editor); - - // Request to show SuggestionsPopupWindow. - Runnable showSuggestionWindowRunner = new Runnable() { - @Override - public void run() { - SpannableStringBuilder ssb = new SpannableStringBuilder(); - ssb.append(sampleText); - ssb.setSpan(singleWordSuggestionSpan, singleWordSpanStart, singleWordSpanEnd, - Spanned.SPAN_INCLUSIVE_INCLUSIVE); - ssb.setSpan(multiWordSuggestionSpan, multiWordSpanStart, multiWordSpanEnd, - Spanned.SPAN_INCLUSIVE_INCLUSIVE); - editText.setText(ssb); - - Selection.setSelection(editText.getText(), singleWordSpanStart, singleWordSpanEnd); - editText.onTextContextMenuItem(TextView.ID_REPLACE); - } - }; + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); // In this test, the SuggestionsPopupWindow looks like // abc def ghi @@ -103,96 +285,74 @@ public class SuggestionsPopupWindowTest extends ActivityInstrumentationTestCase2 // | DELETE | // ----------------- // *XX* means that XX is highlighted. - Runnable popupVaridator = new Runnable() { - @Override - public void run() { - Editor.SuggestionsPopupWindow popupWindow = - editor.getSuggestionsPopupWindowForTesting(); - assertNotNull(popupWindow); - - LinearLayout linearLayout = (LinearLayout) popupWindow.getContentViewForTesting(); - assertNotNull(linearLayout); - - ListView listView = (ListView)linearLayout.findViewById( - com.android.internal.R.id.suggestionContainer); - assertNotNull(listView); - - int childNum = listView.getChildCount(); - assertEquals(singleWordCandidates.length + multiWordCandidates.length, childNum); - - for (int i = 0; i < singleWordCandidates.length; ++i) { - TextView textView = (TextView) listView.getChildAt(i); - assertNotNull(textView); - - Spanned spanned = (Spanned) textView.getText(); - assertNotNull(spanned); - - // Check that the suggestion item order is kept. - String expectedText = "abc " + singleWordCandidates[i] + " ghi"; - assertEquals(expectedText, spanned.toString()); - - // Check that the text is highlighted with correct color and text size. - TextAppearanceSpan[] taSpan = spanned.getSpans(singleWordSpanStart, - singleWordSpanEnd, TextAppearanceSpan.class); - assertEquals(1, taSpan.length); - TextPaint tp = new TextPaint(); - taSpan[0].updateDrawState(tp); - assertEquals(expectedHighlightTextColor, tp.getColor()); - assertEquals(expectedHighlightTextSize, tp.getTextSize()); - - // Check only center word is highlighted. - assertEquals(singleWordSpanStart, spanned.getSpanStart(taSpan[0])); - assertEquals(singleWordSpanEnd, spanned.getSpanEnd(taSpan[0])); - } + for (int i = 0; i < 2; i++) { + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); + setSuggestionSpan(multiWordSuggestionSpan, 0, text.length()); - for (int i = 0; i < multiWordCandidates.length; ++i) { - int indexInListView = singleWordCandidates.length + i; - TextView textView = (TextView) listView.getChildAt(indexInListView); - assertNotNull(textView); - - Spanned spanned = (Spanned) textView.getText(); - assertNotNull(spanned); - - // Check that the suggestion item order is kept. - assertEquals(multiWordCandidates[i], spanned.toString()); - - // Check that the text is highlighted with correct color and text size. - TextAppearanceSpan[] taSpan = spanned.getSpans( - 0, multiWordCandidates[i].length(), TextAppearanceSpan.class); - assertEquals(1, taSpan.length); - TextPaint tp = new TextPaint(); - taSpan[0].updateDrawState(tp); - assertEquals(expectedHighlightTextColor, tp.getColor()); - assertEquals(expectedHighlightTextSize, tp.getTextSize()); - - // Check the whole text is highlighted. - assertEquals(multiWordSpanStart, spanned.getSpanStart(taSpan[0])); - assertEquals(multiWordSpanEnd, spanned.getSpanEnd(taSpan[0])); - } + showSuggestionsPopup(); + assertSuggestionsPopupIsDisplayed(); + assertSuggestionsPopupContainsItem("abc DEF ghi"); + assertSuggestionsPopupContainsItem("abc Def ghi"); + assertSuggestionsPopupContainsItem("ABC DEF GHI"); + assertSuggestionsPopupContainsItem("Abc Def Ghi"); + assertSuggestionsPopupContainsItem( + getActivity().getString(com.android.internal.R.string.delete)); - TextView deleteButton = (TextView)linearLayout.findViewById( - com.android.internal.R.id.deleteButton); - assertEquals(View.VISIBLE, deleteButton.getWindowVisibility()); - } - }; + onSuggestionsPopup().check(new ViewAssertion() { + @Override + public void check(View view, NoMatchingViewException e) { + final ListView listView = (ListView) view.findViewById( + com.android.internal.R.id.suggestionContainer); + assertNotNull(listView); + final int childNum = listView.getChildCount(); + assertEquals(singleWordCandidates.length + multiWordCandidates.length, + childNum); - // Show the SuggestionWindow and verify the contents. - activity.runOnUiThread(showSuggestionWindowRunner); - getInstrumentation().waitForIdleSync(); - activity.runOnUiThread(popupVaridator); - - // Request to hide the SuggestionPopupWindow and wait until it is hidden. - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - editText.setText(""); - } - }); - getInstrumentation().waitForIdleSync(); + for (int j = 0; j < childNum; j++) { + final TextView suggestion = (TextView) listView.getChildAt(j); + assertNotNull(suggestion); + final Spanned spanned = (Spanned) suggestion.getText(); + assertNotNull(spanned); - // Show and verify the contents again. - activity.runOnUiThread(showSuggestionWindowRunner); - getInstrumentation().waitForIdleSync(); - activity.runOnUiThread(popupVaridator); + // Check that the suggestion item order is kept. + final String expectedText; + if (j < singleWordCandidates.length) { + expectedText = "abc " + singleWordCandidates[j] + " ghi"; + } else { + expectedText = multiWordCandidates[j - singleWordCandidates.length]; + } + assertEquals(expectedText, spanned.toString()); + + // Check that the text is highlighted with correct color and text size. + final TextAppearanceSpan[] taSpan = spanned.getSpans( + text.indexOf('d'), text.indexOf('f') + 1, TextAppearanceSpan.class); + assertEquals(1, taSpan.length); + TextPaint tp = new TextPaint(); + taSpan[0].updateDrawState(tp); + assertEquals(expectedHighlightTextColor, tp.getColor()); + assertEquals(expectedHighlightTextSize, tp.getTextSize()); + + // Check the correct part of the text is highlighted. + final int expectedStart; + final int expectedEnd; + if (j < singleWordCandidates.length) { + expectedStart = text.indexOf('d'); + expectedEnd = text.indexOf('f') + 1; + } else { + expectedStart = 0; + expectedEnd = text.length(); + } + assertEquals(expectedStart, spanned.getSpanStart(taSpan[0])); + assertEquals(expectedEnd, spanned.getSpanEnd(taSpan[0])); + } + } + }); + pressBack(); + onView(withId(R.id.textview)) + .inRoot(withDecorView(is(getActivity().getWindow().getDecorView()))) + .perform(clearText()); + } } } diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java index 923b8299a60a..edb749b95b10 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java @@ -16,6 +16,10 @@ package android.widget; + +import static android.widget.espresso.ContextMenuUtils.assertContextMenuContainsItemDisabled; +import static android.widget.espresso.ContextMenuUtils.assertContextMenuContainsItemEnabled; +import static android.widget.espresso.ContextMenuUtils.assertContextMenuIsNotDisplayed; import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles; import static android.widget.espresso.DragHandleUtils.onHandleView; import static android.widget.espresso.TextViewActions.mouseClickOnTextAtIndex; @@ -41,11 +45,9 @@ import static android.support.test.espresso.matcher.ViewMatchers.withText; import com.android.frameworks.coretests.R; -import android.support.test.espresso.Espresso; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.SmallTest; import android.view.MotionEvent; -import android.widget.espresso.ContextMenuUtils; /** * Tests mouse interaction of the TextView widget from an Activity @@ -57,7 +59,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< } @Override - public void setUp() { + public void setUp() throws Exception { + super.setUp(); getActivity(); } @@ -102,28 +105,28 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).perform(click()); onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text)); - ContextMenuUtils.assertContextMenuIsNotDisplayed(); + assertContextMenuIsNotDisplayed(); onView(withId(R.id.textview)).perform( mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY)); - ContextMenuUtils.assertContextMenuContainsItemDisabled( + assertContextMenuContainsItemDisabled( getActivity().getString(com.android.internal.R.string.copy)); - ContextMenuUtils.assertContextMenuContainsItemEnabled( + assertContextMenuContainsItemEnabled( getActivity().getString(com.android.internal.R.string.undo)); // Hide context menu. pressBack(); - ContextMenuUtils.assertContextMenuIsNotDisplayed(); + assertContextMenuIsNotDisplayed(); onView(withId(R.id.textview)).perform( mouseDragOnText(text.indexOf("c"), text.indexOf("h"))); onView(withId(R.id.textview)).perform( mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY)); - ContextMenuUtils.assertContextMenuContainsItemEnabled( + assertContextMenuContainsItemEnabled( getActivity().getString(com.android.internal.R.string.copy)); - ContextMenuUtils.assertContextMenuContainsItemEnabled( + assertContextMenuContainsItemEnabled( getActivity().getString(com.android.internal.R.string.undo)); // Hide context menu. @@ -133,9 +136,9 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).perform( mouseClickOnTextAtIndex(text.indexOf("i"), MotionEvent.BUTTON_SECONDARY)); - ContextMenuUtils.assertContextMenuContainsItemDisabled( + assertContextMenuContainsItemDisabled( getActivity().getString(com.android.internal.R.string.copy)); - ContextMenuUtils.assertContextMenuContainsItemEnabled( + assertContextMenuContainsItemEnabled( getActivity().getString(com.android.internal.R.string.undo)); // Hide context menu. diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index ecf88f1558a1..67ffd2b0ca3b 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -19,7 +19,6 @@ package android.widget; import static android.support.test.espresso.action.ViewActions.longClick; import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles; import static android.widget.espresso.DragHandleUtils.onHandleView; -import static android.widget.espresso.FloatingToolbarEspressoUtils.onFloatingToolBarItem; import static android.widget.espresso.TextViewActions.clickOnTextAtIndex; import static android.widget.espresso.TextViewActions.doubleTapAndDragOnText; import static android.widget.espresso.TextViewActions.doubleClickOnTextAtIndex; @@ -31,9 +30,10 @@ import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIn import static android.widget.espresso.TextViewAssertions.hasSelection; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed; -import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.pressKey; @@ -67,7 +67,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2 matcher) { + return onView(matcher).inRoot(withDecorView(hasDescendant(withId(id)))); + } + + /** + * Asserts that the suggestions popup is displayed on screen. + * + * @throws AssertionError if the assertion fails + */ + public static void assertSuggestionsPopupIsDisplayed() { + onSuggestionsPopup().check(matches(isDisplayed())); + } + + /** + * Asserts that the suggestions popup is not displayed on screen. + * + * @throws AssertionError if the assertion fails + */ + public static void assertSuggestionsPopupIsNotDisplayed() { + try { + onSuggestionsPopup().check(matches(isDisplayed())); + } catch (NoMatchingRootException | NoMatchingViewException | AssertionError e) { + return; + } + throw new AssertionError("Suggestions popup is displayed"); + } + + /** + * Asserts that the suggestions popup contains the specified item. + * + * @param itemLabel label of the item. + * @throws AssertionError if the assertion fails + */ + public static void assertSuggestionsPopupContainsItem(String itemLabel) { + onSuggestionsPopupItem(withText(itemLabel)).check(matches(isDisplayed())); + } + + /** + * Click on the specified item in the suggestions popup. + * + * @param itemLabel label of the item. + */ + public static void clickSuggestionsPopupItem(String itemLabel) { + onSuggestionsPopupItem(withText(itemLabel)).perform(new SuggestionItemClickAction()); + } + + /** + * Click action to avoid checking ViewClickAction#getConstraints(). + * TODO: Use Espresso.onData instead of this. + */ + private static final class SuggestionItemClickAction implements ViewAction { + private final ViewClickAction mViewClickAction; + + public SuggestionItemClickAction() { + mViewClickAction = + new ViewClickAction(Tap.SINGLE, GeneralLocation.VISIBLE_CENTER, Press.FINGER); + } + + @Override + public Matcher getConstraints() { + return isDisplayed(); + } + + @Override + public String getDescription() { + return mViewClickAction.getDescription(); + } + + @Override + public void perform(UiController uiController, View view) { + mViewClickAction.perform(uiController, view); + } + } +} -- 2.11.0