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
17package com.android.quicksearchbox;
18
19import com.android.quicksearchbox.util.MockNamedTaskExecutor;
20
21import android.os.Handler;
22import android.test.AndroidTestCase;
23import android.test.suitebuilder.annotation.MediumTest;
24
25import java.util.ArrayList;
26import java.util.Arrays;
27import java.util.Collections;
28import java.util.List;
29
30/**
31 * Tests for {@link SuggestionsProviderImpl}.
32 */
33@MediumTest
34public 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