1a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka/* 2a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * Copyright (C) 2015 The Android Open Source Project 3a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * 4a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 5a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * you may not use this file except in compliance with the License. 6a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * You may obtain a copy of the License at 7a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * 8a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 9a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * 10a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * Unless required by applicable law or agreed to in writing, software 11a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 12a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * See the License for the specific language governing permissions and 14a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * limitations under the License. 15a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka */ 16a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 17a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakapackage android.widget; 18a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 1931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.Espresso.onView; 2031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.Espresso.pressBack; 2131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.action.ViewActions.clearText; 2231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.action.ViewActions.click; 2331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.action.ViewActions.replaceText; 2431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.assertion.ViewAssertions.matches; 2531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.matcher.RootMatchers.withDecorView; 2631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.matcher.ViewMatchers.withId; 2731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.support.test.espresso.matcher.ViewMatchers.withText; 2831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.DragHandleUtils.onHandleView; 2931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; 3031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; 3131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; 3231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupContainsItem; 3331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsDisplayed; 3431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.SuggestionsPopupwindowUtils.assertSuggestionsPopupIsNotDisplayed; 3531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.SuggestionsPopupwindowUtils.clickSuggestionsPopupItem; 3631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.SuggestionsPopupwindowUtils.onSuggestionsPopup; 3731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.TextViewActions.clickOnTextAtIndex; 3831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static android.widget.espresso.TextViewActions.longPressOnTextAtIndex; 3931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport static org.hamcrest.Matchers.is; 40a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonakaimport android.content.res.TypedArray; 4131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport android.support.test.espresso.NoMatchingViewException; 4231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport android.support.test.espresso.ViewAssertion; 43a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.test.ActivityInstrumentationTestCase2; 44a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.test.suitebuilder.annotation.SmallTest; 45e5c431ccc02c16571750dd465cc3d91f7216e7d0Keisuke Kuroyanagiimport android.test.suitebuilder.annotation.Suppress; 46a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.text.Selection; 4731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagiimport android.text.Spannable; 48a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.text.Spanned; 49a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.text.TextPaint; 50a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.text.style.SuggestionSpan; 51a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport android.text.style.TextAppearanceSpan; 52a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonakaimport android.view.View; 53a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 54a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakaimport com.android.frameworks.coretests.R; 55a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 56a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka/** 57a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka * SuggestionsPopupWindowTest tests. 58f8e0da2624e1f5d99a493889e789e5f533b6fe0cKeisuke Kuroyanagi * 59f8e0da2624e1f5d99a493889e789e5f533b6fe0cKeisuke Kuroyanagi * TODO: Add tests for when there are no suggestions 60a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka */ 61a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonakapublic class SuggestionsPopupWindowTest extends ActivityInstrumentationTestCase2<TextViewActivity> { 62a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 63a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka public SuggestionsPopupWindowTest() { 64a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka super(TextViewActivity.class); 65a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka } 66a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 6731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @Override 6831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi protected void setUp() throws Exception { 6931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi super.setUp(); 7031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity(); 7131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 7231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 7331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi private void setSuggestionSpan(SuggestionSpan span, int start, int end) { 7431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextView textView = (TextView) getActivity().findViewById(R.id.textview); 7531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi textView.post( 7631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi () -> { 7731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final Spannable text = (Spannable) textView.getText(); 7831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi text.setSpan(span, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE); 7931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi Selection.setSelection(text, (start + end) / 2); 8031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi }); 8131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getInstrumentation().waitForIdleSync(); 8231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 8331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 8431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 8531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testOnTextContextMenuItem() { 8631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 8731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 8831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 8931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 9031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 9131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 9231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); 9331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 9431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 9531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextView textView = (TextView) getActivity().findViewById(R.id.textview); 9631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi textView.post(() -> textView.onTextContextMenuItem(TextView.ID_REPLACE)); 9731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getInstrumentation().waitForIdleSync(); 9831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 9931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 10031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 10131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 10231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 10331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testSelectionActionMode() { 10431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 10531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 10631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 10731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 10831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 10931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 11031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); 11131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 11231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 11331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('e'))); 11431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi sleepForFloatingToolbarPopup(); 11531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertFloatingToolbarContainsItem( 11631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.replace)); 11731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi sleepForFloatingToolbarPopup(); 11831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickFloatingToolbarItem( 11931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.replace)); 12031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 12131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 12231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 12331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 12431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 12531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testInsertionActionMode() { 12631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 12731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 12831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 12931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 13031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 13131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 13231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); 13331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 13431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 13531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); 13631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onHandleView(com.android.internal.R.id.insertion_handle).perform(click()); 13731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi sleepForFloatingToolbarPopup(); 13831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertFloatingToolbarContainsItem( 13931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.replace)); 14031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickFloatingToolbarItem( 14131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.replace)); 14231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 14331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 14431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 14531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 14631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi private void showSuggestionsPopup() { 14731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextView textView = (TextView) getActivity().findViewById(R.id.textview); 14831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi textView.post(() -> textView.onTextContextMenuItem(TextView.ID_REPLACE)); 14931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getInstrumentation().waitForIdleSync(); 15031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 15131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 15231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 15331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 15431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testSuggestionItems() { 15531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 15631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 15731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 15831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 15931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 16031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 16131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_AUTO_CORRECTION); 16231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 16331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 16431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi showSuggestionsPopup(); 16531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 16631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 16731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("DEF"); 16831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Def"); 16931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 17031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 17131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 17231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Select an item. 17331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickSuggestionsPopupItem("DEF"); 17431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsNotDisplayed(); 17531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).check(matches(withText("abc DEF ghi"))); 17631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 17731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi showSuggestionsPopup(); 17831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 17931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("def"); 18031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Def"); 18131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 18231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 18331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 18431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Delete 18531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickSuggestionsPopupItem( 18631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 18731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsNotDisplayed(); 18831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).check(matches(withText("abc ghi"))); 18931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 19031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 19131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 19231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testMisspelled() { 19331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 19431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 19531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 19631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 19731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 19831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 19931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, SuggestionSpan.FLAG_MISSPELLED); 20031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 20131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 20231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi showSuggestionsPopup(); 20331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 20431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 20531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("DEF"); 20631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Def"); 20731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 20831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.addToDictionary)); 20931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 21031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 21131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 21231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Click "Add to dictionary". 21331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickSuggestionsPopupItem( 21431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.addToDictionary)); 21531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // TODO: Check if add to dictionary dialog is displayed. 21631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 21731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 21831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @SmallTest 21931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void testEasyCorrect() { 22031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 22131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 22231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 22331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 22431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 22531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 22631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi new String[]{"DEF", "Def"}, 22731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi SuggestionSpan.FLAG_EASY_CORRECT | SuggestionSpan.FLAG_MISSPELLED); 22831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 22931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 23031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); 23131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 23231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 23331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("DEF"); 23431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Def"); 23531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 23631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 23731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 23831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Select an item. 23931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi clickSuggestionsPopupItem("DEF"); 24031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsNotDisplayed(); 24131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).check(matches(withText("abc DEF ghi"))); 24231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 24331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('e'))); 24431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsNotDisplayed(); 24531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 24631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi showSuggestionsPopup(); 24731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 24831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("def"); 24931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Def"); 25031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 25131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 25231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 25331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 254a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka @SmallTest 25590dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka public void testTextAppearanceInSuggestionsPopup() { 25631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String text = "abc def ghi"; 257a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 25890dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka final String[] singleWordCandidates = {"DEF", "Def"}; 25931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan suggestionSpan = new SuggestionSpan(getActivity(), 26031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi singleWordCandidates, SuggestionSpan.FLAG_MISSPELLED); 26190dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka final String[] multiWordCandidates = {"ABC DEF GHI", "Abc Def Ghi"}; 26231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final SuggestionSpan multiWordSuggestionSpan = new SuggestionSpan(getActivity(), 26331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi multiWordCandidates, SuggestionSpan.FLAG_MISSPELLED); 26490dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka 26531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TypedArray array = 26631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().obtainStyledAttributes(com.android.internal.R.styleable.Theme); 26731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final int id = array.getResourceId( 268a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonaka com.android.internal.R.styleable.Theme_textEditSuggestionHighlightStyle, 0); 269a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonaka array.recycle(); 27031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextAppearanceSpan expectedSpan = new TextAppearanceSpan(getActivity(), id); 27131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextPaint tmpTp = new TextPaint(); 272a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka expectedSpan.updateDrawState(tmpTp); 273a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka final int expectedHighlightTextColor = tmpTp.getColor(); 274a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka final float expectedHighlightTextSize = tmpTp.getTextSize(); 27531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextView textView = (TextView) getActivity().findViewById(R.id.textview); 276a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka 277a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka // In this test, the SuggestionsPopupWindow looks like 27890dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // abc def ghi 27990dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // ----------------- 28090dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // | abc *DEF* ghi | 28190dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // | abc *Def* ghi | 28290dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // | *ABC DEF GHI* | 28390dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // | *Abc Def Ghi* | 284a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonaka // ----------------- 28590dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // | DELETE | 28690dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka // ----------------- 287a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka // *XX* means that XX is highlighted. 28831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi for (int i = 0; i < 2; i++) { 28931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(click()); 29031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)).perform(replaceText(text)); 29131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(suggestionSpan, text.indexOf('d'), text.indexOf('f') + 1); 29231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi setSuggestionSpan(multiWordSuggestionSpan, 0, text.length()); 29390dc849f630d6e0b2f26acc97419ecd606d47dc6Seigo Nonaka 29431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi showSuggestionsPopup(); 29531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupIsDisplayed(); 29631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("abc DEF ghi"); 29731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("abc Def ghi"); 29831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("ABC DEF GHI"); 29931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem("Abc Def Ghi"); 30031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertSuggestionsPopupContainsItem( 30131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi getActivity().getString(com.android.internal.R.string.delete)); 302a71a244ec6c83e8627f10d3d04228ff8e7915c09Seigo Nonaka 30331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onSuggestionsPopup().check(new ViewAssertion() { 30431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi @Override 30531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi public void check(View view, NoMatchingViewException e) { 30631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final ListView listView = (ListView) view.findViewById( 30731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi com.android.internal.R.id.suggestionContainer); 30831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertNotNull(listView); 30931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final int childNum = listView.getChildCount(); 31031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(singleWordCandidates.length + multiWordCandidates.length, 31131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi childNum); 3127afa67ca22a1cae7cadc8c5a1278122395a8b895Seigo Nonaka 31331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi for (int j = 0; j < childNum; j++) { 31431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextView suggestion = (TextView) listView.getChildAt(j); 31531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertNotNull(suggestion); 31631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final Spanned spanned = (Spanned) suggestion.getText(); 31731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertNotNull(spanned); 3187afa67ca22a1cae7cadc8c5a1278122395a8b895Seigo Nonaka 31931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Check that the suggestion item order is kept. 32031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final String expectedText; 32131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi if (j < singleWordCandidates.length) { 32231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedText = "abc " + singleWordCandidates[j] + " ghi"; 32331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } else { 32431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedText = multiWordCandidates[j - singleWordCandidates.length]; 32531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 32631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(expectedText, spanned.toString()); 32731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 32831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Check that the text is highlighted with correct color and text size. 32931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final TextAppearanceSpan[] taSpan = spanned.getSpans( 33031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi text.indexOf('d'), text.indexOf('f') + 1, TextAppearanceSpan.class); 33131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(1, taSpan.length); 33231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi TextPaint tp = new TextPaint(); 33331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi taSpan[0].updateDrawState(tp); 33431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(expectedHighlightTextColor, tp.getColor()); 33531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(expectedHighlightTextSize, tp.getTextSize()); 33631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi 33731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi // Check the correct part of the text is highlighted. 33831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final int expectedStart; 33931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi final int expectedEnd; 34031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi if (j < singleWordCandidates.length) { 34131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedStart = text.indexOf('d'); 34231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedEnd = text.indexOf('f') + 1; 34331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } else { 34431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedStart = 0; 34531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi expectedEnd = text.length(); 34631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 34731eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(expectedStart, spanned.getSpanStart(taSpan[0])); 34831eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi assertEquals(expectedEnd, spanned.getSpanEnd(taSpan[0])); 34931eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 35031eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 35131eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi }); 35231eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi pressBack(); 35331eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi onView(withId(R.id.textview)) 35431eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi .inRoot(withDecorView(is(getActivity().getWindow().getDecorView()))) 35531eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi .perform(clearText()); 35631eb74fb2bc33aea6a8054c861a6e7aac7c41f4bKeisuke Kuroyanagi } 357a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka } 358a60160b30bf1b6aa27cdaf03cf9b6c245f338d84Seigo Nonaka} 359