1 /* 2 * Copyright (C) 2016 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.documentsui.queries; 18 19 import static junit.framework.Assert.assertEquals; 20 import static junit.framework.Assert.assertFalse; 21 import static junit.framework.Assert.assertNotNull; 22 import static junit.framework.Assert.assertNull; 23 import static junit.framework.Assert.assertTrue; 24 import static junit.framework.Assert.fail; 25 26 import android.annotation.Nullable; 27 import android.os.Bundle; 28 import android.os.Handler; 29 30 import android.support.test.filters.SmallTest; 31 import android.support.test.runner.AndroidJUnit4; 32 33 import com.android.documentsui.R; 34 import com.android.documentsui.base.EventHandler; 35 import com.android.documentsui.queries.SearchViewManager.SearchManagerListener; 36 import com.android.documentsui.queries.SearchViewManager; 37 import com.android.documentsui.testing.TestEventHandler; 38 import com.android.documentsui.testing.TestHandler; 39 import com.android.documentsui.testing.TestMenu; 40 import com.android.documentsui.testing.TestTimer; 41 42 import org.junit.Assert; 43 import org.junit.Before; 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 47 import java.util.Timer; 48 import java.util.TimerTask; 49 50 @RunWith(AndroidJUnit4.class) 51 @SmallTest 52 public final class SearchViewManagerTest { 53 54 private TestEventHandler<String> mTestEventHandler; 55 private TestTimer mTestTimer; 56 private TestHandler mTestHandler; 57 private SearchViewManager mSearchViewManager; 58 59 private boolean mListenerOnSearchChangedCalled; 60 61 @Before setUp()62 public void setUp() { 63 mTestEventHandler = new TestEventHandler<>(); 64 mTestTimer = new TestTimer(); 65 mTestHandler = new TestHandler(); 66 67 final SearchManagerListener searchListener = new SearchManagerListener() { 68 @Override 69 public void onSearchChanged(@Nullable String query) { 70 mListenerOnSearchChangedCalled = true; 71 } 72 @Override 73 public void onSearchFinished() {} 74 @Override 75 public void onSearchViewChanged(boolean opened) {} 76 }; 77 78 mSearchViewManager = new TestableSearchViewManager( 79 searchListener, mTestEventHandler, null, mTestTimer, mTestHandler); 80 81 final TestMenu testMenu = TestMenu.create(); 82 mSearchViewManager.install(testMenu, true); 83 } 84 85 private static class TestableSearchViewManager extends SearchViewManager { TestableSearchViewManager( SearchManagerListener listener, EventHandler<String> commandProcessor, @Nullable Bundle savedState, Timer timer, Handler handler)86 public TestableSearchViewManager( 87 SearchManagerListener listener, 88 EventHandler<String> commandProcessor, 89 @Nullable Bundle savedState, 90 Timer timer, 91 Handler handler) { 92 super(listener, commandProcessor, savedState, timer, handler); 93 } 94 95 @Override createSearchTask(String newText)96 public TimerTask createSearchTask(String newText) { 97 TimerTask task = super.createSearchTask(newText); 98 TestTimer.Task testTask = new TestTimer.Task(task); 99 return testTask; 100 } 101 } 102 fastForwardTo(long timeMs)103 private void fastForwardTo(long timeMs) { 104 mTestTimer.fastForwardTo(timeMs); 105 mTestHandler.dispatchAllMessages(); 106 } 107 108 @Test testIsExpanded_ExpandsOnClick()109 public void testIsExpanded_ExpandsOnClick() { 110 mSearchViewManager.onClick(null); 111 assertTrue(mSearchViewManager.isExpanded()); 112 } 113 114 @Test testIsExpanded_CollapsesOnMenuItemActionCollapse()115 public void testIsExpanded_CollapsesOnMenuItemActionCollapse() { 116 mSearchViewManager.onClick(null); 117 mSearchViewManager.onMenuItemActionCollapse(null); 118 assertFalse(mSearchViewManager.isExpanded()); 119 } 120 121 @Test testIsSearching_FalseOnClick()122 public void testIsSearching_FalseOnClick() throws Exception { 123 mSearchViewManager.onClick(null); 124 assertFalse(mSearchViewManager.isSearching()); 125 } 126 127 @Test testIsSearching_TrueOnQueryTextSubmit()128 public void testIsSearching_TrueOnQueryTextSubmit() throws Exception { 129 mSearchViewManager.onClick(null); 130 mSearchViewManager.onQueryTextSubmit("query"); 131 assertTrue(mSearchViewManager.isSearching()); 132 } 133 134 @Test testIsSearching_FalseImmediatelyAfterOnQueryTextChange()135 public void testIsSearching_FalseImmediatelyAfterOnQueryTextChange() throws Exception { 136 mSearchViewManager.onClick(null); 137 mSearchViewManager.onQueryTextChange("q"); 138 assertFalse(mSearchViewManager.isSearching()); 139 } 140 141 @Test testIsSearching_TrueAfterOnQueryTextChangeAndWait()142 public void testIsSearching_TrueAfterOnQueryTextChangeAndWait() throws Exception { 143 mSearchViewManager.onClick(null); 144 mSearchViewManager.onQueryTextChange("q"); 145 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 146 assertTrue(mSearchViewManager.isSearching()); 147 } 148 149 @Test testIsSearching_FalseWhenSecondOnQueryTextChangeResetsTimer()150 public void testIsSearching_FalseWhenSecondOnQueryTextChangeResetsTimer() throws Exception { 151 mSearchViewManager.onClick(null); 152 mSearchViewManager.onQueryTextChange("q"); 153 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS - 1); 154 mSearchViewManager.onQueryTextChange("qu"); 155 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 156 assertFalse(mSearchViewManager.isSearching()); 157 } 158 159 @Test testIsSearching_TrueAfterSecondOnQueryTextChangeResetsTimer()160 public void testIsSearching_TrueAfterSecondOnQueryTextChangeResetsTimer() throws Exception { 161 mSearchViewManager.onClick(null); 162 mSearchViewManager.onQueryTextChange("q"); 163 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS - 1); 164 mSearchViewManager.onQueryTextChange("qu"); 165 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS * 2); 166 assertTrue(mSearchViewManager.isSearching()); 167 } 168 169 @Test testIsSearching_FalseIfSearchCanceled()170 public void testIsSearching_FalseIfSearchCanceled() throws Exception { 171 mSearchViewManager.onClick(null); 172 mSearchViewManager.onQueryTextChange("q"); 173 mSearchViewManager.cancelSearch(); 174 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 175 assertFalse(mSearchViewManager.isSearching()); 176 } 177 178 @Test testOnSearchChanged_CalledAfterOnQueryTextSubmit()179 public void testOnSearchChanged_CalledAfterOnQueryTextSubmit() throws Exception { 180 mSearchViewManager.onClick(null); 181 mSearchViewManager.onQueryTextSubmit("q"); 182 assertTrue(mListenerOnSearchChangedCalled); 183 } 184 185 @Test testOnSearchChanged_NotCalledImmediatelyAfterOnQueryTextChanged()186 public void testOnSearchChanged_NotCalledImmediatelyAfterOnQueryTextChanged() throws Exception { 187 mSearchViewManager.onClick(null); 188 mSearchViewManager.onQueryTextChange("q"); 189 assertFalse(mListenerOnSearchChangedCalled); 190 } 191 192 @Test testOnSearchChanged_CalledAfterOnQueryTextChangedAndWait()193 public void testOnSearchChanged_CalledAfterOnQueryTextChangedAndWait() throws Exception { 194 mSearchViewManager.onClick(null); 195 mSearchViewManager.onQueryTextChange("q"); 196 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 197 assertTrue(mListenerOnSearchChangedCalled); 198 } 199 200 @Test testOnSearchChanged_CalledOnlyOnceAfterOnQueryTextSubmit()201 public void testOnSearchChanged_CalledOnlyOnceAfterOnQueryTextSubmit() throws Exception { 202 mSearchViewManager.onClick(null); 203 mSearchViewManager.onQueryTextChange("q"); 204 mSearchViewManager.onQueryTextSubmit("q"); 205 206 // Clear the flag to check if it gets set again. 207 mListenerOnSearchChangedCalled = false; 208 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 209 assertFalse(mListenerOnSearchChangedCalled); 210 } 211 212 @Test testOnSearchChanged_NotCalledForOnQueryTextSubmitIfSearchAlreadyFinished()213 public void testOnSearchChanged_NotCalledForOnQueryTextSubmitIfSearchAlreadyFinished() 214 throws Exception { 215 mSearchViewManager.onClick(null); 216 mSearchViewManager.onQueryTextChange("q"); 217 fastForwardTo(SearchViewManager.SEARCH_DELAY_MS); 218 // Clear the flag to check if it gets set again. 219 mListenerOnSearchChangedCalled = false; 220 mSearchViewManager.onQueryTextSubmit("q"); 221 assertFalse(mListenerOnSearchChangedCalled); 222 } 223 } 224