• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.SelectionManager;
36 import com.android.documentsui.testing.SelectionManagers;
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 dirOpenInNewWindow;
70     private TestMenuItem dirPasteIntoFolder;
71 
72     /* Root List Context Menu items */
73     private TestMenuItem rootEjectRoot;
74     private TestMenuItem rootOpenInNewWindow;
75     private TestMenuItem rootPasteIntoFolder;
76     private TestMenuItem rootSettings;
77 
78     /* Action Mode menu items */
79     private TestMenuItem actionModeOpen;
80     private TestMenuItem actionModeOpenWith;
81     private TestMenuItem actionModeShare;
82     private TestMenuItem actionModeDelete;
83     private TestMenuItem actionModeSelectAll;
84     private TestMenuItem actionModeCopyTo;
85     private TestMenuItem actionModeExtractTo;
86     private TestMenuItem actionModeMoveTo;
87     private TestMenuItem actionModeCompress;
88     private TestMenuItem actionModeRename;
89     private TestMenuItem actionModeViewInOwner;
90     private TestMenuItem actionModeInspector;
91 
92     /* Option Menu items */
93     private TestMenuItem optionSearch;
94     private TestMenuItem optionDebug;
95     private TestMenuItem optionGrid;
96     private TestMenuItem optionList;
97     private TestMenuItem optionNewWindow;
98     private TestMenuItem optionCreateDir;
99     private TestMenuItem optionSelectAll;
100     private TestMenuItem optionAdvanced;
101     private TestMenuItem optionSettings;
102 
103     private TestFeatures features;
104     private TestSelectionDetails selectionDetails;
105     private TestDirectoryDetails dirDetails;
106     private TestSearchViewManager testSearchManager;
107     private TestScopedPreferences preferences;
108     private RootInfo testRootInfo;
109     private DocumentInfo testDocInfo;
110     private State state = new State();
111     private MenuManager mgr;
112     private TestActivity activity = TestActivity.create(TestEnv.create());
113     private SelectionManager selectionManager;
114 
115     @Before
setUp()116     public void setUp() {
117         testMenu = TestMenu.create();
118         dirShare = testMenu.findItem(R.id.dir_menu_share);
119         dirOpen = testMenu.findItem(R.id.dir_menu_open);
120         dirOpenWith = testMenu.findItem(R.id.dir_menu_open_with);
121         dirCutToClipboard = testMenu.findItem(R.id.dir_menu_cut_to_clipboard);
122         dirCopyToClipboard = testMenu.findItem(R.id.dir_menu_copy_to_clipboard);
123         dirPasteFromClipboard = testMenu.findItem(R.id.dir_menu_paste_from_clipboard);
124         dirCreateDir = testMenu.findItem(R.id.dir_menu_create_dir);
125         dirSelectAll = testMenu.findItem(R.id.dir_menu_select_all);
126         dirRename = testMenu.findItem(R.id.dir_menu_rename);
127         dirDelete = testMenu.findItem(R.id.dir_menu_delete);
128         dirViewInOwner = testMenu.findItem(R.id.dir_menu_view_in_owner);
129         dirOpenInNewWindow = testMenu.findItem(R.id.dir_menu_open_in_new_window);
130         dirPasteIntoFolder = testMenu.findItem(R.id.dir_menu_paste_into_folder);
131 
132         rootEjectRoot = testMenu.findItem(R.id.root_menu_eject_root);
133         rootOpenInNewWindow = testMenu.findItem(R.id.root_menu_open_in_new_window);
134         rootPasteIntoFolder = testMenu.findItem(R.id.root_menu_paste_into_folder);
135         rootSettings = testMenu.findItem(R.id.root_menu_settings);
136 
137         actionModeOpen = testMenu.findItem(R.id.action_menu_open);
138         actionModeOpenWith = testMenu.findItem(R.id.action_menu_open_with);
139         actionModeShare = testMenu.findItem(R.id.action_menu_share);
140         actionModeDelete = testMenu.findItem(R.id.action_menu_delete);
141         actionModeSelectAll = testMenu.findItem(R.id.action_menu_select_all);
142         actionModeCopyTo = testMenu.findItem(R.id.action_menu_copy_to);
143         actionModeExtractTo = testMenu.findItem(R.id.action_menu_extract_to);
144         actionModeMoveTo = testMenu.findItem(R.id.action_menu_move_to);
145         actionModeCompress = testMenu.findItem(R.id.action_menu_compress);
146         actionModeRename = testMenu.findItem(R.id.action_menu_rename);
147         actionModeInspector = testMenu.findItem(R.id.action_menu_inspector);
148         actionModeViewInOwner = testMenu.findItem(R.id.action_menu_view_in_owner);
149 
150         optionSearch = testMenu.findItem(R.id.option_menu_search);
151         optionDebug = testMenu.findItem(R.id.option_menu_debug);
152         optionGrid = testMenu.findItem(R.id.option_menu_grid);
153         optionList = testMenu.findItem(R.id.option_menu_list);
154         optionNewWindow = testMenu.findItem(R.id.option_menu_new_window);
155         optionCreateDir = testMenu.findItem(R.id.option_menu_create_dir);
156         optionSelectAll = testMenu.findItem(R.id.option_menu_select_all);
157         optionAdvanced = testMenu.findItem(R.id.option_menu_advanced);
158         optionSettings = testMenu.findItem(R.id.option_menu_settings);
159 
160         features = new TestFeatures();
161 
162         // These items by default are visible
163         testMenu.findItem(R.id.dir_menu_select_all).setVisible(true);
164         testMenu.findItem(R.id.option_menu_select_all).setVisible(true);
165         testMenu.findItem(R.id.option_menu_list).setVisible(true);
166 
167         selectionDetails = new TestSelectionDetails();
168         dirDetails = new TestDirectoryDetails();
169         testSearchManager = new TestSearchViewManager();
170         preferences = new TestScopedPreferences();
171         selectionManager = SelectionManagers.createTestInstance(TestData.create(1));
172         selectionManager.toggleSelection("0");
173 
174         mgr = new MenuManager(
175                 features,
176                 testSearchManager,
177                 state,
178                 dirDetails,
179                 activity,
180                 selectionManager,
181                 this::getApplicationNameFromAuthority,
182                 this::getUriFromModelId);
183 
184         testRootInfo = new RootInfo();
185         testDocInfo = new DocumentInfo();
186     }
187 
getUriFromModelId(String id)188     private Uri getUriFromModelId(String id) {
189         return Uri.EMPTY;
190     }
getApplicationNameFromAuthority(String authority)191     private String getApplicationNameFromAuthority(String authority) {
192         return "TestApp";
193     }
194 
195     @Test
testActionMenu()196     public void testActionMenu() {
197         selectionDetails.canDelete = true;
198         selectionDetails.canRename = true;
199         dirDetails.canCreateDoc = true;
200 
201         mgr.updateActionMenu(testMenu, selectionDetails);
202 
203         actionModeRename.assertEnabled();
204         actionModeDelete.assertVisible();
205         actionModeShare.assertVisible();
206         actionModeCopyTo.assertEnabled();
207         actionModeCompress.assertEnabled();
208         actionModeExtractTo.assertInvisible();
209         actionModeMoveTo.assertEnabled();
210         actionModeViewInOwner.assertInvisible();
211     }
212 
213     @Test
testActionMenu_ContainsPartial()214     public void testActionMenu_ContainsPartial() {
215         selectionDetails.containPartial = true;
216         dirDetails.canCreateDoc = true;
217         mgr.updateActionMenu(testMenu, selectionDetails);
218 
219         actionModeRename.assertDisabled();
220         actionModeShare.assertInvisible();
221         actionModeCopyTo.assertDisabled();
222         actionModeCompress.assertDisabled();
223         actionModeExtractTo.assertDisabled();
224         actionModeMoveTo.assertDisabled();
225         actionModeViewInOwner.assertInvisible();
226     }
227 
228     @Test
testActionMenu_CreateArchives_ReflectsFeatureState()229     public void testActionMenu_CreateArchives_ReflectsFeatureState() {
230         features.archiveCreation = false;
231         dirDetails.canCreateDoc = true;
232         mgr.updateActionMenu(testMenu, selectionDetails);
233 
234         actionModeCompress.assertInvisible();
235         actionModeCompress.assertDisabled();
236     }
237 
238     @Test
testActionMenu_CreateArchive()239     public void testActionMenu_CreateArchive() {
240         dirDetails.canCreateDoc = true;
241         mgr.updateActionMenu(testMenu, selectionDetails);
242 
243         actionModeCompress.assertEnabled();
244     }
245 
246     @Test
testActionMenu_NoCreateArchive()247     public void testActionMenu_NoCreateArchive() {
248         dirDetails.canCreateDoc = false;
249         mgr.updateActionMenu(testMenu, selectionDetails);
250 
251         actionModeCompress.assertDisabled();
252     }
253 
254     @Test
testActionMenu_cantRename()255     public void testActionMenu_cantRename() {
256         selectionDetails.canRename = false;
257         mgr.updateActionMenu(testMenu, selectionDetails);
258 
259         actionModeRename.assertDisabled();
260     }
261 
262     @Test
testActionMenu_cantDelete()263     public void testActionMenu_cantDelete() {
264         selectionDetails.canDelete = false;
265         mgr.updateActionMenu(testMenu, selectionDetails);
266 
267         actionModeDelete.assertInvisible();
268         // We shouldn't be able to move files if we can't delete them
269         actionModeMoveTo.assertDisabled();
270     }
271 
272     @Test
testActionsMenu_canViewInOwner()273     public void testActionsMenu_canViewInOwner() {
274         selectionDetails.canViewInOwner = true;
275         mgr.updateActionMenu(testMenu, selectionDetails);
276 
277         actionModeViewInOwner.assertVisible();
278     }
279 
280     @Test
testActionMenu_changeToCanDelete()281     public void testActionMenu_changeToCanDelete() {
282         selectionDetails.canDelete = false;
283         mgr.updateActionMenu(testMenu, selectionDetails);
284 
285         selectionDetails.canDelete = true;
286         mgr.updateActionMenu(testMenu, selectionDetails);
287 
288         actionModeDelete.assertVisible();
289         actionModeDelete.assertEnabled();
290         actionModeMoveTo.assertVisible();
291         actionModeMoveTo.assertEnabled();
292     }
293 
294     @Test
testActionMenu_ContainsDirectory()295     public void testActionMenu_ContainsDirectory() {
296         selectionDetails.containDirectories = true;
297         mgr.updateActionMenu(testMenu, selectionDetails);
298 
299         // We can't share directories
300         actionModeShare.assertInvisible();
301     }
302 
303     @Test
testActionMenu_RemovesDirectory()304     public void testActionMenu_RemovesDirectory() {
305         selectionDetails.containDirectories = true;
306         mgr.updateActionMenu(testMenu, selectionDetails);
307 
308         selectionDetails.containDirectories = false;
309         mgr.updateActionMenu(testMenu, selectionDetails);
310 
311         actionModeShare.assertVisible();
312         actionModeShare.assertEnabled();
313     }
314 
315     @Test
testActionMenu_CantExtract()316     public void testActionMenu_CantExtract() {
317         selectionDetails.canExtract = false;
318         mgr.updateActionMenu(testMenu, selectionDetails);
319 
320         actionModeExtractTo.assertInvisible();
321     }
322 
323     @Test
testActionMenu_CanExtract_hidesCopyToAndCompressAndShare()324     public void testActionMenu_CanExtract_hidesCopyToAndCompressAndShare() {
325         features.archiveCreation = true;
326         selectionDetails.canExtract = true;
327         dirDetails.canCreateDoc = true;
328         mgr.updateActionMenu(testMenu, selectionDetails);
329 
330         actionModeExtractTo.assertEnabled();
331         actionModeCopyTo.assertDisabled();
332         actionModeCompress.assertDisabled();
333     }
334 
335     @Test
testActionMenu_CanOpenWith()336     public void testActionMenu_CanOpenWith() {
337         selectionDetails.canOpenWith = true;
338         mgr.updateActionMenu(testMenu, selectionDetails);
339 
340         actionModeOpenWith.assertVisible();
341         actionModeOpenWith.assertEnabled();
342     }
343 
344     @Test
testActionMenu_NoOpenWith()345     public void testActionMenu_NoOpenWith() {
346         selectionDetails.canOpenWith = false;
347         mgr.updateActionMenu(testMenu, selectionDetails);
348 
349         actionModeOpenWith.assertVisible();
350         actionModeOpenWith.assertDisabled();
351     }
352 
353     @Test
testOptionMenu()354     public void testOptionMenu() {
355         mgr.updateOptionMenu(testMenu);
356 
357         optionAdvanced.assertInvisible();
358         optionAdvanced.assertTitle(R.string.menu_advanced_show);
359         optionCreateDir.assertDisabled();
360         optionDebug.assertInvisible();
361         assertTrue(testSearchManager.updateMenuCalled());
362     }
363 
364     @Test
testOptionMenu_ShowAdvanced()365     public void testOptionMenu_ShowAdvanced() {
366         state.showAdvanced = true;
367         state.showDeviceStorageOption = true;
368         mgr.updateOptionMenu(testMenu);
369 
370         optionAdvanced.assertVisible();
371         optionAdvanced.assertTitle(R.string.menu_advanced_hide);
372     }
373 
374     @Test
testOptionMenu_CanCreateDirectory()375     public void testOptionMenu_CanCreateDirectory() {
376         dirDetails.canCreateDirectory = true;
377         mgr.updateOptionMenu(testMenu);
378 
379         optionCreateDir.assertEnabled();
380     }
381 
382     @Test
testOptionMenu_HasRootSettings()383     public void testOptionMenu_HasRootSettings() {
384         dirDetails.hasRootSettings = true;
385         mgr.updateOptionMenu(testMenu);
386 
387         optionSettings.assertVisible();
388     }
389 
390     @Test
testInflateContextMenu_Files()391     public void testInflateContextMenu_Files() {
392         TestMenuInflater inflater = new TestMenuInflater();
393 
394         selectionDetails.containFiles = true;
395         selectionDetails.containDirectories = false;
396         mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
397 
398         assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId);
399     }
400 
401     @Test
testInflateContextMenu_Dirs()402     public void testInflateContextMenu_Dirs() {
403         TestMenuInflater inflater = new TestMenuInflater();
404 
405         selectionDetails.containFiles = false;
406         selectionDetails.containDirectories = true;
407         mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
408 
409         assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId);
410     }
411 
412     @Test
testInflateContextMenu_Mixed()413     public void testInflateContextMenu_Mixed() {
414         TestMenuInflater inflater = new TestMenuInflater();
415 
416         selectionDetails.containFiles = true;
417         selectionDetails.containDirectories = true;
418         mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
419 
420         assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId);
421     }
422 
423     @Test
testContextMenu_EmptyArea()424     public void testContextMenu_EmptyArea() {
425         mgr.updateContextMenuForContainer(testMenu);
426 
427         dirSelectAll.assertVisible();
428         dirSelectAll.assertEnabled();
429         dirPasteFromClipboard.assertVisible();
430         dirPasteFromClipboard.assertDisabled();
431         dirCreateDir.assertVisible();
432         dirCreateDir.assertDisabled();
433     }
434 
435     @Test
testContextMenu_EmptyArea_NoItemToPaste()436     public void testContextMenu_EmptyArea_NoItemToPaste() {
437         dirDetails.hasItemsToPaste = false;
438         dirDetails.canCreateDoc = true;
439 
440         mgr.updateContextMenuForContainer(testMenu);
441 
442         dirSelectAll.assertVisible();
443         dirSelectAll.assertEnabled();
444         dirPasteFromClipboard.assertVisible();
445         dirPasteFromClipboard.assertDisabled();
446         dirCreateDir.assertVisible();
447         dirCreateDir.assertDisabled();
448     }
449 
450     @Test
testContextMenu_EmptyArea_CantCreateDoc()451     public void testContextMenu_EmptyArea_CantCreateDoc() {
452         dirDetails.hasItemsToPaste = true;
453         dirDetails.canCreateDoc = false;
454 
455         mgr.updateContextMenuForContainer(testMenu);
456 
457         dirSelectAll.assertVisible();
458         dirSelectAll.assertEnabled();
459         dirPasteFromClipboard.assertVisible();
460         dirPasteFromClipboard.assertDisabled();
461         dirCreateDir.assertVisible();
462         dirCreateDir.assertDisabled();
463     }
464 
465     @Test
testContextMenu_EmptyArea_CanPaste()466     public void testContextMenu_EmptyArea_CanPaste() {
467         dirDetails.hasItemsToPaste = true;
468         dirDetails.canCreateDoc = true;
469 
470         mgr.updateContextMenuForContainer(testMenu);
471 
472         dirSelectAll.assertVisible();
473         dirSelectAll.assertEnabled();
474         dirPasteFromClipboard.assertVisible();
475         dirPasteFromClipboard.assertEnabled();
476         dirCreateDir.assertVisible();
477         dirCreateDir.assertDisabled();
478     }
479 
480     @Test
testContextMenu_EmptyArea_CanCreateDirectory()481     public void testContextMenu_EmptyArea_CanCreateDirectory() {
482         dirDetails.canCreateDirectory = true;
483 
484         mgr.updateContextMenuForContainer(testMenu);
485 
486         dirSelectAll.assertVisible();
487         dirSelectAll.assertEnabled();
488         dirPasteFromClipboard.assertVisible();
489         dirPasteFromClipboard.assertDisabled();
490         dirCreateDir.assertVisible();
491         dirCreateDir.assertEnabled();
492     }
493 
494     @Test
testContextMenu_OnFile()495     public void testContextMenu_OnFile() {
496         selectionDetails.size = 1;
497         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
498         dirOpen.assertVisible();
499         dirOpen.assertEnabled();
500         dirCutToClipboard.assertVisible();
501         dirCopyToClipboard.assertVisible();
502         dirRename.assertVisible();
503         dirCreateDir.assertVisible();
504         dirDelete.assertVisible();
505     }
506 
507     @Test
testContextMenu_OnFile_CanOpenWith()508     public void testContextMenu_OnFile_CanOpenWith() {
509         selectionDetails.canOpenWith = true;
510         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
511         dirOpenWith.assertVisible();
512         dirOpenWith.assertEnabled();
513     }
514 
515     @Test
testContextMenu_OnFile_NoOpenWith()516     public void testContextMenu_OnFile_NoOpenWith() {
517         selectionDetails.canOpenWith = false;
518         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
519         dirOpenWith.assertVisible();
520         dirOpenWith.assertDisabled();
521     }
522 
523     @Test
testContextMenu_OnMultipleFiles()524     public void testContextMenu_OnMultipleFiles() {
525         selectionDetails.size = 3;
526         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
527         dirOpen.assertVisible();
528         dirOpen.assertDisabled();
529     }
530 
531     @Test
testContextMenu_OnWritableDirectory()532     public void testContextMenu_OnWritableDirectory() {
533         selectionDetails.size = 1;
534         selectionDetails.canPasteInto = true;
535         dirDetails.hasItemsToPaste = true;
536         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
537         dirOpenInNewWindow.assertVisible();
538         dirOpenInNewWindow.assertEnabled();
539         dirCutToClipboard.assertVisible();
540         dirCopyToClipboard.assertVisible();
541         dirPasteIntoFolder.assertVisible();
542         dirPasteIntoFolder.assertEnabled();
543         dirRename.assertVisible();
544         dirDelete.assertVisible();
545     }
546 
547     @Test
testContextMenu_OnNonWritableDirectory()548     public void testContextMenu_OnNonWritableDirectory() {
549         selectionDetails.size = 1;
550         selectionDetails.canPasteInto = false;
551         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
552         dirOpenInNewWindow.assertVisible();
553         dirOpenInNewWindow.assertEnabled();
554         dirCutToClipboard.assertVisible();
555         dirCopyToClipboard.assertVisible();
556         dirPasteIntoFolder.assertVisible();
557         dirPasteIntoFolder.assertDisabled();
558         dirRename.assertVisible();
559         dirDelete.assertVisible();
560     }
561 
562     @Test
testContextMenu_OnWritableDirectory_NothingToPaste()563     public void testContextMenu_OnWritableDirectory_NothingToPaste() {
564         selectionDetails.canPasteInto = true;
565         selectionDetails.size = 1;
566         dirDetails.hasItemsToPaste = false;
567         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
568         dirPasteIntoFolder.assertVisible();
569         dirPasteIntoFolder.assertDisabled();
570     }
571 
572     @Test
testContextMenu_OnMultipleDirectories()573     public void testContextMenu_OnMultipleDirectories() {
574         selectionDetails.size = 3;
575         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
576         dirOpenInNewWindow.assertVisible();
577         dirOpenInNewWindow.assertDisabled();
578     }
579 
580     @Test
testContextMenu_OnMixedDocs()581     public void testContextMenu_OnMixedDocs() {
582         selectionDetails.containDirectories = true;
583         selectionDetails.containFiles = true;
584         selectionDetails.size = 2;
585         selectionDetails.canDelete = true;
586         mgr.updateContextMenu(testMenu, selectionDetails);
587         dirCutToClipboard.assertVisible();
588         dirCutToClipboard.assertEnabled();
589         dirCopyToClipboard.assertVisible();
590         dirCopyToClipboard.assertEnabled();
591         dirDelete.assertVisible();
592         dirDelete.assertEnabled();
593     }
594 
595     @Test
testContextMenu_OnMixedDocs_hasPartialFile()596     public void testContextMenu_OnMixedDocs_hasPartialFile() {
597         selectionDetails.containDirectories = true;
598         selectionDetails.containFiles = true;
599         selectionDetails.size = 2;
600         selectionDetails.containPartial = true;
601         selectionDetails.canDelete = true;
602         mgr.updateContextMenu(testMenu, selectionDetails);
603         dirCutToClipboard.assertVisible();
604         dirCutToClipboard.assertDisabled();
605         dirCopyToClipboard.assertVisible();
606         dirCopyToClipboard.assertDisabled();
607         dirDelete.assertVisible();
608         dirDelete.assertEnabled();
609     }
610 
611     @Test
testContextMenu_OnMixedDocs_hasUndeletableFile()612     public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
613         selectionDetails.containDirectories = true;
614         selectionDetails.containFiles = true;
615         selectionDetails.size = 2;
616         selectionDetails.canDelete = false;
617         mgr.updateContextMenu(testMenu, selectionDetails);
618         dirCutToClipboard.assertVisible();
619         dirCutToClipboard.assertDisabled();
620         dirCopyToClipboard.assertVisible();
621         dirCopyToClipboard.assertEnabled();
622         dirDelete.assertVisible();
623         dirDelete.assertDisabled();
624     }
625 
626     @Test
testRootContextMenu()627     public void testRootContextMenu() {
628         testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
629 
630         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
631 
632         rootEjectRoot.assertInvisible();
633 
634         rootOpenInNewWindow.assertVisible();
635         rootOpenInNewWindow.assertEnabled();
636 
637         rootPasteIntoFolder.assertVisible();
638         rootPasteIntoFolder.assertDisabled();
639 
640         rootSettings.assertVisible();
641         rootSettings.assertDisabled();
642     }
643 
644     @Test
testRootContextMenu_HasRootSettings()645     public void testRootContextMenu_HasRootSettings() {
646         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
647         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
648 
649         rootSettings.assertEnabled();
650     }
651 
652     @Test
testRootContextMenu_NonWritableRoot()653     public void testRootContextMenu_NonWritableRoot() {
654         dirDetails.hasItemsToPaste = true;
655         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
656 
657         rootPasteIntoFolder.assertVisible();
658         rootPasteIntoFolder.assertDisabled();
659     }
660 
661     @Test
testRootContextMenu_NothingToPaste()662     public void testRootContextMenu_NothingToPaste() {
663         testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
664         testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
665         dirDetails.hasItemsToPaste = false;
666         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
667 
668         rootPasteIntoFolder.assertVisible();
669         rootPasteIntoFolder.assertDisabled();
670     }
671 
672     @Test
testRootContextMenu_PasteIntoWritableRoot()673     public void testRootContextMenu_PasteIntoWritableRoot() {
674         testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
675         testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
676         dirDetails.hasItemsToPaste = true;
677         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
678 
679         rootPasteIntoFolder.assertVisible();
680         rootPasteIntoFolder.assertEnabled();
681     }
682 
683     @Test
testRootContextMenu_Eject()684     public void testRootContextMenu_Eject() {
685         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
686         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
687 
688         rootEjectRoot.assertEnabled();
689     }
690 
691     @Test
testRootContextMenu_EjectInProcess()692     public void testRootContextMenu_EjectInProcess() {
693         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
694         testRootInfo.ejecting = true;
695         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
696 
697         rootEjectRoot.assertDisabled();
698     }
699 }
700