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 android.test.AndroidTestCase;
20import android.test.suitebuilder.annotation.SmallTest;
21
22import com.android.frameworks.coretests.R;
23import com.android.internal.view.menu.MenuBuilder;
24
25import junit.framework.Assert;
26
27public class MenuTest extends AndroidTestCase {
28
29    private MenuBuilder mMenu;
30
31    public void setUp() throws Exception {
32        super.setUp();
33        mMenu = new MenuBuilder(super.getContext());
34    }
35
36    @SmallTest
37    public void testItemId() {
38        final int id = 512;
39        final MenuItem item = mMenu.add(0, id, 0, "test");
40
41        Assert.assertEquals(id, item.getItemId());
42        Assert.assertEquals(item, mMenu.findItem(id));
43        Assert.assertEquals(0, mMenu.findItemIndex(id));
44    }
45
46    @SmallTest
47    public void testGroupId() {
48        final int groupId = 541;
49        final int item1Index = 1;
50        final int item2Index = 3;
51
52        mMenu.add(0, 0, item1Index - 1, "ignore");
53        final MenuItem item = mMenu.add(groupId, 0, item1Index, "test");
54        mMenu.add(0, 0, item2Index - 1, "ignore");
55        final MenuItem item2 = mMenu.add(groupId, 0, item2Index, "test2");
56
57        Assert.assertEquals(groupId, item.getGroupId());
58        Assert.assertEquals(groupId, item2.getGroupId());
59        Assert.assertEquals(item1Index, mMenu.findGroupIndex(groupId));
60        Assert.assertEquals(item2Index, mMenu.findGroupIndex(groupId, item1Index + 1));
61    }
62
63    @SmallTest
64    public void testGroup() {
65        // This test does the following
66        //  1. Create a grouped item in the menu
67        //  2. Check that findGroupIndex() finds the grouped item.
68        //  3. Check that findGroupIndex() doesn't find a non-existent group.
69
70        final int GROUP_ONE = Menu.FIRST;
71        final int GROUP_TWO = Menu.FIRST + 1;
72
73        mMenu.add(GROUP_ONE, 0, 0, "Menu text");
74        Assert.assertEquals(mMenu.findGroupIndex(GROUP_ONE), 0);
75        Assert.assertEquals(mMenu.findGroupIndex(GROUP_TWO), -1);
76        //TODO: expand this test case to do multiple groups,
77        //adding and removing, hiding and showing, etc.
78    }
79
80    @SmallTest
81    public void testOrder() {
82        final String a = "a", b = "b", c = "c";
83        final int firstOrder = 7, midOrder = 8, lastOrder = 9;
84
85        mMenu.add(0, 0, lastOrder, c);
86        mMenu.add(0, 0, firstOrder, a);
87        mMenu.add(0, 0, midOrder, b);
88
89        Assert.assertEquals(firstOrder, mMenu.getItem(0).getOrder());
90        Assert.assertEquals(a, mMenu.getItem(0).getTitle());
91        Assert.assertEquals(midOrder, mMenu.getItem(1).getOrder());
92        Assert.assertEquals(b, mMenu.getItem(1).getTitle());
93        Assert.assertEquals(lastOrder, mMenu.getItem(2).getOrder());
94        Assert.assertEquals(c, mMenu.getItem(2).getTitle());
95    }
96
97    @SmallTest
98    public void testTitle() {
99        final String title = "test";
100        final MenuItem stringItem = mMenu.add(title);
101        final MenuItem resItem = mMenu.add(R.string.menu_test);
102
103        Assert.assertEquals(title, stringItem.getTitle());
104        Assert.assertEquals(getContext().getResources().getString(R.string.menu_test), resItem
105                .getTitle());
106    }
107
108    @SmallTest
109    public void testCheckable() {
110        final int groupId = 1;
111        final MenuItem item1 = mMenu.add(groupId, 1, 0, "item1");
112        final MenuItem item2 = mMenu.add(groupId, 2, 0, "item2");
113
114        // Set to exclusive
115        mMenu.setGroupCheckable(groupId, true, true);
116        Assert.assertTrue("Item was not set to checkable", item1.isCheckable());
117        item1.setChecked(true);
118        Assert.assertTrue("Item did not get checked", item1.isChecked());
119        Assert.assertFalse("Item was not unchecked due to exclusive checkable", item2.isChecked());
120        mMenu.findItem(2).setChecked(true);
121        Assert.assertTrue("Item did not get checked", item2.isChecked());
122        Assert.assertFalse("Item was not unchecked due to exclusive checkable", item1.isChecked());
123
124        // Multiple non-exlusive checkable items
125        mMenu.setGroupCheckable(groupId, true, false);
126        Assert.assertTrue("Item was not set to checkable", item1.isCheckable());
127        item1.setChecked(false);
128        Assert.assertFalse("Item did not get unchecked", item1.isChecked());
129        item1.setChecked(true);
130        Assert.assertTrue("Item did not get checked", item1.isChecked());
131        mMenu.findItem(2).setChecked(true);
132        Assert.assertTrue("Item did not get checked", item2.isChecked());
133        Assert.assertTrue("Item was unchecked when it shouldnt have been", item1.isChecked());
134    }
135
136    @SmallTest
137    public void testVisibility() {
138        final MenuItem item1 = mMenu.add(0, 1, 0, "item1");
139        final MenuItem item2 = mMenu.add(0, 2, 0, "item2");
140
141        // Should start as visible
142        Assert.assertTrue("Item did not start as visible", item1.isVisible());
143        Assert.assertTrue("Item did not start as visible", item2.isVisible());
144
145        // Hide
146        item1.setVisible(false);
147        Assert.assertFalse("Item did not become invisible", item1.isVisible());
148        mMenu.findItem(2).setVisible(false);
149        Assert.assertFalse("Item did not become invisible", item2.isVisible());
150    }
151
152    @SmallTest
153    public void testSubMenu() {
154        final SubMenu subMenu = mMenu.addSubMenu(0, 0, 0, "submenu");
155        final MenuItem subMenuItem = subMenu.getItem();
156        final MenuItem item1 = subMenu.add(0, 1, 0, "item1");
157        final MenuItem item2 = subMenu.add(0, 2, 0, "item2");
158
159        // findItem should recurse into submenus
160        Assert.assertEquals(item1, mMenu.findItem(1));
161        Assert.assertEquals(item2, mMenu.findItem(2));
162    }
163
164    @SmallTest
165    public void testRemove() {
166        final int groupId = 1;
167        final MenuItem item1 = mMenu.add(groupId, 1, 0, "item1");
168        final MenuItem item2 = mMenu.add(groupId, 2, 0, "item2");
169        final MenuItem item3 = mMenu.add(groupId, 3, 0, "item3");
170        final MenuItem item4 = mMenu.add(groupId, 4, 0, "item4");
171        final MenuItem item5 = mMenu.add(groupId, 5, 0, "item5");
172        final MenuItem item6 = mMenu.add(0, 6, 0, "item6");
173
174        Assert.assertEquals(item1, mMenu.findItem(1));
175        mMenu.removeItemAt(0);
176        Assert.assertNull(mMenu.findItem(1));
177
178        Assert.assertEquals(item2, mMenu.findItem(2));
179        mMenu.removeItem(2);
180        Assert.assertNull(mMenu.findItem(2));
181
182        Assert.assertEquals(item3, mMenu.findItem(3));
183        Assert.assertEquals(item4, mMenu.findItem(4));
184        Assert.assertEquals(item5, mMenu.findItem(5));
185        mMenu.removeGroup(groupId);
186        Assert.assertNull(mMenu.findItem(3));
187        Assert.assertNull(mMenu.findItem(4));
188        Assert.assertNull(mMenu.findItem(5));
189
190        Assert.assertEquals(item6, mMenu.findItem(6));
191        mMenu.clear();
192        Assert.assertNull(mMenu.findItem(6));
193    }
194
195    private KeyEvent makeKeyEvent(int keyCode, int metaState) {
196        return new KeyEvent(0L, 0L, KeyEvent.ACTION_DOWN, keyCode, 0, metaState);
197    }
198}
199