MenuManagerTest.java revision 710248d5ee766765b86fa36fe2ddd8d65f926755
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.TestFeatures; 33import com.android.documentsui.testing.TestMenu; 34import com.android.documentsui.testing.TestMenuInflater; 35import com.android.documentsui.testing.TestMenuItem; 36import com.android.documentsui.testing.TestScopedPreferences; 37import com.android.documentsui.testing.TestSearchViewManager; 38import com.android.documentsui.testing.TestSelectionDetails; 39 40import org.junit.Before; 41import org.junit.Test; 42import org.junit.runner.RunWith; 43 44@RunWith(AndroidJUnit4.class) 45@SmallTest 46public final class MenuManagerTest { 47 48 private TestMenu testMenu; 49 private TestMenuItem rename; 50 private TestMenuItem selectAll; 51 private TestMenuItem moveTo; 52 private TestMenuItem copyTo; 53 private TestMenuItem compress; 54 private TestMenuItem extractTo; 55 private TestMenuItem share; 56 private TestMenuItem delete; 57 private TestMenuItem createDir; 58 private TestMenuItem settings; 59 private TestMenuItem newWindow; 60 private TestMenuItem open; 61 private TestMenuItem openWith; 62 private TestMenuItem openInNewWindow; 63 private TestMenuItem cut; 64 private TestMenuItem copy; 65 private TestMenuItem paste; 66 private TestMenuItem pasteInto; 67 private TestMenuItem advanced; 68 private TestMenuItem eject; 69 70 private TestFeatures features; 71 private TestSelectionDetails selectionDetails; 72 private TestDirectoryDetails dirDetails; 73 private TestSearchViewManager testSearchManager; 74 private TestScopedPreferences preferences; 75 private RootInfo testRootInfo; 76 private DocumentInfo testDocInfo; 77 private State state = new State(); 78 private MenuManager mgr; 79 80 @Before 81 public void setUp() { 82 testMenu = TestMenu.create(); 83 rename = testMenu.findItem(R.id.menu_rename); 84 selectAll = testMenu.findItem(R.id.menu_select_all); 85 moveTo = testMenu.findItem(R.id.menu_move_to); 86 copyTo = testMenu.findItem(R.id.menu_copy_to); 87 compress = testMenu.findItem(R.id.menu_compress); 88 extractTo = testMenu.findItem(R.id.menu_extract_to); 89 share = testMenu.findItem(R.id.menu_share); 90 delete = testMenu.findItem(R.id.menu_delete); 91 createDir = testMenu.findItem(R.id.menu_create_dir); 92 settings = testMenu.findItem(R.id.menu_settings); 93 newWindow = testMenu.findItem(R.id.menu_new_window); 94 open = testMenu.findItem(R.id.menu_open); 95 openWith = testMenu.findItem(R.id.menu_open_with); 96 openInNewWindow = testMenu.findItem(R.id.menu_open_in_new_window); 97 cut = testMenu.findItem(R.id.menu_cut_to_clipboard); 98 copy = testMenu.findItem(R.id.menu_copy_to_clipboard); 99 paste = testMenu.findItem(R.id.menu_paste_from_clipboard); 100 pasteInto = testMenu.findItem(R.id.menu_paste_into_folder); 101 advanced = testMenu.findItem(R.id.menu_advanced); 102 eject = testMenu.findItem(R.id.menu_eject_root); 103 104 features = new TestFeatures(); 105 106 // These items by default are visible 107 testMenu.findItem(R.id.menu_select_all).setVisible(true); 108 testMenu.findItem(R.id.menu_list).setVisible(true); 109 110 selectionDetails = new TestSelectionDetails(); 111 dirDetails = new TestDirectoryDetails(); 112 testSearchManager = new TestSearchViewManager(); 113 preferences = new TestScopedPreferences(); 114 mgr = new MenuManager(features, testSearchManager, state, dirDetails); 115 116 testRootInfo = new RootInfo(); 117 testDocInfo = new DocumentInfo(); 118 } 119 120 @Test 121 public void testActionMenu() { 122 selectionDetails.canDelete = true; 123 selectionDetails.canRename = true; 124 dirDetails.canCreateDoc = true; 125 126 mgr.updateActionMenu(testMenu, selectionDetails); 127 128 rename.assertEnabled(); 129 delete.assertVisible(); 130 share.assertVisible(); 131 copyTo.assertEnabled(); 132 compress.assertEnabled(); 133 extractTo.assertInvisible(); 134 moveTo.assertEnabled(); 135 } 136 137 @Test 138 public void testActionMenu_ContainsPartial() { 139 selectionDetails.containPartial = true; 140 dirDetails.canCreateDoc = true; 141 mgr.updateActionMenu(testMenu, selectionDetails); 142 143 rename.assertDisabled(); 144 share.assertInvisible(); 145 copyTo.assertDisabled(); 146 compress.assertDisabled(); 147 extractTo.assertDisabled(); 148 moveTo.assertDisabled(); 149 } 150 151 @Test 152 public void testActionMenu_CreateArchives_ReflectsFeatureState() { 153 features.archiveCreation = false; 154 dirDetails.canCreateDoc = true; 155 mgr.updateActionMenu(testMenu, selectionDetails); 156 157 compress.assertInvisible(); 158 compress.assertDisabled(); 159 } 160 161 @Test 162 public void testActionMenu_CreateArchive() { 163 dirDetails.canCreateDoc = true; 164 mgr.updateActionMenu(testMenu, selectionDetails); 165 166 compress.assertEnabled(); 167 } 168 169 @Test 170 public void testActionMenu_NoCreateArchive() { 171 dirDetails.canCreateDoc = false; 172 mgr.updateActionMenu(testMenu, selectionDetails); 173 174 compress.assertDisabled(); 175 } 176 177 @Test 178 public void testActionMenu_cantRename() { 179 selectionDetails.canRename = false; 180 mgr.updateActionMenu(testMenu, selectionDetails); 181 182 rename.assertDisabled(); 183 } 184 185 @Test 186 public void testActionMenu_cantDelete() { 187 selectionDetails.canDelete = false; 188 mgr.updateActionMenu(testMenu, selectionDetails); 189 190 delete.assertInvisible(); 191 // We shouldn't be able to move files if we can't delete them 192 moveTo.assertDisabled(); 193 } 194 195 @Test 196 public void testActionMenu_changeToCanDelete() { 197 selectionDetails.canDelete = false; 198 mgr.updateActionMenu(testMenu, selectionDetails); 199 200 selectionDetails.canDelete = true; 201 mgr.updateActionMenu(testMenu, selectionDetails); 202 203 delete.assertVisible(); 204 delete.assertEnabled(); 205 moveTo.assertVisible(); 206 moveTo.assertEnabled(); 207 } 208 209 @Test 210 public void testActionMenu_ContainsDirectory() { 211 selectionDetails.containDirectories = true; 212 mgr.updateActionMenu(testMenu, selectionDetails); 213 214 // We can't share directories 215 share.assertInvisible(); 216 } 217 218 @Test 219 public void testActionMenu_RemovesDirectory() { 220 selectionDetails.containDirectories = true; 221 mgr.updateActionMenu(testMenu, selectionDetails); 222 223 selectionDetails.containDirectories = false; 224 mgr.updateActionMenu(testMenu, selectionDetails); 225 226 share.assertVisible(); 227 share.assertEnabled(); 228 } 229 230 @Test 231 public void testActionMenu_CantExtract() { 232 selectionDetails.canExtract = false; 233 mgr.updateActionMenu(testMenu, selectionDetails); 234 235 extractTo.assertInvisible(); 236 } 237 238 @Test 239 public void testActionMenu_CanExtract_hidesCopyToAndCompressAndShare() { 240 features.archiveCreation = true; 241 selectionDetails.canExtract = true; 242 dirDetails.canCreateDoc = true; 243 mgr.updateActionMenu(testMenu, selectionDetails); 244 245 extractTo.assertEnabled(); 246 copyTo.assertDisabled(); 247 compress.assertDisabled(); 248 } 249 250 @Test 251 public void testActionMenu_CanOpenWith() { 252 selectionDetails.canOpenWith = true; 253 mgr.updateActionMenu(testMenu, selectionDetails); 254 255 openWith.assertVisible(); 256 openWith.assertEnabled(); 257 } 258 259 @Test 260 public void testActionMenu_NoOpenWith() { 261 selectionDetails.canOpenWith = false; 262 mgr.updateActionMenu(testMenu, selectionDetails); 263 264 openWith.assertVisible(); 265 openWith.assertDisabled(); 266 } 267 268 @Test 269 public void testOptionMenu() { 270 mgr.updateOptionMenu(testMenu); 271 272 advanced.assertInvisible(); 273 advanced.assertTitle(R.string.menu_advanced_show); 274 createDir.assertDisabled(); 275 assertTrue(testSearchManager.updateMenuCalled()); 276 } 277 278 @Test 279 public void testOptionMenu_ShowAdvanced() { 280 state.showAdvanced = true; 281 state.showDeviceStorageOption = true; 282 mgr.updateOptionMenu(testMenu); 283 284 advanced.assertVisible(); 285 advanced.assertTitle(R.string.menu_advanced_hide); 286 } 287 288 @Test 289 public void testOptionMenu_CanCreateDirectory() { 290 dirDetails.canCreateDirectory = true; 291 mgr.updateOptionMenu(testMenu); 292 293 createDir.assertEnabled(); 294 } 295 296 @Test 297 public void testOptionMenu_HasRootSettings() { 298 dirDetails.hasRootSettings = true; 299 mgr.updateOptionMenu(testMenu); 300 301 settings.assertVisible(); 302 } 303 304 @Test 305 public void testInflateContextMenu_Files() { 306 TestMenuInflater inflater = new TestMenuInflater(); 307 308 selectionDetails.containFiles = true; 309 selectionDetails.containDirectories = false; 310 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 311 312 assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId); 313 } 314 315 @Test 316 public void testInflateContextMenu_Dirs() { 317 TestMenuInflater inflater = new TestMenuInflater(); 318 319 selectionDetails.containFiles = false; 320 selectionDetails.containDirectories = true; 321 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 322 323 assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId); 324 } 325 326 @Test 327 public void testInflateContextMenu_Mixed() { 328 TestMenuInflater inflater = new TestMenuInflater(); 329 330 selectionDetails.containFiles = true; 331 selectionDetails.containDirectories = true; 332 mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails); 333 334 assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId); 335 } 336 337 @Test 338 public void testContextMenu_EmptyArea() { 339 mgr.updateContextMenuForContainer(testMenu); 340 341 selectAll.assertVisible(); 342 selectAll.assertEnabled(); 343 paste.assertVisible(); 344 paste.assertDisabled(); 345 createDir.assertVisible(); 346 createDir.assertDisabled(); 347 } 348 349 @Test 350 public void testContextMenu_EmptyArea_NoItemToPaste() { 351 dirDetails.hasItemsToPaste = false; 352 dirDetails.canCreateDoc = true; 353 354 mgr.updateContextMenuForContainer(testMenu); 355 356 selectAll.assertVisible(); 357 selectAll.assertEnabled(); 358 paste.assertVisible(); 359 paste.assertDisabled(); 360 createDir.assertVisible(); 361 createDir.assertDisabled(); 362 } 363 364 @Test 365 public void testContextMenu_EmptyArea_CantCreateDoc() { 366 dirDetails.hasItemsToPaste = true; 367 dirDetails.canCreateDoc = false; 368 369 mgr.updateContextMenuForContainer(testMenu); 370 371 selectAll.assertVisible(); 372 selectAll.assertEnabled(); 373 paste.assertVisible(); 374 paste.assertDisabled(); 375 createDir.assertVisible(); 376 createDir.assertDisabled(); 377 } 378 379 @Test 380 public void testContextMenu_EmptyArea_CanPaste() { 381 dirDetails.hasItemsToPaste = true; 382 dirDetails.canCreateDoc = true; 383 384 mgr.updateContextMenuForContainer(testMenu); 385 386 selectAll.assertVisible(); 387 selectAll.assertEnabled(); 388 paste.assertVisible(); 389 paste.assertEnabled(); 390 createDir.assertVisible(); 391 createDir.assertDisabled(); 392 } 393 394 @Test 395 public void testContextMenu_EmptyArea_CanCreateDirectory() { 396 dirDetails.canCreateDirectory = true; 397 398 mgr.updateContextMenuForContainer(testMenu); 399 400 selectAll.assertVisible(); 401 selectAll.assertEnabled(); 402 paste.assertVisible(); 403 paste.assertDisabled(); 404 createDir.assertVisible(); 405 createDir.assertEnabled(); 406 } 407 408 @Test 409 public void testContextMenu_OnFile() { 410 selectionDetails.size = 1; 411 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 412 open.assertVisible(); 413 open.assertEnabled(); 414 cut.assertVisible(); 415 copy.assertVisible(); 416 rename.assertVisible(); 417 createDir.assertVisible(); 418 delete.assertVisible(); 419 } 420 421 @Test 422 public void testContextMenu_OnFile_CanOpenWith() { 423 selectionDetails.canOpenWith = true; 424 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 425 openWith.assertVisible(); 426 openWith.assertEnabled(); 427 } 428 429 @Test 430 public void testContextMenu_OnFile_NoOpenWith() { 431 selectionDetails.canOpenWith = false; 432 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 433 openWith.assertVisible(); 434 openWith.assertDisabled(); 435 } 436 437 @Test 438 public void testContextMenu_OnMultipleFiles() { 439 selectionDetails.size = 3; 440 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 441 open.assertVisible(); 442 open.assertDisabled(); 443 } 444 445 @Test 446 public void testContextMenu_OnWritableDirectory() { 447 selectionDetails.size = 1; 448 selectionDetails.canPasteInto = true; 449 dirDetails.hasItemsToPaste = true; 450 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 451 openInNewWindow.assertVisible(); 452 openInNewWindow.assertEnabled(); 453 cut.assertVisible(); 454 copy.assertVisible(); 455 pasteInto.assertVisible(); 456 pasteInto.assertEnabled(); 457 rename.assertVisible(); 458 delete.assertVisible(); 459 } 460 461 @Test 462 public void testContextMenu_OnNonWritableDirectory() { 463 selectionDetails.size = 1; 464 selectionDetails.canPasteInto = false; 465 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 466 openInNewWindow.assertVisible(); 467 openInNewWindow.assertEnabled(); 468 cut.assertVisible(); 469 copy.assertVisible(); 470 pasteInto.assertVisible(); 471 pasteInto.assertDisabled(); 472 rename.assertVisible(); 473 delete.assertVisible(); 474 } 475 476 @Test 477 public void testContextMenu_OnWritableDirectory_NothingToPaste() { 478 selectionDetails.canPasteInto = true; 479 selectionDetails.size = 1; 480 dirDetails.hasItemsToPaste = false; 481 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 482 pasteInto.assertVisible(); 483 pasteInto.assertDisabled(); 484 } 485 486 @Test 487 public void testContextMenu_OnMultipleDirectories() { 488 selectionDetails.size = 3; 489 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 490 openInNewWindow.assertVisible(); 491 openInNewWindow.assertDisabled(); 492 } 493 494 @Test 495 public void testContextMenu_OnMixedDocs() { 496 selectionDetails.containDirectories = true; 497 selectionDetails.containFiles = true; 498 selectionDetails.size = 2; 499 selectionDetails.canDelete = true; 500 mgr.updateContextMenu(testMenu, selectionDetails); 501 cut.assertVisible(); 502 cut.assertEnabled(); 503 copy.assertVisible(); 504 copy.assertEnabled(); 505 delete.assertVisible(); 506 delete.assertEnabled(); 507 } 508 509 @Test 510 public void testContextMenu_OnMixedDocs_hasPartialFile() { 511 selectionDetails.containDirectories = true; 512 selectionDetails.containFiles = true; 513 selectionDetails.size = 2; 514 selectionDetails.containPartial = true; 515 selectionDetails.canDelete = true; 516 mgr.updateContextMenu(testMenu, selectionDetails); 517 cut.assertVisible(); 518 cut.assertDisabled(); 519 copy.assertVisible(); 520 copy.assertDisabled(); 521 delete.assertVisible(); 522 delete.assertEnabled(); 523 } 524 525 @Test 526 public void testContextMenu_OnMixedDocs_hasUndeletableFile() { 527 selectionDetails.containDirectories = true; 528 selectionDetails.containFiles = true; 529 selectionDetails.size = 2; 530 selectionDetails.canDelete = false; 531 mgr.updateContextMenu(testMenu, selectionDetails); 532 cut.assertVisible(); 533 cut.assertDisabled(); 534 copy.assertVisible(); 535 copy.assertEnabled(); 536 delete.assertVisible(); 537 delete.assertDisabled(); 538 } 539 540 @Test 541 public void testRootContextMenu() { 542 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 543 544 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 545 546 eject.assertInvisible(); 547 548 openInNewWindow.assertVisible(); 549 openInNewWindow.assertEnabled(); 550 551 pasteInto.assertVisible(); 552 pasteInto.assertDisabled(); 553 554 settings.assertVisible(); 555 settings.assertDisabled(); 556 } 557 558 @Test 559 public void testRootContextMenu_HasRootSettings() { 560 testRootInfo.flags = Root.FLAG_HAS_SETTINGS; 561 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 562 563 settings.assertEnabled(); 564 } 565 566 @Test 567 public void testRootContextMenu_NonWritableRoot() { 568 dirDetails.hasItemsToPaste = true; 569 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 570 571 pasteInto.assertVisible(); 572 pasteInto.assertDisabled(); 573 } 574 575 @Test 576 public void testRootContextMenu_NothingToPaste() { 577 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 578 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 579 dirDetails.hasItemsToPaste = false; 580 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 581 582 pasteInto.assertVisible(); 583 pasteInto.assertDisabled(); 584 } 585 586 @Test 587 public void testRootContextMenu_PasteIntoWritableRoot() { 588 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 589 testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE; 590 dirDetails.hasItemsToPaste = true; 591 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 592 593 pasteInto.assertVisible(); 594 pasteInto.assertEnabled(); 595 } 596 597 @Test 598 public void testRootContextMenu_Eject() { 599 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 600 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 601 602 eject.assertEnabled(); 603 } 604 605 @Test 606 public void testRootContextMenu_EjectInProcess() { 607 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 608 testRootInfo.ejecting = true; 609 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 610 611 eject.assertDisabled(); 612 } 613} 614