Home | History | Annotate | Download | only in quicksearchbox
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.quicksearchbox;
     18 
     19 import com.android.quicksearchbox.util.MockNamedTaskExecutor;
     20 
     21 import android.os.Handler;
     22 import android.test.AndroidTestCase;
     23 import android.test.suitebuilder.annotation.MediumTest;
     24 
     25 import java.util.ArrayList;
     26 import java.util.Arrays;
     27 import java.util.Collections;
     28 import java.util.List;
     29 
     30 /**
     31  * Tests for {@link SuggestionsProviderImpl}.
     32  */
     33 @MediumTest
     34 public class SuggestionsProviderImplTest extends AndroidTestCase {
     35 
     36     private List<Corpus> mCorpora;
     37     private MockNamedTaskExecutor mTaskExecutor;
     38     private SuggestionsProviderImpl mProvider;
     39     private MockShortcutRepository mShortcutRepo;
     40 
     41     @Override
     42     protected void setUp() throws Exception {
     43         Config config = new Config(getContext());
     44         mTaskExecutor = new MockNamedTaskExecutor();
     45         Handler publishThread = new MockHandler();
     46         mShortcutRepo = new MockShortcutRepository();
     47         mCorpora = new ArrayList<Corpus>();
     48         mCorpora.add(MockCorpus.CORPUS_1);
     49         mCorpora.add(MockCorpus.CORPUS_2);
     50         Logger logger = new MockLogger();
     51         mProvider = new SuggestionsProviderImpl(config,
     52                 mTaskExecutor,
     53                 publishThread,
     54                 logger);
     55     }
     56 
     57     public void testSingleCorpus() {
     58         Suggestions suggestions = mProvider.getSuggestions("foo",
     59                 Collections.singletonList(MockCorpus.CORPUS_1));
     60         suggestions.setShortcuts(mShortcutRepo.getShortcutsForQuery(
     61                 "foo", mCorpora));
     62         try {
     63             assertEquals(1, suggestions.getExpectedResultCount());
     64             assertEquals(0, suggestions.getResultCount());
     65             assertEquals(0, promote(suggestions).getCount());
     66             assertTrue(mTaskExecutor.runNext());
     67             assertEquals(1, suggestions.getExpectedResultCount());
     68             assertEquals(1, suggestions.getResultCount());
     69             assertEquals(MockCorpus.CORPUS_1.getSuggestions("foo", 3, true).getCount(),
     70                     promote(suggestions).getCount());
     71             mTaskExecutor.assertDone();
     72         } finally {
     73             if (suggestions != null) suggestions.release();
     74         }
     75     }
     76 
     77     public void testMultipleCorpora() {
     78         Suggestions suggestions = mProvider.getSuggestions("foo",
     79                 Arrays.asList(MockCorpus.CORPUS_1, MockCorpus.CORPUS_2));
     80         suggestions.setShortcuts(mShortcutRepo.getShortcutsForQuery(
     81                         "foo", mCorpora));
     82         try {
     83             int corpus1Count = MockCorpus.CORPUS_1.getSuggestions("foo", 3, true).getCount();
     84             int corpus2Count = MockCorpus.CORPUS_2.getSuggestions("foo", 3, true).getCount();
     85             assertEquals(mCorpora.size(), suggestions.getExpectedResultCount());
     86             assertEquals(0, suggestions.getResultCount());
     87             assertEquals(0, promote(suggestions).getCount());
     88             assertTrue(mTaskExecutor.runNext());
     89             assertEquals(1, suggestions.getResultCount());
     90             assertEquals("Incorrect promoted: " + promote(suggestions),
     91                     corpus1Count, promote(suggestions).getCount());
     92             assertTrue(mTaskExecutor.runNext());
     93             assertEquals(2, suggestions.getResultCount());
     94             assertEquals("Incorrect promoted: " + promote(suggestions),
     95                     corpus1Count + corpus2Count, promote(suggestions).getCount());
     96             mTaskExecutor.assertDone();
     97         } finally {
     98             if (suggestions != null) suggestions.release();
     99         }
    100     }
    101 
    102     private SuggestionCursor promote(Suggestions suggestions) {
    103         return suggestions.getPromoted(new ConcatPromoter(), 10);
    104     }
    105 
    106     private static class ConcatPromoter implements Promoter {
    107         public void pickPromoted(Suggestions suggestions, int maxPromoted,
    108                 ListSuggestionCursor promoted) {
    109             // Add suggestions
    110             for (SuggestionCursor c : suggestions.getCorpusResults()) {
    111                 for (int i = 0; i < c.getCount(); i++) {
    112                     if (promoted.getCount() >= maxPromoted) {
    113                         return;
    114                     }
    115                     promoted.add(new SuggestionPosition(c, i));
    116                 }
    117             }
    118         }
    119     }
    120 
    121 }
    122