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