MenuManagerTest.java revision a86732316c8fe1694f4c1702cdd6c8e0faff4e18
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 17package com.android.documentsui.files; 18 19import static junit.framework.Assert.assertEquals; 20import static org.junit.Assert.assertTrue; 21 22import android.provider.DocumentsContract.Document; 23import android.provider.DocumentsContract.Root; 24import android.support.test.filters.SmallTest; 25import android.support.test.runner.AndroidJUnit4; 26 27import com.android.documentsui.R; 28import com.android.documentsui.base.DocumentInfo; 29import com.android.documentsui.base.RootInfo; 30import com.android.documentsui.base.State; 31import com.android.documentsui.testing.TestDirectoryDetails; 32import com.android.documentsui.testing.TestMenu; 33import com.android.documentsui.testing.TestMenuInflater; 34import com.android.documentsui.testing.TestMenuItem; 35import com.android.documentsui.testing.TestSearchViewManager; 36import com.android.documentsui.testing.TestSelectionDetails; 37 38import org.junit.Before; 39import org.junit.Test; 40import org.junit.runner.RunWith; 41 42@RunWith(AndroidJUnit4.class) 43@SmallTest 44public final class MenuManagerTest { 45 46 private TestMenu testMenu; 47 private TestMenuItem rename; 48 private TestMenuItem selectAll; 49 private TestMenuItem moveTo; 50 private TestMenuItem copyTo; 51 private TestMenuItem share; 52 private TestMenuItem delete; 53 private TestMenuItem createDir; 54 private TestMenuItem settings; 55 private TestMenuItem newWindow; 56 private TestMenuItem open; 57 private TestMenuItem openWith; 58 private TestMenuItem openInNewWindow; 59 private TestMenuItem cut; 60 private TestMenuItem copy; 61 private TestMenuItem paste; 62 private TestMenuItem pasteInto; 63 private TestMenuItem advanced; 64 private TestMenuItem eject; 65 private TestSelectionDetails selectionDetails; 66 private TestDirectoryDetails dirDetails; 67 private TestSearchViewManager testSearchManager; 68 private RootInfo testRootInfo; 69 private DocumentInfo testDocInfo; 70 private State state = new State(); 71 private MenuManager mgr; 72 73 @Before 74 public void setUp() { 75 testMenu = TestMenu.create(); 76 rename = testMenu.findItem(R.id.menu_rename); 77 selectAll = testMenu.findItem(R.id.menu_select_all); 78 moveTo = testMenu.findItem(R.id.menu_move_to); 79 copyTo = testMenu.findItem(R.id.menu_copy_to); 80 share = testMenu.findItem(R.id.menu_share); 81 delete = testMenu.findItem(R.id.menu_delete); 82 createDir = testMenu.findItem(R.id.menu_create_dir); 83 settings = testMenu.findItem(R.id.menu_settings); 84 newWindow = testMenu.findItem(R.id.menu_new_window); 85 open = testMenu.findItem(R.id.menu_open); 86 openWith = testMenu.findItem(R.id.menu_open_with); 87 openInNewWindow = testMenu.findItem(R.id.menu_open_in_new_window); 88 cut = testMenu.findItem(R.id.menu_cut_to_clipboard); 89 copy = testMenu.findItem(R.id.menu_copy_to_clipboard); 90 paste = testMenu.findItem(R.id.menu_paste_from_clipboard); 91 pasteInto = testMenu.findItem(R.id.menu_paste_into_folder); 92 advanced = testMenu.findItem(R.id.menu_advanced); 93 eject = testMenu.findItem(R.id.menu_eject_root); 94 95 // These items by default are visible 96 testMenu.findItem(R.id.menu_select_all).setVisible(true); 97 testMenu.findItem(R.id.menu_list).setVisible(true); 98 99 selectionDetails = new TestSelectionDetails(); 100 dirDetails = new TestDirectoryDetails(); 101 testSearchManager = new TestSearchViewManager(); 102 mgr = new MenuManager(testSearchManager, state, dirDetails); 103 104 testRootInfo = new RootInfo(); 105 testDocInfo = new DocumentInfo(); 106 } 107 108 @Test 109 public void testActionMenu() { 110 selectionDetails.canDelete = true; 111 selectionDetails.canRename = true; 112 113 mgr.updateActionMenu(testMenu, selectionDetails); 114 115 rename.assertEnabled(); 116 delete.assertVisible(); 117 share.assertVisible(); 118 copyTo.assertEnabled(); 119 moveTo.assertEnabled(); 120 } 121 122 @Test 123 public void testActionMenu_containsPartial() { 124 selectionDetails.containPartial = true; 125 mgr.updateActionMenu(testMenu, selectionDetails); 126 127 rename.assertDisabled(); 128 share.assertInvisible(); 129 copyTo.assertDisabled(); 130 moveTo.assertDisabled(); 131 } 132 133 @Test 134 public void testActionMenu_cantRename() { 135 selectionDetails.canRename = false; 136 mgr.updateActionMenu(testMenu, selectionDetails); 137 138 rename.assertDisabled(); 139 } 140 141 @Test 142 public void testActionMenu_cantDelete() { 143 selectionDetails.canDelete = false; 144 mgr.updateActionMenu(testMenu, selectionDetails); 145 146 delete.assertInvisible(); 147 // We shouldn't be able to move files if we can't delete them 148 moveTo.assertDisabled(); 149 } 150 151 @Test 152 public void testActionMenu_containsDirectory() { 153 selectionDetails.containDirectories = true; 154 mgr.updateActionMenu(testMenu, selectionDetails); 155 156 // We can't share directories 157 share.assertInvisible(); 158 } 159 160 @Test 161 public void testOptionMenu() { 162 mgr.updateOptionMenu(testMenu); 163 164 advanced.assertInvisible(); 165 advanced.assertTitle(R.string.menu_advanced_show); 166 createDir.assertDisabled(); 167 assertTrue(testSearchManager.updateMenuCalled()); 168 } 169 170 @Test 171 public void testOptionMenu_showAdvanced() { 172 state.showAdvanced = true; 173 state.showAdvancedOption = true; 174 mgr.updateOptionMenu(testMenu); 175 176 advanced.assertVisible(); 177 advanced.assertTitle(R.string.menu_advanced_hide); 178 } 179 180 @Test 181 public void testOptionMenu_canCreateDirectory() { 182 dirDetails.canCreateDirectory = true; 183 mgr.updateOptionMenu(testMenu); 184 185 createDir.assertEnabled(); 186 } 187 188 @Test 189 public void testOptionMenu_hasRootSettings() { 190 dirDetails.hasRootSettings = true; 191 mgr.updateOptionMenu(testMenu); 192 193 settings.assertVisible(); 194 } 195 196 @Test 197 public void testOptionMenu_shouldShowFancyFeatures() { 198 dirDetails.shouldShowFancyFeatures = true; 199 mgr.updateOptionMenu(testMenu); 200 201 newWindow.assertVisible(); 202 } 203 204 @Test 205 public void testInflateContextMenu_Files() { 206 TestMenuInflater inflater = new TestMenuInflater(); 207 208 selectionDetails.containFiles = true; 209 selectionDetails.containDirectories = false; 210 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 211 212 assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId); 213 } 214 215 @Test 216 public void testInflateContextMenu_Dirs() { 217 TestMenuInflater inflater = new TestMenuInflater(); 218 219 selectionDetails.containFiles = false; 220 selectionDetails.containDirectories = true; 221 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 222 223 assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId); 224 } 225 226 @Test 227 public void testInflateContextMenu_Mixed() { 228 TestMenuInflater inflater = new TestMenuInflater(); 229 230 selectionDetails.containFiles = true; 231 selectionDetails.containDirectories = true; 232 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 233 234 assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId); 235 } 236 237 @Test 238 public void testContextMenu_EmptyArea() { 239 mgr.updateContextMenuForContainer(testMenu); 240 241 selectAll.assertVisible(); 242 paste.assertVisible(); 243 createDir.assertVisible(); 244 } 245 246 @Test 247 public void testContextMenu_OnFile() { 248 selectionDetails.size = 1; 249 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 250 open.assertVisible(); 251 open.assertEnabled(); 252 openWith.assertVisible(); 253 openWith.assertEnabled(); 254 cut.assertVisible(); 255 copy.assertVisible(); 256 rename.assertVisible(); 257 createDir.assertVisible(); 258 delete.assertVisible(); 259 } 260 261 @Test 262 public void testContextMenu_OnMultipleFiles() { 263 selectionDetails.size = 3; 264 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 265 open.assertVisible(); 266 open.assertDisabled(); 267 openWith.assertVisible(); 268 openWith.assertDisabled(); 269 } 270 271 @Test 272 public void testContextMenu_OnWritableDirectory() { 273 selectionDetails.size = 1; 274 selectionDetails.canPasteInto = true; 275 dirDetails.hasItemsToPaste = true; 276 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 277 openInNewWindow.assertVisible(); 278 openInNewWindow.assertEnabled(); 279 cut.assertVisible(); 280 copy.assertVisible(); 281 pasteInto.assertVisible(); 282 pasteInto.assertEnabled(); 283 rename.assertVisible(); 284 delete.assertVisible(); 285 } 286 287 @Test 288 public void testContextMenu_OnNonWritableDirectory() { 289 selectionDetails.size = 1; 290 selectionDetails.canPasteInto = false; 291 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 292 openInNewWindow.assertVisible(); 293 openInNewWindow.assertEnabled(); 294 cut.assertVisible(); 295 copy.assertVisible(); 296 pasteInto.assertVisible(); 297 pasteInto.assertDisabled(); 298 rename.assertVisible(); 299 delete.assertVisible(); 300 } 301 302 @Test 303 public void testContextMenu_OnWritableDirectory_NothingToPaste() { 304 selectionDetails.canPasteInto = true; 305 selectionDetails.size = 1; 306 dirDetails.hasItemsToPaste = false; 307 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 308 pasteInto.assertVisible(); 309 pasteInto.assertDisabled(); 310 } 311 312 @Test 313 public void testContextMenu_OnMultipleDirectories() { 314 selectionDetails.size = 3; 315 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 316 openInNewWindow.assertVisible(); 317 openInNewWindow.assertDisabled(); 318 } 319 320 @Test 321 public void testContextMenu_OnMixedDocs() { 322 selectionDetails.containDirectories = true; 323 selectionDetails.containFiles = true; 324 selectionDetails.size = 2; 325 selectionDetails.canDelete = true; 326 mgr.updateContextMenu(testMenu, selectionDetails); 327 cut.assertVisible(); 328 cut.assertEnabled(); 329 copy.assertVisible(); 330 copy.assertEnabled(); 331 delete.assertVisible(); 332 delete.assertEnabled(); 333 } 334 335 @Test 336 public void testContextMenu_OnMixedDocs_hasPartialFile() { 337 selectionDetails.containDirectories = true; 338 selectionDetails.containFiles = true; 339 selectionDetails.size = 2; 340 selectionDetails.containPartial = true; 341 selectionDetails.canDelete = true; 342 mgr.updateContextMenu(testMenu, selectionDetails); 343 cut.assertVisible(); 344 cut.assertDisabled(); 345 copy.assertVisible(); 346 copy.assertDisabled(); 347 delete.assertVisible(); 348 delete.assertEnabled(); 349 } 350 351 @Test 352 public void testContextMenu_OnMixedDocs_hasUndeletableFile() { 353 selectionDetails.containDirectories = true; 354 selectionDetails.containFiles = true; 355 selectionDetails.size = 2; 356 selectionDetails.canDelete = false; 357 mgr.updateContextMenu(testMenu, selectionDetails); 358 cut.assertVisible(); 359 cut.assertDisabled(); 360 copy.assertVisible(); 361 copy.assertEnabled(); 362 delete.assertVisible(); 363 delete.assertDisabled(); 364 } 365 366 @Test 367 public void testRootContextMenu() { 368 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 369 370 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 371 372 eject.assertInvisible(); 373 374 openInNewWindow.assertVisible(); 375 openInNewWindow.assertEnabled(); 376 377 pasteInto.assertVisible(); 378 pasteInto.assertDisabled(); 379 380 settings.assertVisible(); 381 settings.assertDisabled(); 382 } 383 384 @Test 385 public void testRootContextMenu_hasRootSettings() { 386 testRootInfo.flags = Root.FLAG_HAS_SETTINGS; 387 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 388 389 settings.assertEnabled(); 390 } 391 392 @Test 393 public void testRootContextMenu_nonWritableRoot() { 394 dirDetails.hasItemsToPaste = true; 395 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 396 397 pasteInto.assertVisible(); 398 pasteInto.assertDisabled(); 399 } 400 401 @Test 402 public void testRootContextMenu_nothingToPaste() { 403 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 404 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 405 dirDetails.hasItemsToPaste = false; 406 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 407 408 pasteInto.assertVisible(); 409 pasteInto.assertDisabled(); 410 } 411 412 @Test 413 public void testRootContextMenu_pasteIntoWritableRoot() { 414 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 415 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 416 dirDetails.hasItemsToPaste = true; 417 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 418 419 pasteInto.assertVisible(); 420 pasteInto.assertEnabled(); 421 } 422 423 @Test 424 public void testRootContextMenu_eject() { 425 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 426 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 427 428 eject.assertEnabled(); 429 } 430 431 @Test 432 public void testRootContextMenu_ejectInProcess() { 433 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 434 testRootInfo.ejecting = true; 435 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 436 437 eject.assertDisabled(); 438 } 439} 440