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