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