• 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.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