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.files; 18 19 import static junit.framework.Assert.assertEquals; 20 import static org.junit.Assert.assertTrue; 21 22 import android.net.Uri; 23 import android.provider.DocumentsContract.Document; 24 import android.provider.DocumentsContract.Root; 25 import android.support.test.filters.SmallTest; 26 import android.support.test.runner.AndroidJUnit4; 27 import android.test.AndroidTestCase; 28 29 import com.android.documentsui.R; 30 import com.android.documentsui.base.DocumentInfo; 31 import com.android.documentsui.base.RootInfo; 32 import com.android.documentsui.base.State; 33 import com.android.documentsui.dirlist.TestContext; 34 import com.android.documentsui.dirlist.TestData; 35 import com.android.documentsui.selection.SelectionHelper; 36 import com.android.documentsui.testing.SelectionHelpers; 37 import com.android.documentsui.testing.TestDirectoryDetails; 38 import com.android.documentsui.testing.TestEnv; 39 import com.android.documentsui.testing.TestFeatures; 40 import com.android.documentsui.testing.TestMenu; 41 import com.android.documentsui.testing.TestMenuInflater; 42 import com.android.documentsui.testing.TestMenuItem; 43 import com.android.documentsui.testing.TestScopedPreferences; 44 import com.android.documentsui.testing.TestSearchViewManager; 45 import com.android.documentsui.testing.TestSelectionDetails; 46 47 import org.junit.Before; 48 import org.junit.Test; 49 import org.junit.runner.RunWith; 50 51 @RunWith(AndroidJUnit4.class) 52 @SmallTest 53 public final class MenuManagerTest { 54 55 private TestMenu testMenu; 56 57 /* Directory Context Menu items */ 58 private TestMenuItem dirShare; 59 private TestMenuItem dirOpen; 60 private TestMenuItem dirOpenWith; 61 private TestMenuItem dirCutToClipboard; 62 private TestMenuItem dirCopyToClipboard; 63 private TestMenuItem dirPasteFromClipboard; 64 private TestMenuItem dirCreateDir; 65 private TestMenuItem dirSelectAll; 66 private TestMenuItem dirRename; 67 private TestMenuItem dirDelete; 68 private TestMenuItem dirViewInOwner; 69 private TestMenuItem dirPasteIntoFolder; 70 private TestMenuItem dirInspect; 71 private TestMenuItem dirOpenInNewWindow; 72 73 /* Root List Context Menu items */ 74 private TestMenuItem rootEjectRoot; 75 private TestMenuItem rootOpenInNewWindow; 76 private TestMenuItem rootPasteIntoFolder; 77 private TestMenuItem rootSettings; 78 79 /* Action Mode menu items */ 80 private TestMenuItem actionModeOpen; 81 private TestMenuItem actionModeOpenWith; 82 private TestMenuItem actionModeShare; 83 private TestMenuItem actionModeDelete; 84 private TestMenuItem actionModeSelectAll; 85 private TestMenuItem actionModeCopyTo; 86 private TestMenuItem actionModeExtractTo; 87 private TestMenuItem actionModeMoveTo; 88 private TestMenuItem actionModeCompress; 89 private TestMenuItem actionModeRename; 90 private TestMenuItem actionModeViewInOwner; 91 private TestMenuItem actionModeInspector; 92 93 /* Option Menu items */ 94 private TestMenuItem optionSearch; 95 private TestMenuItem optionDebug; 96 private TestMenuItem optionGrid; 97 private TestMenuItem optionList; 98 private TestMenuItem optionNewWindow; 99 private TestMenuItem optionCreateDir; 100 private TestMenuItem optionSelectAll; 101 private TestMenuItem optionAdvanced; 102 private TestMenuItem optionSettings; 103 private TestMenuItem optionInspector; 104 105 private TestFeatures features; 106 private TestSelectionDetails selectionDetails; 107 private TestDirectoryDetails dirDetails; 108 private TestSearchViewManager testSearchManager; 109 private TestScopedPreferences preferences; 110 private RootInfo testRootInfo; 111 private DocumentInfo testDocInfo; 112 private State state = new State(); 113 private MenuManager mgr; 114 private TestActivity activity = TestActivity.create(TestEnv.create()); 115 private SelectionHelper selectionManager; 116 117 @Before setUp()118 public void setUp() { 119 testMenu = TestMenu.create(); 120 121 // The context menu on anything in DirectoryList (including no selection). 122 dirShare = testMenu.findItem(R.id.dir_menu_share); 123 dirOpen = testMenu.findItem(R.id.dir_menu_open); 124 dirOpenWith = testMenu.findItem(R.id.dir_menu_open_with); 125 dirCutToClipboard = testMenu.findItem(R.id.dir_menu_cut_to_clipboard); 126 dirCopyToClipboard = testMenu.findItem(R.id.dir_menu_copy_to_clipboard); 127 dirPasteFromClipboard = testMenu.findItem(R.id.dir_menu_paste_from_clipboard); 128 dirCreateDir = testMenu.findItem(R.id.dir_menu_create_dir); 129 dirSelectAll = testMenu.findItem(R.id.dir_menu_select_all); 130 dirRename = testMenu.findItem(R.id.dir_menu_rename); 131 dirDelete = testMenu.findItem(R.id.dir_menu_delete); 132 dirViewInOwner = testMenu.findItem(R.id.dir_menu_view_in_owner); 133 dirPasteIntoFolder = testMenu.findItem(R.id.dir_menu_paste_into_folder); 134 dirInspect = testMenu.findItem(R.id.dir_menu_inspect); 135 dirOpenInNewWindow = testMenu.findItem(R.id.dir_menu_open_in_new_window); 136 137 rootEjectRoot = testMenu.findItem(R.id.root_menu_eject_root); 138 rootOpenInNewWindow = testMenu.findItem(R.id.root_menu_open_in_new_window); 139 rootPasteIntoFolder = testMenu.findItem(R.id.root_menu_paste_into_folder); 140 rootSettings = testMenu.findItem(R.id.root_menu_settings); 141 142 // Menu actions (including overflow) when action mode *is* active. 143 actionModeOpen = testMenu.findItem(R.id.action_menu_open); 144 actionModeOpenWith = testMenu.findItem(R.id.action_menu_open_with); 145 actionModeShare = testMenu.findItem(R.id.action_menu_share); 146 actionModeDelete = testMenu.findItem(R.id.action_menu_delete); 147 actionModeSelectAll = testMenu.findItem(R.id.action_menu_select_all); 148 actionModeCopyTo = testMenu.findItem(R.id.action_menu_copy_to); 149 actionModeExtractTo = testMenu.findItem(R.id.action_menu_extract_to); 150 actionModeMoveTo = testMenu.findItem(R.id.action_menu_move_to); 151 actionModeCompress = testMenu.findItem(R.id.action_menu_compress); 152 actionModeRename = testMenu.findItem(R.id.action_menu_rename); 153 actionModeInspector = testMenu.findItem(R.id.action_menu_inspect); 154 actionModeViewInOwner = testMenu.findItem(R.id.action_menu_view_in_owner); 155 156 // Menu actions (including overflow) when action mode is not active. 157 optionSearch = testMenu.findItem(R.id.option_menu_search); 158 optionDebug = testMenu.findItem(R.id.option_menu_debug); 159 optionGrid = testMenu.findItem(R.id.option_menu_grid); 160 optionList = testMenu.findItem(R.id.option_menu_list); 161 optionNewWindow = testMenu.findItem(R.id.option_menu_new_window); 162 optionCreateDir = testMenu.findItem(R.id.option_menu_create_dir); 163 optionSelectAll = testMenu.findItem(R.id.option_menu_select_all); 164 optionAdvanced = testMenu.findItem(R.id.option_menu_advanced); 165 optionSettings = testMenu.findItem(R.id.option_menu_settings); 166 optionInspector = testMenu.findItem(R.id.option_menu_inspect); 167 168 features = new TestFeatures(); 169 170 // These items by default are visible 171 testMenu.findItem(R.id.dir_menu_select_all).setVisible(true); 172 testMenu.findItem(R.id.option_menu_select_all).setVisible(true); 173 testMenu.findItem(R.id.option_menu_list).setVisible(true); 174 175 selectionDetails = new TestSelectionDetails(); 176 dirDetails = new TestDirectoryDetails(); 177 testSearchManager = new TestSearchViewManager(); 178 preferences = new TestScopedPreferences(); 179 selectionManager = SelectionHelpers.createTestInstance(TestData.create(1)); 180 selectionManager.select("0"); 181 182 mgr = new MenuManager( 183 features, 184 testSearchManager, 185 state, 186 dirDetails, 187 activity, 188 selectionManager, 189 this::getApplicationNameFromAuthority, 190 this::getUriFromModelId); 191 192 testRootInfo = new RootInfo(); 193 testDocInfo = new DocumentInfo(); 194 state.stack.push(testDocInfo); 195 } 196 getUriFromModelId(String id)197 private Uri getUriFromModelId(String id) { 198 return Uri.EMPTY; 199 } getApplicationNameFromAuthority(String authority)200 private String getApplicationNameFromAuthority(String authority) { 201 return "TestApp"; 202 } 203 204 @Test testActionMenu()205 public void testActionMenu() { 206 selectionDetails.canDelete = true; 207 selectionDetails.canRename = true; 208 dirDetails.canCreateDoc = true; 209 210 mgr.updateActionMenu(testMenu, selectionDetails); 211 212 actionModeRename.assertEnabled(); 213 actionModeDelete.assertVisible(); 214 actionModeShare.assertVisible(); 215 actionModeCopyTo.assertEnabled(); 216 actionModeCompress.assertEnabled(); 217 actionModeExtractTo.assertInvisible(); 218 actionModeMoveTo.assertEnabled(); 219 actionModeViewInOwner.assertInvisible(); 220 } 221 222 @Test testActionMenu_ContainsPartial()223 public void testActionMenu_ContainsPartial() { 224 selectionDetails.containPartial = true; 225 dirDetails.canCreateDoc = true; 226 mgr.updateActionMenu(testMenu, selectionDetails); 227 228 actionModeRename.assertDisabled(); 229 actionModeShare.assertInvisible(); 230 actionModeCopyTo.assertDisabled(); 231 actionModeCompress.assertDisabled(); 232 actionModeExtractTo.assertDisabled(); 233 actionModeMoveTo.assertDisabled(); 234 actionModeViewInOwner.assertInvisible(); 235 } 236 237 @Test testActionMenu_CreateArchives_ReflectsFeatureState()238 public void testActionMenu_CreateArchives_ReflectsFeatureState() { 239 features.archiveCreation = false; 240 dirDetails.canCreateDoc = true; 241 mgr.updateActionMenu(testMenu, selectionDetails); 242 243 actionModeCompress.assertInvisible(); 244 actionModeCompress.assertDisabled(); 245 } 246 247 @Test testActionMenu_CreateArchive()248 public void testActionMenu_CreateArchive() { 249 dirDetails.canCreateDoc = true; 250 mgr.updateActionMenu(testMenu, selectionDetails); 251 252 actionModeCompress.assertEnabled(); 253 } 254 255 @Test testActionMenu_NoCreateArchive()256 public void testActionMenu_NoCreateArchive() { 257 dirDetails.canCreateDoc = false; 258 mgr.updateActionMenu(testMenu, selectionDetails); 259 260 actionModeCompress.assertDisabled(); 261 } 262 263 @Test testActionMenu_cantRename()264 public void testActionMenu_cantRename() { 265 selectionDetails.canRename = false; 266 mgr.updateActionMenu(testMenu, selectionDetails); 267 268 actionModeRename.assertDisabled(); 269 } 270 271 @Test testActionMenu_cantDelete()272 public void testActionMenu_cantDelete() { 273 selectionDetails.canDelete = false; 274 mgr.updateActionMenu(testMenu, selectionDetails); 275 276 actionModeDelete.assertInvisible(); 277 // We shouldn't be able to move files if we can't delete them 278 actionModeMoveTo.assertDisabled(); 279 } 280 281 @Test testActionsMenu_canViewInOwner()282 public void testActionsMenu_canViewInOwner() { 283 activity.resources.strings.put(R.string.menu_view_in_owner, "Insert name here! %s"); 284 selectionDetails.canViewInOwner = true; 285 mgr.updateActionMenu(testMenu, selectionDetails); 286 287 actionModeViewInOwner.assertVisible(); 288 } 289 290 @Test testActionMenu_changeToCanDelete()291 public void testActionMenu_changeToCanDelete() { 292 selectionDetails.canDelete = false; 293 mgr.updateActionMenu(testMenu, selectionDetails); 294 295 selectionDetails.canDelete = true; 296 mgr.updateActionMenu(testMenu, selectionDetails); 297 298 actionModeDelete.assertVisible(); 299 actionModeDelete.assertEnabled(); 300 actionModeMoveTo.assertVisible(); 301 actionModeMoveTo.assertEnabled(); 302 } 303 304 @Test testActionMenu_ContainsDirectory()305 public void testActionMenu_ContainsDirectory() { 306 selectionDetails.containDirectories = true; 307 mgr.updateActionMenu(testMenu, selectionDetails); 308 309 // We can't share directories 310 actionModeShare.assertInvisible(); 311 } 312 313 @Test testActionMenu_RemovesDirectory()314 public void testActionMenu_RemovesDirectory() { 315 selectionDetails.containDirectories = true; 316 mgr.updateActionMenu(testMenu, selectionDetails); 317 318 selectionDetails.containDirectories = false; 319 mgr.updateActionMenu(testMenu, selectionDetails); 320 321 actionModeShare.assertVisible(); 322 actionModeShare.assertEnabled(); 323 } 324 325 @Test testActionMenu_CantExtract()326 public void testActionMenu_CantExtract() { 327 selectionDetails.canExtract = false; 328 mgr.updateActionMenu(testMenu, selectionDetails); 329 330 actionModeExtractTo.assertInvisible(); 331 } 332 333 @Test testActionMenu_CanExtract_hidesCopyToAndCompressAndShare()334 public void testActionMenu_CanExtract_hidesCopyToAndCompressAndShare() { 335 features.archiveCreation = true; 336 selectionDetails.canExtract = true; 337 dirDetails.canCreateDoc = true; 338 mgr.updateActionMenu(testMenu, selectionDetails); 339 340 actionModeExtractTo.assertEnabled(); 341 actionModeCopyTo.assertDisabled(); 342 actionModeCompress.assertDisabled(); 343 } 344 345 @Test testActionMenu_CanOpenWith()346 public void testActionMenu_CanOpenWith() { 347 selectionDetails.canOpenWith = true; 348 mgr.updateActionMenu(testMenu, selectionDetails); 349 350 actionModeOpenWith.assertVisible(); 351 actionModeOpenWith.assertEnabled(); 352 } 353 354 @Test testActionMenu_NoOpenWith()355 public void testActionMenu_NoOpenWith() { 356 selectionDetails.canOpenWith = false; 357 mgr.updateActionMenu(testMenu, selectionDetails); 358 359 actionModeOpenWith.assertVisible(); 360 actionModeOpenWith.assertDisabled(); 361 } 362 363 @Test testActionMenu_Inspector_EnabledForSingleSelection()364 public void testActionMenu_Inspector_EnabledForSingleSelection() { 365 features.inspector = true; 366 selectionDetails.size = 1; 367 mgr.updateActionMenu(testMenu, selectionDetails); 368 369 actionModeInspector.assertVisible(); 370 actionModeInspector.assertEnabled(); 371 } 372 373 @Test testActionMenu_Inspector_DisabledForMultiSelection()374 public void testActionMenu_Inspector_DisabledForMultiSelection() { 375 features.inspector = true; 376 selectionDetails.size = 2; 377 mgr.updateActionMenu(testMenu, selectionDetails); 378 379 actionModeInspector.assertVisible(); 380 actionModeInspector.assertDisabled(); 381 } 382 383 @Test testOptionMenu()384 public void testOptionMenu() { 385 mgr.updateOptionMenu(testMenu); 386 387 optionAdvanced.assertInvisible(); 388 optionAdvanced.assertTitle(R.string.menu_advanced_show); 389 optionCreateDir.assertDisabled(); 390 optionDebug.assertInvisible(); 391 assertTrue(testSearchManager.updateMenuCalled()); 392 } 393 394 @Test testOptionMenu_ShowAdvanced()395 public void testOptionMenu_ShowAdvanced() { 396 state.showAdvanced = true; 397 state.showDeviceStorageOption = true; 398 mgr.updateOptionMenu(testMenu); 399 400 optionAdvanced.assertVisible(); 401 optionAdvanced.assertTitle(R.string.menu_advanced_hide); 402 } 403 404 @Test testOptionMenu_CanCreateDirectory()405 public void testOptionMenu_CanCreateDirectory() { 406 dirDetails.canCreateDirectory = true; 407 mgr.updateOptionMenu(testMenu); 408 409 optionCreateDir.assertEnabled(); 410 } 411 412 @Test testOptionMenu_HasRootSettings()413 public void testOptionMenu_HasRootSettings() { 414 dirDetails.hasRootSettings = true; 415 mgr.updateOptionMenu(testMenu); 416 417 optionSettings.assertVisible(); 418 } 419 420 @Test testOptionMenu_Inspector_VisibleAndEnabled()421 public void testOptionMenu_Inspector_VisibleAndEnabled() { 422 features.inspector = true; 423 mgr.updateOptionMenu(testMenu); 424 optionInspector.assertVisible(); 425 optionInspector.assertEnabled(); 426 } 427 428 @Test testOptionMenu_Inspector_DisabledInRecentsFolder()429 public void testOptionMenu_Inspector_DisabledInRecentsFolder() { 430 features.inspector = true; 431 432 // synthesize a fake recents root. Not setting an authority or id == recents. 433 RootInfo recents = new RootInfo(); 434 assert recents.isRecents(); 435 state.stack.changeRoot(recents); 436 mgr.updateOptionMenu(testMenu); 437 optionInspector.assertVisible(); 438 optionInspector.assertDisabled(); 439 } 440 441 @Test testOptionMenu_Inspector_DisabledForEmptyStack()442 public void testOptionMenu_Inspector_DisabledForEmptyStack() { 443 features.inspector = true; 444 state.stack.reset(); // unset cwd 445 mgr.updateOptionMenu(testMenu); 446 447 optionInspector.assertVisible(); 448 optionInspector.assertDisabled(); 449 } 450 451 @Test testOptionMenu_Inspector_DisabledForNullDirectory()452 public void testOptionMenu_Inspector_DisabledForNullDirectory() { 453 features.inspector = true; 454 state.stack.reset(); 455 state.stack.push(null); 456 mgr.updateOptionMenu(testMenu); 457 458 optionInspector.assertVisible(); 459 optionInspector.assertDisabled(); 460 } 461 462 @Test testInflateContextMenu_Files()463 public void testInflateContextMenu_Files() { 464 TestMenuInflater inflater = new TestMenuInflater(); 465 466 selectionDetails.containFiles = true; 467 selectionDetails.containDirectories = false; 468 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 469 470 assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId); 471 } 472 473 @Test testInflateContextMenu_Dirs()474 public void testInflateContextMenu_Dirs() { 475 TestMenuInflater inflater = new TestMenuInflater(); 476 477 selectionDetails.containFiles = false; 478 selectionDetails.containDirectories = true; 479 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 480 481 assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId); 482 } 483 484 @Test testInflateContextMenu_Mixed()485 public void testInflateContextMenu_Mixed() { 486 TestMenuInflater inflater = new TestMenuInflater(); 487 488 selectionDetails.containFiles = true; 489 selectionDetails.containDirectories = true; 490 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 491 492 assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId); 493 } 494 495 @Test testContextMenu_EmptyArea()496 public void testContextMenu_EmptyArea() { 497 mgr.updateContextMenuForContainer(testMenu); 498 499 dirSelectAll.assertVisible(); 500 dirSelectAll.assertEnabled(); 501 dirPasteFromClipboard.assertVisible(); 502 dirPasteFromClipboard.assertDisabled(); 503 dirCreateDir.assertVisible(); 504 dirCreateDir.assertDisabled(); 505 } 506 507 @Test testContextMenu_EmptyArea_NoItemToPaste()508 public void testContextMenu_EmptyArea_NoItemToPaste() { 509 dirDetails.hasItemsToPaste = false; 510 dirDetails.canCreateDoc = true; 511 512 mgr.updateContextMenuForContainer(testMenu); 513 514 dirSelectAll.assertVisible(); 515 dirSelectAll.assertEnabled(); 516 dirPasteFromClipboard.assertVisible(); 517 dirPasteFromClipboard.assertDisabled(); 518 dirCreateDir.assertVisible(); 519 dirCreateDir.assertDisabled(); 520 } 521 522 @Test testContextMenu_EmptyArea_CantCreateDoc()523 public void testContextMenu_EmptyArea_CantCreateDoc() { 524 dirDetails.hasItemsToPaste = true; 525 dirDetails.canCreateDoc = false; 526 527 mgr.updateContextMenuForContainer(testMenu); 528 529 dirSelectAll.assertVisible(); 530 dirSelectAll.assertEnabled(); 531 dirPasteFromClipboard.assertVisible(); 532 dirPasteFromClipboard.assertDisabled(); 533 dirCreateDir.assertVisible(); 534 dirCreateDir.assertDisabled(); 535 } 536 537 @Test testContextMenu_EmptyArea_CanPaste()538 public void testContextMenu_EmptyArea_CanPaste() { 539 dirDetails.hasItemsToPaste = true; 540 dirDetails.canCreateDoc = true; 541 542 mgr.updateContextMenuForContainer(testMenu); 543 544 dirSelectAll.assertVisible(); 545 dirSelectAll.assertEnabled(); 546 dirPasteFromClipboard.assertVisible(); 547 dirPasteFromClipboard.assertEnabled(); 548 dirCreateDir.assertVisible(); 549 dirCreateDir.assertDisabled(); 550 } 551 552 @Test testContextMenu_EmptyArea_CanCreateDirectory()553 public void testContextMenu_EmptyArea_CanCreateDirectory() { 554 dirDetails.canCreateDirectory = true; 555 556 mgr.updateContextMenuForContainer(testMenu); 557 558 dirSelectAll.assertVisible(); 559 dirSelectAll.assertEnabled(); 560 dirPasteFromClipboard.assertVisible(); 561 dirPasteFromClipboard.assertDisabled(); 562 dirCreateDir.assertVisible(); 563 dirCreateDir.assertEnabled(); 564 } 565 566 @Test testContextMenu_OnFile()567 public void testContextMenu_OnFile() { 568 selectionDetails.size = 1; 569 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 570 dirOpen.assertVisible(); 571 dirOpen.assertEnabled(); 572 dirCutToClipboard.assertVisible(); 573 dirCopyToClipboard.assertVisible(); 574 dirRename.assertVisible(); 575 dirCreateDir.assertVisible(); 576 dirDelete.assertVisible(); 577 } 578 579 @Test testContextMenu_OnFile_CanOpenWith()580 public void testContextMenu_OnFile_CanOpenWith() { 581 selectionDetails.canOpenWith = true; 582 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 583 dirOpenWith.assertVisible(); 584 dirOpenWith.assertEnabled(); 585 } 586 587 @Test testContextMenu_OnFile_NoOpenWith()588 public void testContextMenu_OnFile_NoOpenWith() { 589 selectionDetails.canOpenWith = false; 590 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 591 dirOpenWith.assertVisible(); 592 dirOpenWith.assertDisabled(); 593 } 594 595 @Test testContextMenu_OnMultipleFiles()596 public void testContextMenu_OnMultipleFiles() { 597 selectionDetails.size = 3; 598 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 599 dirOpen.assertVisible(); 600 dirOpen.assertDisabled(); 601 } 602 603 @Test testContextMenu_OnWritableDirectory()604 public void testContextMenu_OnWritableDirectory() { 605 selectionDetails.size = 1; 606 selectionDetails.canPasteInto = true; 607 dirDetails.hasItemsToPaste = true; 608 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 609 dirOpenInNewWindow.assertVisible(); 610 dirOpenInNewWindow.assertEnabled(); 611 dirCutToClipboard.assertVisible(); 612 dirCopyToClipboard.assertVisible(); 613 dirPasteIntoFolder.assertVisible(); 614 dirPasteIntoFolder.assertEnabled(); 615 dirRename.assertVisible(); 616 dirDelete.assertVisible(); 617 } 618 619 @Test testContextMenu_OnNonWritableDirectory()620 public void testContextMenu_OnNonWritableDirectory() { 621 selectionDetails.size = 1; 622 selectionDetails.canPasteInto = false; 623 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 624 dirOpenInNewWindow.assertVisible(); 625 dirOpenInNewWindow.assertEnabled(); 626 dirCutToClipboard.assertVisible(); 627 dirCopyToClipboard.assertVisible(); 628 dirPasteIntoFolder.assertVisible(); 629 dirPasteIntoFolder.assertDisabled(); 630 dirRename.assertVisible(); 631 dirDelete.assertVisible(); 632 } 633 634 @Test testContextMenu_CanInspectContainer()635 public void testContextMenu_CanInspectContainer() { 636 mgr.updateContextMenuForContainer(testMenu); 637 dirInspect.assertVisible(); 638 dirInspect.assertEnabled(); 639 } 640 641 @Test testContextMenu_OnWritableDirectory_NothingToPaste()642 public void testContextMenu_OnWritableDirectory_NothingToPaste() { 643 selectionDetails.canPasteInto = true; 644 selectionDetails.size = 1; 645 dirDetails.hasItemsToPaste = false; 646 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 647 dirPasteIntoFolder.assertVisible(); 648 dirPasteIntoFolder.assertDisabled(); 649 } 650 651 @Test testContextMenu_OnMultipleDirectories()652 public void testContextMenu_OnMultipleDirectories() { 653 selectionDetails.size = 3; 654 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 655 dirOpenInNewWindow.assertVisible(); 656 dirOpenInNewWindow.assertDisabled(); 657 } 658 659 @Test testContextMenu_OnMixedDocs()660 public void testContextMenu_OnMixedDocs() { 661 selectionDetails.containDirectories = true; 662 selectionDetails.containFiles = true; 663 selectionDetails.size = 2; 664 selectionDetails.canDelete = true; 665 mgr.updateContextMenu(testMenu, selectionDetails); 666 dirCutToClipboard.assertVisible(); 667 dirCutToClipboard.assertEnabled(); 668 dirCopyToClipboard.assertVisible(); 669 dirCopyToClipboard.assertEnabled(); 670 dirDelete.assertVisible(); 671 dirDelete.assertEnabled(); 672 } 673 674 @Test testContextMenu_OnMixedDocs_hasPartialFile()675 public void testContextMenu_OnMixedDocs_hasPartialFile() { 676 selectionDetails.containDirectories = true; 677 selectionDetails.containFiles = true; 678 selectionDetails.size = 2; 679 selectionDetails.containPartial = true; 680 selectionDetails.canDelete = true; 681 mgr.updateContextMenu(testMenu, selectionDetails); 682 dirCutToClipboard.assertVisible(); 683 dirCutToClipboard.assertDisabled(); 684 dirCopyToClipboard.assertVisible(); 685 dirCopyToClipboard.assertDisabled(); 686 dirDelete.assertVisible(); 687 dirDelete.assertEnabled(); 688 } 689 690 @Test testContextMenu_OnMixedDocs_hasUndeletableFile()691 public void testContextMenu_OnMixedDocs_hasUndeletableFile() { 692 selectionDetails.containDirectories = true; 693 selectionDetails.containFiles = true; 694 selectionDetails.size = 2; 695 selectionDetails.canDelete = false; 696 mgr.updateContextMenu(testMenu, selectionDetails); 697 dirCutToClipboard.assertVisible(); 698 dirCutToClipboard.assertDisabled(); 699 dirCopyToClipboard.assertVisible(); 700 dirCopyToClipboard.assertEnabled(); 701 dirDelete.assertVisible(); 702 dirDelete.assertDisabled(); 703 } 704 705 @Test testContextMenu_CanInspectSingleSelection()706 public void testContextMenu_CanInspectSingleSelection() { 707 selectionDetails.size = 1; 708 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 709 dirInspect.assertVisible(); 710 dirInspect.assertEnabled(); 711 } 712 713 @Test testRootContextMenu()714 public void testRootContextMenu() { 715 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 716 717 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 718 719 rootEjectRoot.assertInvisible(); 720 721 rootOpenInNewWindow.assertVisible(); 722 rootOpenInNewWindow.assertEnabled(); 723 724 rootPasteIntoFolder.assertVisible(); 725 rootPasteIntoFolder.assertDisabled(); 726 727 rootSettings.assertVisible(); 728 rootSettings.assertDisabled(); 729 } 730 731 @Test testRootContextMenu_HasRootSettings()732 public void testRootContextMenu_HasRootSettings() { 733 testRootInfo.flags = Root.FLAG_HAS_SETTINGS; 734 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 735 736 rootSettings.assertEnabled(); 737 } 738 739 @Test testRootContextMenu_NonWritableRoot()740 public void testRootContextMenu_NonWritableRoot() { 741 dirDetails.hasItemsToPaste = true; 742 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 743 744 rootPasteIntoFolder.assertVisible(); 745 rootPasteIntoFolder.assertDisabled(); 746 } 747 748 @Test testRootContextMenu_NothingToPaste()749 public void testRootContextMenu_NothingToPaste() { 750 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 751 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 752 dirDetails.hasItemsToPaste = false; 753 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 754 755 rootPasteIntoFolder.assertVisible(); 756 rootPasteIntoFolder.assertDisabled(); 757 } 758 759 @Test testRootContextMenu_PasteIntoWritableRoot()760 public void testRootContextMenu_PasteIntoWritableRoot() { 761 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 762 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 763 dirDetails.hasItemsToPaste = true; 764 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 765 766 rootPasteIntoFolder.assertVisible(); 767 rootPasteIntoFolder.assertEnabled(); 768 } 769 770 @Test testRootContextMenu_Eject()771 public void testRootContextMenu_Eject() { 772 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 773 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 774 775 rootEjectRoot.assertEnabled(); 776 } 777 778 @Test testRootContextMenu_EjectInProcess()779 public void testRootContextMenu_EjectInProcess() { 780 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 781 testRootInfo.ejecting = true; 782 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 783 784 rootEjectRoot.assertDisabled(); 785 } 786 } 787