1/*
2 * Copyright (C) 2006 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 android.view;
18
19import com.android.internal.view.menu.MenuBuilder;
20
21import junit.framework.Assert;
22
23import android.test.AndroidTestCase;
24import android.test.MoreAsserts;
25import android.test.suitebuilder.annotation.LargeTest;
26import android.test.suitebuilder.annotation.SmallTest;
27import android.view.KeyEvent;
28import android.view.Menu;
29import android.view.MenuItem;
30import android.view.SubMenu;
31
32import com.android.frameworks.coretests.R;
33
34public class MenuTest extends AndroidTestCase {
35
36    private MenuBuilder mMenu;
37
38    public void setUp() throws Exception {
39        super.setUp();
40        mMenu = new MenuBuilder(super.getContext());
41    }
42
43    @SmallTest
44    public void testItemId() {
45        final int id = 512;
46        final MenuItem item = mMenu.add(0, id, 0, "test");
47
48        Assert.assertEquals(id, item.getItemId());
49        Assert.assertEquals(item, mMenu.findItem(id));
50        Assert.assertEquals(0, mMenu.findItemIndex(id));
51    }
52
53    @SmallTest
54    public void testGroupId() {
55        final int groupId = 541;
56        final int item1Index = 1;
57        final int item2Index = 3;
58
59        mMenu.add(0, 0, item1Index - 1, "ignore");
60        final MenuItem item = mMenu.add(groupId, 0, item1Index, "test");
61        mMenu.add(0, 0, item2Index - 1, "ignore");
62        final MenuItem item2 = mMenu.add(groupId, 0, item2Index, "test2");
63
64        Assert.assertEquals(groupId, item.getGroupId());
65        Assert.assertEquals(groupId, item2.getGroupId());
66        Assert.assertEquals(item1Index, mMenu.findGroupIndex(groupId));
67        Assert.assertEquals(item2Index, mMenu.findGroupIndex(groupId, item1Index + 1));
68    }
69
70    @SmallTest
71    public void testGroup() {
72        // This test does the following
73        //  1. Create a grouped item in the menu
74        //  2. Check that findGroupIndex() finds the grouped item.
75        //  3. Check that findGroupIndex() doesn't find a non-existent group.
76
77        final int GROUP_ONE = Menu.FIRST;
78        final int GROUP_TWO = Menu.FIRST + 1;
79
80        mMenu.add(GROUP_ONE, 0, 0, "Menu text");
81        Assert.assertEquals(mMenu.findGroupIndex(GROUP_ONE), 0);
82        Assert.assertEquals(mMenu.findGroupIndex(GROUP_TWO), -1);
83        //TODO: expand this test case to do multiple groups,
84        //adding and removing, hiding and showing, etc.
85    }
86
87    @SmallTest
88    public void testIsShortcutWithAlpha() throws Exception {
89        mMenu.setQwertyMode(true);
90        mMenu.add(0, 0, 0, "test").setShortcut('2', 'a');
91        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
92                                              makeKeyEvent(KeyEvent.KEYCODE_A,  0)));
93        Assert.assertFalse(mMenu.isShortcutKey(KeyEvent.KEYCODE_B,
94                                               makeKeyEvent(KeyEvent.KEYCODE_B,  0)));
95    }
96
97    @SmallTest
98    public void testIsShortcutWithNumeric() throws Exception {
99        mMenu.setQwertyMode(false);
100        mMenu.add(0, 0, 0, "test").setShortcut('2', 'a');
101        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_2,
102                                              makeKeyEvent(KeyEvent.KEYCODE_2,  0)));
103        Assert.assertFalse(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
104                                               makeKeyEvent(KeyEvent.KEYCODE_A,  0)));
105    }
106
107    @SmallTest
108    public void testIsShortcutWithAlt() throws Exception {
109        mMenu.setQwertyMode(true);
110        mMenu.add(0, 0, 0, "test").setShortcut('2', 'a');
111        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
112                                              makeKeyEvent(KeyEvent.KEYCODE_A,
113                                                           KeyEvent.META_ALT_ON)));
114        Assert.assertFalse(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
115                                              makeKeyEvent(KeyEvent.KEYCODE_A,
116                                                           KeyEvent.META_SYM_ON)));
117    }
118
119    @SmallTest
120    public void testIsNotShortcutWithShift() throws Exception {
121        mMenu.setQwertyMode(true);
122        mMenu.add(0, 0, 0, "test").setShortcut('2', 'a');
123        Assert.assertFalse(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
124                                              makeKeyEvent(KeyEvent.KEYCODE_A,
125                                                           KeyEvent.META_SHIFT_ON)));
126    }
127
128    @SmallTest
129    public void testIsNotShortcutWithSym() throws Exception {
130        mMenu.setQwertyMode(true);
131        mMenu.add(0, 0, 0, "test").setShortcut('2', 'a');
132        Assert.assertFalse(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
133                                              makeKeyEvent(KeyEvent.KEYCODE_A,
134                                                           KeyEvent.META_SYM_ON)));
135    }
136
137    @SmallTest
138    public void testIsShortcutWithUpperCaseAlpha() throws Exception {
139        mMenu.setQwertyMode(true);
140        mMenu.add(0, 0, 0, "test").setShortcut('2', 'A');
141        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_A,
142                                              makeKeyEvent(KeyEvent.KEYCODE_A,  0)));
143    }
144
145    @SmallTest
146    public void testIsShortcutWithBackspace() throws Exception {
147        mMenu.setQwertyMode(true);
148        mMenu.add(0, 0, 0, "test").setShortcut('2', '\b');
149        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_DEL,
150                                              makeKeyEvent(KeyEvent.KEYCODE_DEL,  0)));
151    }
152
153    @SmallTest
154    public void testIsShortcutWithNewline() throws Exception {
155        mMenu.setQwertyMode(true);
156        mMenu.add(0, 0, 0, "test").setShortcut('2', '\n');
157        Assert.assertTrue(mMenu.isShortcutKey(KeyEvent.KEYCODE_ENTER,
158                                              makeKeyEvent(KeyEvent.KEYCODE_ENTER,  0)));
159    }
160
161    @SmallTest
162    public void testOrder() {
163        final String a = "a", b = "b", c = "c";
164        final int firstOrder = 7, midOrder = 8, lastOrder = 9;
165
166        mMenu.add(0, 0, lastOrder, c);
167        mMenu.add(0, 0, firstOrder, a);
168        mMenu.add(0, 0, midOrder, b);
169
170        Assert.assertEquals(firstOrder, mMenu.getItem(0).getOrder());
171        Assert.assertEquals(a, mMenu.getItem(0).getTitle());
172        Assert.assertEquals(midOrder, mMenu.getItem(1).getOrder());
173        Assert.assertEquals(b, mMenu.getItem(1).getTitle());
174        Assert.assertEquals(lastOrder, mMenu.getItem(2).getOrder());
175        Assert.assertEquals(c, mMenu.getItem(2).getTitle());
176    }
177
178    @SmallTest
179    public void testTitle() {
180        final String title = "test";
181        final MenuItem stringItem = mMenu.add(title);
182        final MenuItem resItem = mMenu.add(R.string.menu_test);
183
184        Assert.assertEquals(title, stringItem.getTitle());
185        Assert.assertEquals(getContext().getResources().getString(R.string.menu_test), resItem
186                .getTitle());
187    }
188
189    @SmallTest
190    public void testCheckable() {
191        final int groupId = 1;
192        final MenuItem item1 = mMenu.add(groupId, 1, 0, "item1");
193        final MenuItem item2 = mMenu.add(groupId, 2, 0, "item2");
194
195        // Set to exclusive
196        mMenu.setGroupCheckable(groupId, true, true);
197        Assert.assertTrue("Item was not set to checkable", item1.isCheckable());
198        item1.setChecked(true);
199        Assert.assertTrue("Item did not get checked", item1.isChecked());
200        Assert.assertFalse("Item was not unchecked due to exclusive checkable", item2.isChecked());
201        mMenu.findItem(2).setChecked(true);
202        Assert.assertTrue("Item did not get checked", item2.isChecked());
203        Assert.assertFalse("Item was not unchecked due to exclusive checkable", item1.isChecked());
204
205        // Multiple non-exlusive checkable items
206        mMenu.setGroupCheckable(groupId, true, false);
207        Assert.assertTrue("Item was not set to checkable", item1.isCheckable());
208        item1.setChecked(false);
209        Assert.assertFalse("Item did not get unchecked", item1.isChecked());
210        item1.setChecked(true);
211        Assert.assertTrue("Item did not get checked", item1.isChecked());
212        mMenu.findItem(2).setChecked(true);
213        Assert.assertTrue("Item did not get checked", item2.isChecked());
214        Assert.assertTrue("Item was unchecked when it shouldnt have been", item1.isChecked());
215    }
216
217    @SmallTest
218    public void testVisibility() {
219        final MenuItem item1 = mMenu.add(0, 1, 0, "item1");
220        final MenuItem item2 = mMenu.add(0, 2, 0, "item2");
221
222        // Should start as visible
223        Assert.assertTrue("Item did not start as visible", item1.isVisible());
224        Assert.assertTrue("Item did not start as visible", item2.isVisible());
225
226        // Hide
227        item1.setVisible(false);
228        Assert.assertFalse("Item did not become invisible", item1.isVisible());
229        mMenu.findItem(2).setVisible(false);
230        Assert.assertFalse("Item did not become invisible", item2.isVisible());
231    }
232
233    @SmallTest
234    public void testSubMenu() {
235        final SubMenu subMenu = mMenu.addSubMenu(0, 0, 0, "submenu");
236        final MenuItem subMenuItem = subMenu.getItem();
237        final MenuItem item1 = subMenu.add(0, 1, 0, "item1");
238        final MenuItem item2 = subMenu.add(0, 2, 0, "item2");
239
240        // findItem should recurse into submenus
241        Assert.assertEquals(item1, mMenu.findItem(1));
242        Assert.assertEquals(item2, mMenu.findItem(2));
243    }
244
245    @SmallTest
246    public void testRemove() {
247        final int groupId = 1;
248        final MenuItem item1 = mMenu.add(groupId, 1, 0, "item1");
249        final MenuItem item2 = mMenu.add(groupId, 2, 0, "item2");
250        final MenuItem item3 = mMenu.add(groupId, 3, 0, "item3");
251        final MenuItem item4 = mMenu.add(groupId, 4, 0, "item4");
252        final MenuItem item5 = mMenu.add(groupId, 5, 0, "item5");
253        final MenuItem item6 = mMenu.add(0, 6, 0, "item6");
254
255        Assert.assertEquals(item1, mMenu.findItem(1));
256        mMenu.removeItemAt(0);
257        Assert.assertNull(mMenu.findItem(1));
258
259        Assert.assertEquals(item2, mMenu.findItem(2));
260        mMenu.removeItem(2);
261        Assert.assertNull(mMenu.findItem(2));
262
263        Assert.assertEquals(item3, mMenu.findItem(3));
264        Assert.assertEquals(item4, mMenu.findItem(4));
265        Assert.assertEquals(item5, mMenu.findItem(5));
266        mMenu.removeGroup(groupId);
267        Assert.assertNull(mMenu.findItem(3));
268        Assert.assertNull(mMenu.findItem(4));
269        Assert.assertNull(mMenu.findItem(5));
270
271        Assert.assertEquals(item6, mMenu.findItem(6));
272        mMenu.clear();
273        Assert.assertNull(mMenu.findItem(6));
274    }
275
276    private KeyEvent makeKeyEvent(int keyCode, int metaState) {
277        return new KeyEvent(0L, 0L, KeyEvent.ACTION_DOWN, keyCode, 0, metaState);
278    }
279}
280