DatabaseResultLoaderTest.java revision b7b286cb893268bec38584acdf5696f68675eced
17fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze/*
27fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * Copyright (C) 2017 The Android Open Source Project
37fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze *
47fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * Licensed under the Apache License, Version 2.0 (the "License");
57fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * you may not use this file except in compliance with the License.
67fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * You may obtain a copy of the License at
77fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze *
87fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze *      http://www.apache.org/licenses/LICENSE-2.0
97fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze *
107fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * Unless required by applicable law or agreed to in writing, software
117fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * distributed under the License is distributed on an "AS IS" BASIS,
127fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * See the License for the specific language governing permissions and
147fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze * limitations under the License.
157fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze *
167fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze */
177fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
18b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritzepackage com.android.settings.search2;
197fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
207fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport android.content.ContentValues;
217fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport android.content.Context;
227fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport android.database.sqlite.SQLiteDatabase;
23a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang
247fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport com.android.settings.SettingsRobolectricTestRunner;
257fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport com.android.settings.TestConfig;
26a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport com.android.settings.dashboard.SiteMapManager;
27b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritzeimport com.android.settings.search.IndexDatabaseHelper;
28a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils;
29a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport com.android.settings.testutils.FakeFeatureFactory;
30a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang
317fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.junit.After;
327fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.junit.Before;
337fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.junit.Test;
347fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.junit.runner.RunWith;
35a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport org.mockito.Answers;
36a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport org.mockito.Mock;
37a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport org.mockito.MockitoAnnotations;
387fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.robolectric.RuntimeEnvironment;
397fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport org.robolectric.annotation.Config;
407fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
41b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritzeimport java.util.List;
42b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze
437fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzeimport static com.google.common.truth.Truth.assertThat;
44a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport static org.mockito.Matchers.anyString;
45a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport static org.mockito.Matchers.eq;
46a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport static org.mockito.Mockito.times;
47a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport static org.mockito.Mockito.verify;
48a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhangimport static org.mockito.Mockito.when;
497fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
507fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze@RunWith(SettingsRobolectricTestRunner.class)
517fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
527fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritzepublic class DatabaseResultLoaderTest {
537fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
54a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
55a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private Context mMockContext;
56a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Mock
57a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private SiteMapManager mSiteMapManager;
58a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private Context mContext;
597fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    private DatabaseResultLoader loader;
607fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
617fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    SQLiteDatabase mDb;
627fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
637fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Before
647fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void setUp() {
65a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        MockitoAnnotations.initMocks(this);
667fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mContext = RuntimeEnvironment.application;
67a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        FakeFeatureFactory.setupForTest(mMockContext);
68a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        FakeFeatureFactory factory =
69a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                (FakeFeatureFactory) FakeFeatureFactory.getFactory(mMockContext);
70a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        when(factory.searchFeatureProvider.getSiteMapManager())
71a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                .thenReturn(mSiteMapManager);
727fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
737fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        setUpDb();
747fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
757fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
767fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @After
777fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void cleanUp() {
78a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang        DatabaseTestUtils.clearDb();
797fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
807fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
817fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
827fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testMatchTitle() {
8340ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "title", mSiteMapManager);
843f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(2);
853f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        verify(mSiteMapManager, times(2)).buildBreadCrumb(eq(mContext), anyString(), anyString());
867fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
877fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
887fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
897fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testMatchSummary() {
9040ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "summary", mSiteMapManager);
913f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(2);
927fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
937fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
947fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
957fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testMatchKeywords() {
9640ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "keywords", mSiteMapManager);
973f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(2);
987fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
997fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1007fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1017fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testMatchEntries() {
10240ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "entries", mSiteMapManager);
1033f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(2);
1047fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1057fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1067fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1077fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseWord_MatchesNonPrefix() {
1087fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("Data usage");
10940ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "usage", mSiteMapManager);
1107fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1117fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1127fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1137fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1147fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseSpace_Matches() {
1157fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("space");
11640ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, " space ", mSiteMapManager);
1177fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1187fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1197fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1207fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1217fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseDash_MatchesWordNoDash() {
1227fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("wi-fi calling");
12340ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "wifi", mSiteMapManager);
1247fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1257fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1267fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1277fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1287fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseDash_MatchesWordWithDash() {
1297fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("priorités seulment");
13040ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "priorités", mSiteMapManager);
1317fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1327fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1337fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1347fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1357fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseDash_MatchesWordWithoutDash() {
1367fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("priorités seulment");
13740ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "priorites", mSiteMapManager);
1387fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1397fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1407fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
1417fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    @Test
1427fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    public void testSpecialCaseDash_MatchesEntireQueryWithoutDash() {
1437fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        insertSpecialCase("wi-fi calling");
14440ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "wifi calling", mSiteMapManager);
1457fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
1467fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
1477fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
148314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
149314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCasePrefix_MatchesPrefixOfEntry() {
150314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Photos");
15140ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "pho", mSiteMapManager);
152314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
153314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
154314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
155314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
156314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCasePrefix_DoesNotMatchNonPrefixSubstring() {
157314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Photos");
15840ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "hot", mSiteMapManager);
159314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(0);
160314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
161314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
162314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
163314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefix_MatchesPrefixOfEntry() {
164314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps Notifications");
16540ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "Apps", mSiteMapManager);
166314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
167314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
168314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
169314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
170314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefix_MatchesSecondWordPrefixOfEntry() {
171314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps Notifications");
17240ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "Not", mSiteMapManager);
173314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
174314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
175314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
176314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
177314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefix_DoesNotMatchMatchesPrefixOfFirstEntry() {
178314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps Notifications");
17940ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "pp", mSiteMapManager);
180314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(0);
181314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
182314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
183314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
184314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefix_DoesNotMatchMatchesPrefixOfSecondEntry() {
185314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps Notifications");
18640ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "tion", mSiteMapManager);
187314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(0);
188314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
189314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
190314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
191314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefixWithSpecial_MatchesPrefixOfEntry() {
192314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps & Notifications");
19340ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "App", mSiteMapManager);
194314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
195314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
196314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
197314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    @Test
198314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    public void testSpecialCaseMultiWordPrefixWithSpecial_MatchesPrefixOfSecondEntry() {
199314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        insertSpecialCase("Apps & Notifications");
20040ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze        loader = new DatabaseResultLoader(mContext, "No", mSiteMapManager);
201314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        assertThat(loader.loadInBackground().size()).isEqualTo(1);
202314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze    }
203314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze
204b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze    @Test
205b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze    public void testSpecialCaseTwoWords_FirstWordMatches_RanksHigher() {
206b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        final String caseOne = "Apple pear";
207b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        final String caseTwo = "Banana apple";
208b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        insertSpecialCase(caseOne);
209b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        insertSpecialCase(caseTwo);
210b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        loader = new DatabaseResultLoader(mContext, "App", null);
211b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        List<? extends SearchResult> results = loader.loadInBackground();
212b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze
213b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        assertThat(results.get(0).title).isEqualTo(caseOne);
214b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        assertThat(results.get(1).title).isEqualTo(caseTwo);
215b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        assertThat(results.get(0).rank).isLessThan(results.get(1).rank);
216b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze    }
217b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze
2187fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    private void insertSpecialCase(String specialCase) {
2197fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        String normalized = DatabaseIndexingUtils.normalizeHyphen(specialCase);
2207fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        normalized = DatabaseIndexingUtils.normalizeString(normalized);
2217fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
2227fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        ContentValues values = new ContentValues();
223b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, normalized.hashCode());
2247fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
2257fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
2267fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
2277fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, normalized);
2287fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
2297fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
2307fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
2317fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
2327fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
2337fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
2347fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
2357fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze                "com.android.settings.gestures.GestureSettings");
2367fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
2377fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
2387fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
2397fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
2407fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
2413f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, true);
2427fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
2437fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
2447fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
2457fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
2467fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
2477fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
2487fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
2497fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
2507fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    private void setUpDb() {
2517fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        ContentValues values = new ContentValues();
2527fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 0);
2537fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
2547fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
2557fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "alpha_title");
2567fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "alpha title");
2577fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "alpha_summary");
258314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "alpha summary");
2597fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "alpha_summary");
260314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "alpha summary");
261314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "alpha entries");
262314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "alpha keywords");
2637fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
2647fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze                "com.android.settings.gestures.GestureSettings");
2657fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
2667fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
2677fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
2687fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
2697fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
2703f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, true);
2717fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
2727fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
2737fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
2747fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
2757fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
2767fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
2777fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
2787fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values = new ContentValues();
2797fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 1);
2807fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
2817fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
2827fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "bravo_title");
2837fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "bravo title");
2847fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "bravo_summary");
285314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "bravo summary");
2867fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "bravo_summary");
287314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "bravo summary");
288314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "bravo entries");
289314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "bravo keywords");
2907fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
2917fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze                "com.android.settings.gestures.GestureSettings");
2927fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
2937fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
2947fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
2957fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
2967fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
2973f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, true);
2987fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
2997fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
3007fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
3017fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
3027fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
3037fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
3047fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values = new ContentValues();
3057fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 2);
3067fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
3077fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
3087fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "charlie_title");
3097fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "charlie title");
3107fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "charlie_summary");
311314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "charlie summary");
3127fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "charlie_summary");
313314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "charlie summary");
314314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "charlie entries");
315314b09eb4b6bff2626604155e4273956aeaa24b5Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "charlie keywords");
3167fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
3177fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze                "com.android.settings.gestures.GestureSettings");
3187fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
3197fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
3207fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
3217fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
3227fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
3233f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, false);
3247fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
3257fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
3267fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
3277fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
3287fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze
3297fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
3307fda314980107337d2eb9237ed00e997ae4ee345Matthew Fritze    }
331b7b286cb893268bec38584acdf5696f68675ecedMatthew Fritze}