MenuManagerTest.java revision a86732316c8fe1694f4c1702cdd6c8e0faff4e18
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.documentsui.files;
18
19import static junit.framework.Assert.assertEquals;
20import static org.junit.Assert.assertTrue;
21
22import android.provider.DocumentsContract.Document;
23import android.provider.DocumentsContract.Root;
24import android.support.test.filters.SmallTest;
25import android.support.test.runner.AndroidJUnit4;
26
27import com.android.documentsui.R;
28import com.android.documentsui.base.DocumentInfo;
29import com.android.documentsui.base.RootInfo;
30import com.android.documentsui.base.State;
31import com.android.documentsui.testing.TestDirectoryDetails;
32import com.android.documentsui.testing.TestMenu;
33import com.android.documentsui.testing.TestMenuInflater;
34import com.android.documentsui.testing.TestMenuItem;
35import com.android.documentsui.testing.TestSearchViewManager;
36import com.android.documentsui.testing.TestSelectionDetails;
37
38import org.junit.Before;
39import org.junit.Test;
40import org.junit.runner.RunWith;
41
42@RunWith(AndroidJUnit4.class)
43@SmallTest
44public final class MenuManagerTest {
45
46    private TestMenu testMenu;
47    private TestMenuItem rename;
48    private TestMenuItem selectAll;
49    private TestMenuItem moveTo;
50    private TestMenuItem copyTo;
51    private TestMenuItem share;
52    private TestMenuItem delete;
53    private TestMenuItem createDir;
54    private TestMenuItem settings;
55    private TestMenuItem newWindow;
56    private TestMenuItem open;
57    private TestMenuItem openWith;
58    private TestMenuItem openInNewWindow;
59    private TestMenuItem cut;
60    private TestMenuItem copy;
61    private TestMenuItem paste;
62    private TestMenuItem pasteInto;
63    private TestMenuItem advanced;
64    private TestMenuItem eject;
65    private TestSelectionDetails selectionDetails;
66    private TestDirectoryDetails dirDetails;
67    private TestSearchViewManager testSearchManager;
68    private RootInfo testRootInfo;
69    private DocumentInfo testDocInfo;
70    private State state = new State();
71    private MenuManager mgr;
72
73    @Before
74    public void setUp() {
75        testMenu = TestMenu.create();
76        rename = testMenu.findItem(R.id.menu_rename);
77        selectAll = testMenu.findItem(R.id.menu_select_all);
78        moveTo = testMenu.findItem(R.id.menu_move_to);
79        copyTo = testMenu.findItem(R.id.menu_copy_to);
80        share = testMenu.findItem(R.id.menu_share);
81        delete = testMenu.findItem(R.id.menu_delete);
82        createDir = testMenu.findItem(R.id.menu_create_dir);
83        settings = testMenu.findItem(R.id.menu_settings);
84        newWindow = testMenu.findItem(R.id.menu_new_window);
85        open = testMenu.findItem(R.id.menu_open);
86        openWith = testMenu.findItem(R.id.menu_open_with);
87        openInNewWindow = testMenu.findItem(R.id.menu_open_in_new_window);
88        cut = testMenu.findItem(R.id.menu_cut_to_clipboard);
89        copy = testMenu.findItem(R.id.menu_copy_to_clipboard);
90        paste = testMenu.findItem(R.id.menu_paste_from_clipboard);
91        pasteInto = testMenu.findItem(R.id.menu_paste_into_folder);
92        advanced = testMenu.findItem(R.id.menu_advanced);
93        eject = testMenu.findItem(R.id.menu_eject_root);
94
95        // These items by default are visible
96        testMenu.findItem(R.id.menu_select_all).setVisible(true);
97        testMenu.findItem(R.id.menu_list).setVisible(true);
98
99        selectionDetails = new TestSelectionDetails();
100        dirDetails = new TestDirectoryDetails();
101        testSearchManager = new TestSearchViewManager();
102        mgr = new MenuManager(testSearchManager, state, dirDetails);
103
104        testRootInfo = new RootInfo();
105        testDocInfo = new DocumentInfo();
106    }
107
108    @Test
109    public void testActionMenu() {
110        selectionDetails.canDelete = true;
111        selectionDetails.canRename = true;
112
113        mgr.updateActionMenu(testMenu, selectionDetails);
114
115        rename.assertEnabled();
116        delete.assertVisible();
117        share.assertVisible();
118        copyTo.assertEnabled();
119        moveTo.assertEnabled();
120    }
121
122    @Test
123    public void testActionMenu_containsPartial() {
124        selectionDetails.containPartial = true;
125        mgr.updateActionMenu(testMenu, selectionDetails);
126
127        rename.assertDisabled();
128        share.assertInvisible();
129        copyTo.assertDisabled();
130        moveTo.assertDisabled();
131    }
132
133    @Test
134    public void testActionMenu_cantRename() {
135        selectionDetails.canRename = false;
136        mgr.updateActionMenu(testMenu, selectionDetails);
137
138        rename.assertDisabled();
139    }
140
141    @Test
142    public void testActionMenu_cantDelete() {
143        selectionDetails.canDelete = false;
144        mgr.updateActionMenu(testMenu, selectionDetails);
145
146        delete.assertInvisible();
147        // We shouldn't be able to move files if we can't delete them
148        moveTo.assertDisabled();
149    }
150
151    @Test
152    public void testActionMenu_containsDirectory() {
153        selectionDetails.containDirectories = true;
154        mgr.updateActionMenu(testMenu, selectionDetails);
155
156        // We can't share directories
157        share.assertInvisible();
158    }
159
160    @Test
161    public void testOptionMenu() {
162        mgr.updateOptionMenu(testMenu);
163
164        advanced.assertInvisible();
165        advanced.assertTitle(R.string.menu_advanced_show);
166        createDir.assertDisabled();
167        assertTrue(testSearchManager.updateMenuCalled());
168    }
169
170    @Test
171    public void testOptionMenu_showAdvanced() {
172        state.showAdvanced = true;
173        state.showAdvancedOption = true;
174        mgr.updateOptionMenu(testMenu);
175
176        advanced.assertVisible();
177        advanced.assertTitle(R.string.menu_advanced_hide);
178    }
179
180    @Test
181    public void testOptionMenu_canCreateDirectory() {
182        dirDetails.canCreateDirectory = true;
183        mgr.updateOptionMenu(testMenu);
184
185        createDir.assertEnabled();
186    }
187
188    @Test
189    public void testOptionMenu_hasRootSettings() {
190        dirDetails.hasRootSettings = true;
191        mgr.updateOptionMenu(testMenu);
192
193        settings.assertVisible();
194    }
195
196    @Test
197    public void testOptionMenu_shouldShowFancyFeatures() {
198        dirDetails.shouldShowFancyFeatures = true;
199        mgr.updateOptionMenu(testMenu);
200
201        newWindow.assertVisible();
202    }
203
204    @Test
205    public void testInflateContextMenu_Files() {
206        TestMenuInflater inflater = new TestMenuInflater();
207
208        selectionDetails.containFiles = true;
209        selectionDetails.containDirectories = false;
210        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
211
212        assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId);
213    }
214
215    @Test
216    public void testInflateContextMenu_Dirs() {
217        TestMenuInflater inflater = new TestMenuInflater();
218
219        selectionDetails.containFiles = false;
220        selectionDetails.containDirectories = true;
221        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
222
223        assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId);
224    }
225
226    @Test
227    public void testInflateContextMenu_Mixed() {
228        TestMenuInflater inflater = new TestMenuInflater();
229
230        selectionDetails.containFiles = true;
231        selectionDetails.containDirectories = true;
232        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
233
234        assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId);
235    }
236
237    @Test
238    public void testContextMenu_EmptyArea() {
239        mgr.updateContextMenuForContainer(testMenu);
240
241        selectAll.assertVisible();
242        paste.assertVisible();
243        createDir.assertVisible();
244    }
245
246    @Test
247    public void testContextMenu_OnFile() {
248        selectionDetails.size = 1;
249        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
250        open.assertVisible();
251        open.assertEnabled();
252        openWith.assertVisible();
253        openWith.assertEnabled();
254        cut.assertVisible();
255        copy.assertVisible();
256        rename.assertVisible();
257        createDir.assertVisible();
258        delete.assertVisible();
259    }
260
261    @Test
262    public void testContextMenu_OnMultipleFiles() {
263        selectionDetails.size = 3;
264        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
265        open.assertVisible();
266        open.assertDisabled();
267        openWith.assertVisible();
268        openWith.assertDisabled();
269    }
270
271    @Test
272    public void testContextMenu_OnWritableDirectory() {
273        selectionDetails.size = 1;
274        selectionDetails.canPasteInto = true;
275        dirDetails.hasItemsToPaste = true;
276        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
277        openInNewWindow.assertVisible();
278        openInNewWindow.assertEnabled();
279        cut.assertVisible();
280        copy.assertVisible();
281        pasteInto.assertVisible();
282        pasteInto.assertEnabled();
283        rename.assertVisible();
284        delete.assertVisible();
285    }
286
287    @Test
288    public void testContextMenu_OnNonWritableDirectory() {
289        selectionDetails.size = 1;
290        selectionDetails.canPasteInto = false;
291        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
292        openInNewWindow.assertVisible();
293        openInNewWindow.assertEnabled();
294        cut.assertVisible();
295        copy.assertVisible();
296        pasteInto.assertVisible();
297        pasteInto.assertDisabled();
298        rename.assertVisible();
299        delete.assertVisible();
300    }
301
302    @Test
303    public void testContextMenu_OnWritableDirectory_NothingToPaste() {
304        selectionDetails.canPasteInto = true;
305        selectionDetails.size = 1;
306        dirDetails.hasItemsToPaste = false;
307        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
308        pasteInto.assertVisible();
309        pasteInto.assertDisabled();
310    }
311
312    @Test
313    public void testContextMenu_OnMultipleDirectories() {
314        selectionDetails.size = 3;
315        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
316        openInNewWindow.assertVisible();
317        openInNewWindow.assertDisabled();
318    }
319
320    @Test
321    public void testContextMenu_OnMixedDocs() {
322        selectionDetails.containDirectories = true;
323        selectionDetails.containFiles = true;
324        selectionDetails.size = 2;
325        selectionDetails.canDelete = true;
326        mgr.updateContextMenu(testMenu, selectionDetails);
327        cut.assertVisible();
328        cut.assertEnabled();
329        copy.assertVisible();
330        copy.assertEnabled();
331        delete.assertVisible();
332        delete.assertEnabled();
333    }
334
335    @Test
336    public void testContextMenu_OnMixedDocs_hasPartialFile() {
337        selectionDetails.containDirectories = true;
338        selectionDetails.containFiles = true;
339        selectionDetails.size = 2;
340        selectionDetails.containPartial = true;
341        selectionDetails.canDelete = true;
342        mgr.updateContextMenu(testMenu, selectionDetails);
343        cut.assertVisible();
344        cut.assertDisabled();
345        copy.assertVisible();
346        copy.assertDisabled();
347        delete.assertVisible();
348        delete.assertEnabled();
349    }
350
351    @Test
352    public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
353        selectionDetails.containDirectories = true;
354        selectionDetails.containFiles = true;
355        selectionDetails.size = 2;
356        selectionDetails.canDelete = false;
357        mgr.updateContextMenu(testMenu, selectionDetails);
358        cut.assertVisible();
359        cut.assertDisabled();
360        copy.assertVisible();
361        copy.assertEnabled();
362        delete.assertVisible();
363        delete.assertDisabled();
364    }
365
366    @Test
367    public void testRootContextMenu() {
368        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
369
370        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
371
372        eject.assertInvisible();
373
374        openInNewWindow.assertVisible();
375        openInNewWindow.assertEnabled();
376
377        pasteInto.assertVisible();
378        pasteInto.assertDisabled();
379
380        settings.assertVisible();
381        settings.assertDisabled();
382    }
383
384    @Test
385    public void testRootContextMenu_hasRootSettings() {
386        testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
387        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
388
389        settings.assertEnabled();
390    }
391
392    @Test
393    public void testRootContextMenu_nonWritableRoot() {
394        dirDetails.hasItemsToPaste = true;
395        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
396
397        pasteInto.assertVisible();
398        pasteInto.assertDisabled();
399    }
400
401    @Test
402    public void testRootContextMenu_nothingToPaste() {
403        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
404        testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
405        dirDetails.hasItemsToPaste = false;
406        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
407
408        pasteInto.assertVisible();
409        pasteInto.assertDisabled();
410    }
411
412    @Test
413    public void testRootContextMenu_pasteIntoWritableRoot() {
414        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
415        testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
416        dirDetails.hasItemsToPaste = true;
417        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
418
419        pasteInto.assertVisible();
420        pasteInto.assertEnabled();
421    }
422
423    @Test
424    public void testRootContextMenu_eject() {
425        testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
426        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
427
428        eject.assertEnabled();
429    }
430
431    @Test
432    public void testRootContextMenu_ejectInProcess() {
433        testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
434        testRootInfo.ejecting = true;
435        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
436
437        eject.assertDisabled();
438    }
439}
440