1a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov/*
2a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *
4a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * you may not use this file except in compliance with the License.
6a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * You may obtain a copy of the License at
7a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *
8a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *
10a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * See the License for the specific language governing permissions and
14a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * limitations under the License.
15a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov */
168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens
17a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovpackage com.android.providers.contacts;
18a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
196bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikovimport android.accounts.Account;
20a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.app.SearchManager;
21a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.content.ContentValues;
22a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.database.Cursor;
23a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.net.Uri;
24a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract;
25244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
26174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
27244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikovimport android.provider.ContactsContract.Data;
28a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaokaimport android.provider.ContactsContract.Intents;
2982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates;
30a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest;
31a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
32a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov/**
33a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Unit tests for {@link GlobalSearchSupport}.
345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <p>
35a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Run the test like this:
365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <p>
375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <code><pre>
388920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GlobalSearchSupportTest -w \
39a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * </pre></code>
41a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov */
42a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov@LargeTest
43a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovpublic class GlobalSearchSupportTest extends BaseContactsProvider2Test {
445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
45244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov    public void testSearchSuggestionsNotInDefaultDirectory() throws Exception {
466bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov        Account account = new Account("actname", "acttype");
47244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
48244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        // Creating an AUTO_ADD group will exclude all ungrouped contacts from global search
49244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        createGroup(account, "any", "any", 0 /* visible */, true /* auto-add */, false /* fav */);
50244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
516bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov        long rawContactId = createRawContact(account);
52a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        insertStructuredName(rawContactId, "Deer", "Dough");
53a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
54244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        // Remove the new contact from all groups
55244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId
56244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov                + " AND " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "'", null);
57244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
58a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
59a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("D").build();
60a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
61a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        // If the contact is not in the "my contacts" group, nothing should be found
62a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
63a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertEquals(0, c.getCount());
64a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.close();
65a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
66a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithPhoto() throws Exception {
685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                loadTestPhoto()).build();
705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectIcon1Uri(true).expectedText1(
715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Deer Dough").build().test();
72a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
73a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
749a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    public void testSearchSuggestionsByEmailWithPhoto() {
759a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
769a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov                loadTestPhoto()).email("foo@acme.com").build();
779a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        new SuggestionTesterBuilder(contact).query("foo@ac").expectIcon1Uri(true).expectedIcon2(
789a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov                String.valueOf(StatusUpdates.getPresenceIconResourceId(StatusUpdates.OFFLINE)))
799a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov                .expectedText1("Deer Dough").expectedText2("foo@acme.com").build().test();
809a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    }
819a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
82174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov    public void testSearchSuggestionsByName() {
835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .build();
855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectedText1("Deer Dough").expectedText2(
86174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                null).build().test();
875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
88a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
89174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov    public void testSearchByNickname() {
905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").nickname(
915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Little Fawn").company("Google").build();
925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("L").expectedText1("Deer Dough").expectedText2(
93174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                "Little Fawn").build().test();
945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
95a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchByCompany() {
975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .build();
995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("G").expectedText1("Deer Dough").expectedText2(
1005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Google").build().test();
1015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
102b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
1035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchByTitleWithCompany() {
1045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
1055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .title("Software Engineer").build();
1065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("S").expectIcon1Uri(false).expectedText1(
107174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                "Deer Dough").expectedText2("Software Engineer, Google").build().test();
108a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
109a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
1109a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    public void testSearchSuggestionsByPhoneNumberOnNonPhone() throws Exception {
1119a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        getContactsProvider().setIsPhone(false);
1129a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
1139a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
1149a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov                loadTestPhoto()).phone("1-800-4664-411").build();
1159a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        new SuggestionTesterBuilder(contact).query("1800").expectIcon1Uri(true).expectedText1(
1169a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov                "Deer Dough").expectedText2("1-800-4664-411").build().test();
1179a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    }
1189a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
1199a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    public void testSearchSuggestionsByPhoneNumberOnPhone() throws Exception {
1209a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        getContactsProvider().setIsPhone(true);
1219a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
122a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        ContentValues values = new ContentValues();
123a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
124a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
125280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("12345678").build();
126a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
127a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
128a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertEquals(2, c.getCount());
129a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.moveToFirst();
130a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
131a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number");
132280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678");
133a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
134a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                String.valueOf(com.android.internal.R.drawable.call_contact));
135a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
136a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
137280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678");
138a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.putNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
139a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertCursorValues(c, values);
140a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
141a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.moveToNext();
142a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.clear();
143a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Create contact");
144280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678");
145a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
146a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                String.valueOf(com.android.internal.R.drawable.create_contact));
147a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
148a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED);
149280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678");
150a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
151a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT);
152a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertCursorValues(c, values);
153a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.close();
154a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
155a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
1565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    /**
1572d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill     * Tests that the quick search suggestion returns the expected contact
1585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * information.
1595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     */
1605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    private final class SuggestionTester {
1615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final GoldenContact contact;
1635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String query;
1655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final boolean expectIcon1Uri;
1675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedIcon2;
1695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedText1;
1715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedText2;
1735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTester(SuggestionTesterBuilder builder) {
1755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            contact = builder.contact;
1765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            query = builder.query;
1775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectIcon1Uri = builder.expectIcon1Uri;
1785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedIcon2 = builder.expectedIcon2;
1795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText1 = builder.expectedText1;
1805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText2 = builder.expectedText2;
1815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
1825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
1842d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests suggest and refresh queries from quick search box, then deletes the contact from
1852d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * the data base.
1862d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
1875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public void test() {
1885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testQsbSuggest();
1902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testContactIdQsbRefresh();
1912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testLookupKeyQsbRefresh();
1922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
1932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            // Cleanup
1942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            contact.delete();
1952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
1962d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
1972d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
1982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider return the appropriate information from the golden
1992d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * contact in response to the suggestion query from the quick search box.
2002d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2012d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testQsbSuggest() {
2022d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            Uri searchUri = new Uri.Builder().scheme("content").authority(
2045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    ContactsContract.AUTHORITY).appendPath(SearchManager.SUGGEST_URI_PATH_QUERY)
2055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    .appendPath(query).build();
2065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            Cursor c = mResolver.query(searchUri, null, null, null, null);
2085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            assertEquals(1, c.getCount());
2095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            c.moveToFirst();
2105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1));
2125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            if (expectIcon1Uri) {
2135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertTrue(icon1.startsWith("content:"));
2145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            } else {
2155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture),
2165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                        icon1);
2175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            }
2185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2192d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            // SearchManager does not declare a constant for _id
2202d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            ContentValues values = getContactValues();
2215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            assertCursorValues(c, values);
2225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            c.close();
2232d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2242d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2252d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2262d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Returns the expected Quick Search Box content values for the golden contact.
2272d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2282d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private ContentValues getContactValues() {
2292d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2302d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            ContentValues values = new ContentValues();
2312d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put("_id", contact.getContactId());
2322d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1);
2332d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2);
2342d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2352d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2);
236174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA,
237174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                    Contacts.getLookupUri(contact.getContactId(), contact.getLookupKey())
238174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                            .toString());
239174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contact.getLookupKey());
240174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, query);
241174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            return values;
242174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov        }
243174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov
244174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov        /**
245174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov         * Returns the expected Quick Search Box content values for the golden contact.
246174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov         */
247174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov        private ContentValues getRefreshValues() {
248174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov
249174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            ContentValues values = new ContentValues();
250174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put("_id", contact.getContactId());
251174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1);
252174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2);
253174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov
254174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov            values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2);
2552d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, contact.getLookupKey());
2562d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contact.getLookupKey());
2572d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            return values;
2582d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2592d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2602d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2612d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Performs the refresh query and returns a cursor to the results.
2622d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *
2632d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * @param refreshId the final component path of the refresh query, which identifies which
2642d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *        contact to refresh.
2652d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2662d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private Cursor refreshQuery(String refreshId) {
2675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            // See if the same result is returned by a shortcut refresh
2692d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Uri refershUri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath(
2702d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                    SearchManager.SUGGEST_URI_PATH_SHORTCUT)
271174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                    .appendPath(refreshId)
272174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                    .appendQueryParameter(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, query)
273174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                    .build();
2745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            String[] projection = new String[] {
2765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_ICON_2,
2775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_TEXT_1, SearchManager.SUGGEST_COLUMN_TEXT_2,
2785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID,
2795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "_id",
2805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            };
2815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2822d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            return mResolver.query(refershUri, projection, null, null, null);
2832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2842d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2852d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2862d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider returns an empty result in response to a refresh query
2872d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * from the quick search box that uses the contact id to identify the contact.  The empty
2882d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * result indicates that the shortcut is no longer valid, and the QSB will replace it with
2892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * a new-style shortcut the next time they click on the contact.
2902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *
2912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * @see #testLookupKeyQsbRefresh()
2922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testContactIdQsbRefresh() {
2942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Cursor c = refreshQuery(String.valueOf(contact.getContactId()));
2962d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            try {
2972d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                assertEquals("Record count", 0, c.getCount());
2982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            } finally {
2992d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                c.close();
3002d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            }
3012d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
3022d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
3032d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
3042d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider return the appropriate information from the golden
3052d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * contact in response to the refresh query from the quick search box.  The refresh query
3062d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * uses the currently-supported mechanism of identifying the contact by the lookup key,
3072d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * which is more stable than the previously used contact id.
3082d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
3092d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testLookupKeyQsbRefresh() {
3102d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
3112d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Cursor c = refreshQuery(contact.getLookupKey());
3125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            try {
3135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertEquals("Record count", 1, c.getCount());
3145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                c.moveToFirst();
315174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                assertCursorValues(c, getRefreshValues());
3165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            } finally {
3175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                c.close();
3185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            }
3195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
3215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    /**
3235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * Builds {@link SuggestionTester} objects. Unspecified boolean objects default to
3245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * false. Unspecified String objects default to null.
3255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     */
3265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    private final class SuggestionTesterBuilder {
3275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final GoldenContact contact;
3295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String query;
3315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private boolean expectIcon1Uri;
3335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedIcon2;
3355b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedText1;
3375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedText2;
3395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder(GoldenContact contact) {
3415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            this.contact = contact;
3425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Builds the {@link SuggestionTester} specified by this builder.
3465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTester build() {
3485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return new SuggestionTester(this);
3495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3522d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * The text of the user's query to quick search (i.e., what they typed
3535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * in the search box).
3545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder query(String value) {
3565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            query = value;
3575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Whether to set Icon1, which in practice is the contact's photo.
3625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * <p>
3635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * TODO(tomo): Replace with actual expected value? This might be hard
3645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * because the values look non-deterministic, such as
3655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * "content://com.android.contacts/contacts/2015/photo"
3665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectIcon1Uri(boolean value) {
3685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectIcon1Uri = value;
3695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * The value for Icon2, which in practice is the contact's Chat status
3745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * (available, busy, etc.)
3755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedIcon2(String value) {
3775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedIcon2 = value;
3785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * First line of suggestion text expected to be returned (required).
3835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedText1(String value) {
3855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText1 = value;
3865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Second line of suggestion text expected to return (optional).
3915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedText2(String value) {
3935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText2 = value;
3945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
3975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill}
398