1b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert/*
2b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * Copyright (C) 2010 The Android Open Source Project
3b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert *
4b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
5b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * you may not use this file except in compliance with the License.
6b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * You may obtain a copy of the License at
7b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert *
8b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
9b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert *
10b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * Unless required by applicable law or agreed to in writing, software
11b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
12b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * See the License for the specific language governing permissions and
14b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert * limitations under the License.
15b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert */
16b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertpackage com.android.quicksearchbox;
17b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
18b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertimport static com.android.quicksearchbox.SuggestionCursorUtil.assertSameSuggestions;
19b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertimport static com.android.quicksearchbox.SuggestionCursorUtil.slice;
20b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
21b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertimport android.test.AndroidTestCase;
22b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertimport android.test.suitebuilder.annotation.MediumTest;
23b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
24b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert/**
25af1ca2cc65a2c2fdf6f396126e235d64e4da0936Mathew Inwood * Tests for {@link ShortcutPromoter}.
26b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert */
27b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert@MediumTest
28b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringertpublic class BlendingPromoterTest extends AndroidTestCase {
29b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
30b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private String mQuery;
31b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
32b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mS11;
33b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mS12;
34b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mS21;
35b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mS22;
36b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mWeb1;
37b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Suggestion mWeb2;
38b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
39b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    @Override
40b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    protected void setUp() throws Exception {
41b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mQuery = "foo";
42b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mS11 = MockSource.SOURCE_1.createSuggestion(mQuery + "_1_1");
43b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mS12 = MockSource.SOURCE_1.createSuggestion(mQuery + "_1_2");
44b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mS21 = MockSource.SOURCE_2.createSuggestion(mQuery + "_1_1");
45b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mS22 = MockSource.SOURCE_2.createSuggestion(mQuery + "_1_2");
46b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mWeb1 = MockSource.WEB_SOURCE.createSuggestion(mQuery + "_web_1");
47b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        mWeb2 = MockSource.WEB_SOURCE.createSuggestion(mQuery + "_web_2");
48b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
49b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
50b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testMaxPromoted() {
51b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        maxPromotedTest(0);
52b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        maxPromotedTest(1);
53b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        maxPromotedTest(2);
54b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        maxPromotedTest(5);
55b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
56b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
57b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitZeroShortcutsPerSource() {
58b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mS21, mS22), 0, 0);
59b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor();
60b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
61b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
62b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
63b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitOneShortcutPerSource() {
64b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mS21, mS22), 1, 1);
65b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS21);
66b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
67b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
68b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
69b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitTwoShortcutsPerSource() {
70b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mS21, mS22), 2, 2);
71b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS12, mS21, mS22);
72b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
73b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
74b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
75b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitThreeShortcutsPerSource() {
76b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mS21, mS22), 3, 3);
77b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS12, mS21, mS22);
78b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
79b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
80b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
81b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitOneSourceZeroPromoted() {
82b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12), 0, 0);
83b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor();
84b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
85b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
86b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
87b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitOneSourceOnePromoted() {
88b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12), 1, 1);
89b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11);
90b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
91b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
92b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
93b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitOneSourceTwoPromoted() {
94b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12), 2, 2);
95b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS12);
96b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
97b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
98b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
99b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitNoShortcuts() {
100b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(), 2, 2);
101b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor();
102b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
103b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
104b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
105b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitZeroWebShortcuts() {
106b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mWeb1, mWeb2), 0, 2);
107b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS12);
108b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
109b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
110b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
111b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    public void testLimitTwoWebShortcuts() {
112b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor promoted = limit(cursor(mS11, mS12, mWeb1, mWeb2), 2, 2);
113b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor expected = cursor(mS11, mS12, mWeb1, mWeb2);
114b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(expected, promoted);
115b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
116b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
117b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private void maxPromotedTest(int maxPromoted) {
118b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        SuggestionCursor shortcuts = cursor(mS11, mS12, mS21, mS22, mWeb1, mWeb2);
1199a8c6b416ac7ab00998d3496226712f1d442838fPeter Visontay        ListSuggestionCursorNoDuplicates promoted = promote(config(), shortcuts, maxPromoted);
120b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        int expectedCount = Math.min(maxPromoted, shortcuts.getCount());
121b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertEquals(expectedCount, promoted.getCount());
122b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        int count = Math.min(maxPromoted, shortcuts.getCount());
123b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        assertSameSuggestions(slice(promoted, 0, count), slice(shortcuts, 0, count));
124b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
125b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
126b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private SuggestionCursor limit(SuggestionCursor shortcuts, int maxShortcutsPerWebSource,
127b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            int maxShortcutsPerNonWebSource) {
128b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        Config config = config(maxShortcutsPerWebSource, maxShortcutsPerNonWebSource);
129b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        int maxPromoted = 10;
130b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        return promote(config, shortcuts, maxPromoted);
131b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
132b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
1339a8c6b416ac7ab00998d3496226712f1d442838fPeter Visontay    private ListSuggestionCursorNoDuplicates promote(Config config, SuggestionCursor shortcuts,
134b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            int maxPromoted) {
135af1ca2cc65a2c2fdf6f396126e235d64e4da0936Mathew Inwood        ShortcutPromoter promoter = new ShortcutPromoter(config,
13627691bfcdcf3d2918b45bfadd57b08547c317ce5Mathew Inwood                new RankAwarePromoter(config, null, null), null);
1379a8c6b416ac7ab00998d3496226712f1d442838fPeter Visontay        ListSuggestionCursorNoDuplicates promoted = new ListSuggestionCursorNoDuplicates(mQuery);
138b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        promoter.promoteShortcuts(shortcuts, maxPromoted, promoted);
139b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        return promoted;
140b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
141b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
142b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Config config() {
143b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        return new Config(getContext());
144b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
145b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
146b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private Config config(final int maxShortcutsPerWebSource,
147b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            final int maxShortcutsPerNonWebSource) {
148b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        return new Config(getContext()) {
149b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            @Override
150b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            public int getMaxShortcutsPerWebSource() {
151b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert                return maxShortcutsPerWebSource;
152b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            }
153b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            @Override
154b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            public int getMaxShortcutsPerNonWebSource() {
155b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert                return maxShortcutsPerNonWebSource;
156b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert            }
157b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        };
158b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
159b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
160b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    private SuggestionCursor cursor(Suggestion... suggestions) {
161b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert        return new ListSuggestionCursor(mQuery, suggestions);
162b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert    }
163b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert
164b83882b9efa37ec0f20a0f1c85cf5ccc93194aeeBjorn Bringert}
165