Updating the search ranking API and some improvements:
- Ranking API is modified to run the ranking asynchronous to the main thread. Therefore, it can now run in parallel to loading the results from DB which decreases the overall latency. - Ranking API now supports reporting failure from the ranker implementation side. - Settings that are not ranked by the ranker algorithm are now ranked at the end of the list. This is added for dynamic settings (e.g., apps). - Failure handling mechanism is added for cases that ranker catches an exception or it takes a long time to respond. Bug: 37312700 Fixes: 36866337 Fixes: 36867476 Fixes: 36866736 Fixes: 36866838 Test: RunSettingsRoboTests Change-Id: I3a2a97e3a07a8d4afbb090061d92172a27588ee7
This commit is contained in:
@@ -21,6 +21,7 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.Pair;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
@@ -28,24 +29,31 @@ import com.android.settings.R;
|
||||
import com.android.settings.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.search.SearchResult.Builder;
|
||||
import com.android.settings.search.ranking.SearchResultsRankerCallback;
|
||||
|
||||
import static org.junit.Assert.assertNull;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowLooper;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyList;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -63,6 +71,9 @@ public class SearchResultsAdapterTest {
|
||||
private SearchFeatureProvider mSearchFeatureProvider;
|
||||
@Mock
|
||||
private Context mMockContext;
|
||||
@Captor
|
||||
private ArgumentCaptor<Integer> mSearchResultsCountCaptor =
|
||||
ArgumentCaptor.forClass(Integer.class);
|
||||
private SearchResultsAdapter mAdapter;
|
||||
private Context mContext;
|
||||
private String mLoaderClassName;
|
||||
@@ -73,10 +84,10 @@ public class SearchResultsAdapterTest {
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = Robolectric.buildActivity(Activity.class).get();
|
||||
mAdapter = new SearchResultsAdapter(mFragment, mSearchFeatureProvider);
|
||||
mLoaderClassName = DatabaseResultLoader.class.getName();
|
||||
when(mFragment.getContext()).thenReturn(mMockContext);
|
||||
when(mMockContext.getApplicationContext()).thenReturn(mContext);
|
||||
mAdapter = new SearchResultsAdapter(mFragment, mSearchFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -88,8 +99,9 @@ public class SearchResultsAdapterTest {
|
||||
@Test
|
||||
public void testSingleSourceMerge_exactCopyReturned() {
|
||||
Set<SearchResult> intentResults = getIntentSampleResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(intentResults, mLoaderClassName);
|
||||
mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> updatedResults = mAdapter.getSearchResults();
|
||||
assertThat(updatedResults).containsAllIn(intentResults);
|
||||
@@ -113,11 +125,12 @@ public class SearchResultsAdapterTest {
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_properResultsMerged_correctOrder() {
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(getDummyAppResults()),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(getDummyDbResults()),
|
||||
DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
@@ -126,25 +139,28 @@ public class SearchResultsAdapterTest {
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(count).isEqualTo(6);
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_addResults_resultsAddedInOrder() {
|
||||
List<AppSearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
// Add two individual items
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults.subList(0, 1)),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(dbResults.subList(0, 1)),
|
||||
DatabaseResultLoader.class.getName());
|
||||
mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
// Add super-set of items
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<SearchResult>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<SearchResult>(dbResults), DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
@@ -153,46 +169,333 @@ public class SearchResultsAdapterTest {
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(count).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayResults_ShouldNotRunSmartRankingIfDisabled() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any()))
|
||||
.thenReturn(false);
|
||||
mAdapter.displaySearchResults("");
|
||||
verify(mSearchFeatureProvider, never()).rankSearchResults(anyString(), anyList());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayResults_ShouldRunSmartRankingIfEnabled() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any()))
|
||||
.thenReturn(true);
|
||||
mAdapter.displaySearchResults("");
|
||||
verify(mSearchFeatureProvider, times(1)).rankSearchResults(anyString(), anyList());
|
||||
verify(mFragment, times(2)).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getAllValues().toArray())
|
||||
.isEqualTo(new Integer[] {2, 6});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_removeResults_resultsAdded() {
|
||||
List<AppSearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
// Add list of items
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(dbResults),
|
||||
DatabaseResultLoader.class.getName());
|
||||
mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
// Add subset of items
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(new HashSet<SearchResult>(appResults.subList(0, 1)),
|
||||
InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(new HashSet<>(dbResults.subList(0, 1)),
|
||||
DatabaseResultLoader.class.getName());
|
||||
int count = mAdapter.displaySearchResults("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]);
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[3]);
|
||||
assertThat(count).isEqualTo(2);
|
||||
verify(mFragment, times(2)).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getAllValues().toArray())
|
||||
.isEqualTo(new Integer[] {6, 2});
|
||||
}
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndSucceededAfterResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
mAdapter.onRankingScoresAvailable(getDummyRankingScores());
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndSucceededBeforeResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.onRankingScoresAvailable(getDummyRankingScores());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndFailedAfterResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
mAdapter.onRankingFailed();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndFailedBeforeResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.onRankingFailed();
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndTimedoutAfterResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
waitUntilRankingTimesOut();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEndToEndSearch_smartSearchRankingEnabledAndTimedoutBeforeResultsLoaded() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
|
||||
waitUntilRankingTimesOut();
|
||||
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
|
||||
List<SearchResult> results = mAdapter.getSearchResults();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[2]); // charlie
|
||||
verify(mFragment).onSearchResultsDisplayed(mSearchResultsCountCaptor.capture());
|
||||
assertThat(mSearchResultsCountCaptor.getValue()).isEqualTo(6);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoSmartRanking_shouldRankAppResultsAfterDbResults() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
mAdapter.onRankingScoresAvailable(getDummyRankingScores());
|
||||
List<SearchResult> results = mAdapter.doAsyncRanking();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDoSmartRanking_shouldRankResultsWithMissingScoresAfterScoredResults() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
mAdapter.notifyResultsLoaded();
|
||||
List<Pair<String, Float>> rankingScores = getDummyRankingScores();
|
||||
rankingScores.remove(1); // no ranking score for alpha
|
||||
mAdapter.onRankingScoresAvailable(rankingScores);
|
||||
List<SearchResult> results = mAdapter.doAsyncRanking();
|
||||
assertThat(results.get(0).title).isEqualTo(TITLES[2]); // charlie
|
||||
assertThat(results.get(1).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(results.get(2).title).isEqualTo(TITLES[0]); // alpha
|
||||
assertThat(results.get(3).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(results.get(4).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(results.get(5).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUnsortedLoadedResults () {
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
Set<CharSequence> expectedDbTitles = new HashSet<>(
|
||||
Arrays.asList("alpha", "bravo", "charlie"));
|
||||
Set<CharSequence> expectedAppTitles = new HashSet<>(
|
||||
Arrays.asList("appAlpha", "appBravo", "appCharlie"));
|
||||
Set<CharSequence> actualDbTitles = new HashSet<>();
|
||||
Set<CharSequence> actualAppTitles = new HashSet<>();
|
||||
for (SearchResult result : mAdapter.getUnsortedLoadedResults(SearchResultsAdapter
|
||||
.DB_RESULTS_LOADER_KEY)) {
|
||||
actualDbTitles.add(result.title);
|
||||
}
|
||||
for (SearchResult result : mAdapter.getUnsortedLoadedResults(SearchResultsAdapter
|
||||
.APP_RESULTS_LOADER_KEY)) {
|
||||
actualAppTitles.add(result.title);
|
||||
}
|
||||
assertThat(actualDbTitles).isEqualTo(expectedDbTitles);
|
||||
assertThat(actualAppTitles).isEqualTo(expectedAppTitles);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSortedLoadedResults() {
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(appResults), InstalledAppResultLoader.class.getName());
|
||||
mAdapter.addSearchResults(
|
||||
new HashSet<>(dbResults), DatabaseResultLoader.class.getName());
|
||||
List<? extends SearchResult> actualDbResults =
|
||||
mAdapter.getSortedLoadedResults(SearchResultsAdapter.DB_RESULTS_LOADER_KEY);
|
||||
List<? extends SearchResult> actualAppResults =
|
||||
mAdapter.getSortedLoadedResults(SearchResultsAdapter.APP_RESULTS_LOADER_KEY);
|
||||
assertThat(actualDbResults.get(0).title).isEqualTo(TITLES[0]); // charlie
|
||||
assertThat(actualDbResults.get(1).title).isEqualTo(TITLES[1]); // bravo
|
||||
assertThat(actualDbResults.get(2).title).isEqualTo(TITLES[2]); // alpha
|
||||
assertThat(actualAppResults.get(0).title).isEqualTo(TITLES[3]); // appAlpha
|
||||
assertThat(actualAppResults.get(1).title).isEqualTo(TITLES[4]); // appBravo
|
||||
assertThat(actualAppResults.get(2).title).isEqualTo(TITLES[5]); // appCharlie
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInitializeSearch_shouldNotRunSmartRankingIfDisabled() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(false);
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
verify(mSearchFeatureProvider, never()).querySearchResults(
|
||||
any(Context.class), anyString(), any(SearchResultsRankerCallback.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInitialSearch_shouldRunSmartRankingIfEnabled() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.notifyResultsLoaded();
|
||||
verify(mSearchFeatureProvider, times(1)).querySearchResults(
|
||||
any(Context.class), anyString(), any(SearchResultsRankerCallback.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRankingScoreByStableId() {
|
||||
when(mSearchFeatureProvider.isSmartSearchRankingEnabled(any())).thenReturn(true);
|
||||
|
||||
List<SearchResult> appResults = getDummyAppResults();
|
||||
List<SearchResult> dbResults = getDummyDbResults();
|
||||
mAdapter.initializeSearch("");
|
||||
mAdapter.onRankingScoresAvailable(getDummyRankingScores());
|
||||
assertThat(mAdapter.getRankingScoreByStableId(dbResults.get(0).stableId))
|
||||
.isWithin(1e-10f).of(0.8f);
|
||||
assertThat(mAdapter.getRankingScoreByStableId(dbResults.get(1).stableId))
|
||||
.isWithin(1e-10f).of(0.2f);
|
||||
assertThat(mAdapter.getRankingScoreByStableId(dbResults.get(2).stableId))
|
||||
.isWithin(1e-10f).of(0.9f);
|
||||
assertThat(mAdapter.getRankingScoreByStableId(appResults.get(0).stableId))
|
||||
.isEqualTo(-Float.MAX_VALUE);
|
||||
assertThat(mAdapter.getRankingScoreByStableId(appResults.get(1).stableId))
|
||||
.isEqualTo(-Float.MAX_VALUE);
|
||||
assertThat(mAdapter.getRankingScoreByStableId(appResults.get(2).stableId))
|
||||
.isEqualTo(-Float.MAX_VALUE);
|
||||
}
|
||||
|
||||
private void waitUntilRankingTimesOut() {
|
||||
while (mAdapter.getHandler().hasMessages(mAdapter.MSG_RANKING_TIMED_OUT)) {
|
||||
try {
|
||||
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<SearchResult> getDummyDbResults() {
|
||||
@@ -218,8 +521,8 @@ public class SearchResultsAdapterTest {
|
||||
return results;
|
||||
}
|
||||
|
||||
private List<AppSearchResult> getDummyAppResults() {
|
||||
List<AppSearchResult> results = new ArrayList<>();
|
||||
private List<SearchResult> getDummyAppResults() {
|
||||
List<SearchResult> results = new ArrayList<>();
|
||||
ResultPayload payload = new ResultPayload(new Intent());
|
||||
AppSearchResult.Builder builder = new AppSearchResult.Builder();
|
||||
builder.setPayload(payload)
|
||||
@@ -265,4 +568,16 @@ public class SearchResultsAdapterTest {
|
||||
sampleResults.add(builder.build());
|
||||
return sampleResults;
|
||||
}
|
||||
}
|
||||
|
||||
private List<Pair<String, Float>> getDummyRankingScores() {
|
||||
List<SearchResult> results = getDummyDbResults();
|
||||
List<Pair<String, Float>> scores = new ArrayList<>();
|
||||
scores.add(
|
||||
new Pair<String, Float>(Long.toString(results.get(2).stableId), 0.9f)); // charlie
|
||||
scores.add(
|
||||
new Pair<String, Float>(Long.toString(results.get(0).stableId), 0.8f)); // alpha
|
||||
scores.add(
|
||||
new Pair<String, Float>(Long.toString(results.get(1).stableId), 0.2f)); // bravo
|
||||
return scores;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user