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