Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2008 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 android.view.cts;
     18 
     19 import static org.junit.Assert.assertEquals;
     20 import static org.junit.Assert.assertFalse;
     21 import static org.junit.Assert.assertNotNull;
     22 import static org.junit.Assert.assertNull;
     23 import static org.junit.Assert.assertTrue;
     24 
     25 import android.app.Activity;
     26 import android.content.res.Resources;
     27 import android.graphics.Bitmap;
     28 import android.graphics.ImageDecoder;
     29 import android.graphics.drawable.BitmapDrawable;
     30 import android.support.test.annotation.UiThreadTest;
     31 import android.support.test.filters.MediumTest;
     32 import android.support.test.rule.ActivityTestRule;
     33 import android.support.test.runner.AndroidJUnit4;
     34 import android.view.KeyEvent;
     35 import android.view.Menu;
     36 import android.view.MenuInflater;
     37 import android.view.MenuItem;
     38 import android.view.SubMenu;
     39 import android.widget.PopupMenu;
     40 
     41 import com.android.compatibility.common.util.WidgetTestUtils;
     42 
     43 import junit.framework.Assert;
     44 
     45 import org.junit.Before;
     46 import org.junit.Rule;
     47 import org.junit.Test;
     48 import org.junit.runner.RunWith;
     49 
     50 /**
     51  * Test {@link MenuInflater}.
     52  */
     53 @MediumTest
     54 @RunWith(AndroidJUnit4.class)
     55 public class MenuInflaterTest {
     56     private Activity mActivity;
     57     private MenuInflater mMenuInflater;
     58     private Menu mMenu;
     59 
     60     @Rule
     61     public ActivityTestRule<MockActivity> mActivityRule =
     62             new ActivityTestRule<>(MockActivity.class);
     63 
     64     @UiThreadTest
     65     @Before
     66     public void setup() {
     67         mActivity = mActivityRule.getActivity();
     68         mMenuInflater = mActivity.getMenuInflater();
     69         mMenu = new PopupMenu(mActivity, null).getMenu();
     70     }
     71 
     72     @UiThreadTest
     73     @Test
     74     public void testConstructor() {
     75         new MenuInflater(mActivity);
     76     }
     77 
     78     @UiThreadTest
     79     @Test
     80     public void testInflate() {
     81         assertEquals(0, mMenu.size());
     82 
     83         mMenuInflater.inflate(R.menu.browser, mMenu);
     84         assertEquals(1, mMenu.size());
     85     }
     86 
     87     @UiThreadTest
     88     @Test(expected=Resources.NotFoundException.class)
     89     public void testInflateInvalidId() {
     90         mMenuInflater.inflate(0, mMenu);
     91     }
     92 
     93     @UiThreadTest
     94     @Test(expected=NullPointerException.class)
     95     public void testInflateNullMenu() {
     96         mMenuInflater.inflate(R.menu.browser, null);
     97     }
     98 
     99     // Check whether the objects are created correctly from xml files
    100     @UiThreadTest
    101     @Test
    102     public void testInflateAlphabeticShortcutFromXml() {
    103         // the visibility and shortcut
    104         mMenuInflater.inflate(R.menu.visible_shortcut, mMenu);
    105 
    106         assertTrue(mMenu.findItem(R.id.visible_item).isVisible());
    107         assertEquals('a', mMenu.findItem(R.id.visible_item).getAlphabeticShortcut());
    108 
    109         assertFalse(mMenu.findItem(R.id.hidden_item).isVisible());
    110         assertEquals('b', mMenu.findItem(R.id.hidden_item).getAlphabeticShortcut());
    111 
    112         assertEquals(R.id.hidden_group, mMenu.findItem(R.id.hidden_by_group).getGroupId());
    113         assertFalse(mMenu.findItem(R.id.hidden_by_group).isVisible());
    114         assertEquals('c', mMenu.findItem(R.id.hidden_by_group).getAlphabeticShortcut());
    115     }
    116 
    117     @UiThreadTest
    118     @Test
    119     public void testInflateShortcutModifiersFromXml() {
    120         mMenuInflater.inflate(R.menu.visible_shortcut, mMenu);
    121         MenuItem mMenuItem;
    122 
    123         mMenuItem = mMenu.findItem(R.id.no_modifiers);
    124         assertEquals('d', mMenuItem.getAlphabeticShortcut());
    125         assertEquals(KeyEvent.META_CTRL_ON, mMenuItem.getAlphabeticModifiers());
    126 
    127         mMenuItem = mMenu.findItem(R.id.default_modifiers);
    128         assertEquals('e', mMenuItem.getAlphabeticShortcut());
    129         assertEquals(KeyEvent.META_CTRL_ON, mMenuItem.getAlphabeticModifiers());
    130 
    131         mMenuItem = mMenu.findItem(R.id.single_modifier);
    132         assertEquals('f', mMenuItem.getAlphabeticShortcut());
    133         assertEquals(KeyEvent.META_SHIFT_ON, mMenuItem.getAlphabeticModifiers());
    134 
    135         mMenuItem = mMenu.findItem(R.id.multiple_modifiers);
    136         assertEquals('g', mMenuItem.getAlphabeticShortcut());
    137         assertEquals(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON,
    138                 mMenuItem.getAlphabeticModifiers());
    139     }
    140 
    141     @UiThreadTest
    142     @Test
    143     public void testInflateDrawableFromXml() {
    144         // the titles and icons
    145         mMenuInflater.inflate(R.menu.title_icon, mMenu);
    146 
    147         assertEquals("Start", mMenu.findItem(R.id.start).getTitle());
    148         verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.start).getIcon(),
    149                 R.drawable.start);
    150 
    151         assertEquals("Pass", mMenu.findItem(R.id.pass).getTitle());
    152         verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.pass).getIcon(),
    153                 R.drawable.pass);
    154 
    155         assertEquals("Failed", mMenu.findItem(R.id.failed).getTitle());
    156         verifyDrawableContent((BitmapDrawable) mMenu.findItem(R.id.failed).getIcon(),
    157                 R.drawable.failed);
    158     }
    159 
    160     @UiThreadTest
    161     @Test
    162     public void testInflateOrderFromXml() {
    163         // the orders and categories
    164         mMenuInflater.inflate(R.menu.category_order, mMenu);
    165         // default category
    166         assertEquals(R.id.most_used_items, mMenu.findItem(R.id.first_most_item).getGroupId());
    167         assertEquals(1, mMenu.findItem(R.id.first_most_item).getOrder());
    168 
    169         assertEquals(R.id.most_used_items, mMenu.findItem(R.id.middle_most_item).getGroupId());
    170         assertEquals(3, mMenu.findItem(R.id.middle_most_item).getOrder());
    171 
    172         assertEquals(R.id.most_used_items, mMenu.findItem(R.id.last_most_item).getGroupId());
    173         assertEquals(5, mMenu.findItem(R.id.last_most_item).getOrder());
    174 
    175         // specific category (CATEGORY_SECONDARY)
    176         assertEquals(R.id.least_used_items, mMenu.findItem(R.id.first_least_item).getGroupId());
    177         assertEquals(Menu.CATEGORY_SECONDARY + 0, mMenu.findItem(R.id.first_least_item).getOrder());
    178 
    179         assertEquals(R.id.least_used_items, mMenu.findItem(R.id.middle_least_item).getGroupId());
    180         assertEquals(Menu.CATEGORY_SECONDARY + 2,
    181                 mMenu.findItem(R.id.middle_least_item).getOrder());
    182 
    183         assertEquals(R.id.least_used_items, mMenu.findItem(R.id.last_least_item).getGroupId());
    184         assertEquals(Menu.CATEGORY_SECONDARY + 4, mMenu.findItem(R.id.last_least_item).getOrder());
    185     }
    186 
    187     @UiThreadTest
    188     @Test
    189     public void testInflateCheckableFromXmlNone() {
    190         mMenuInflater.inflate(R.menu.checkable, mMenu);
    191 
    192         // noncheckables
    193         assertEquals(R.id.noncheckable_group,
    194                 mMenu.findItem(R.id.noncheckable_item_1).getGroupId());
    195         assertFalse(mMenu.findItem(R.id.noncheckable_item_1).isCheckable());
    196 
    197         assertEquals(R.id.noncheckable_group,
    198                 mMenu.findItem(R.id.noncheckable_item_2).getGroupId());
    199         assertFalse(mMenu.findItem(R.id.noncheckable_item_2).isCheckable());
    200 
    201         assertEquals(R.id.noncheckable_group,
    202                 mMenu.findItem(R.id.noncheckable_item_3).getGroupId());
    203         assertFalse(mMenu.findItem(R.id.noncheckable_item_3).isCheckable());
    204     }
    205 
    206     @UiThreadTest
    207     @Test
    208     public void testInflateCheckableFromXmlMultiples() {
    209         mMenuInflater.inflate(R.menu.checkable, mMenu);
    210 
    211         // multiple checkables (item 2 and item 3 are both checked)
    212         assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_1).getGroupId());
    213         assertTrue(mMenu.findItem(R.id.checkable_item_1).isCheckable());
    214         assertFalse(mMenu.findItem(R.id.checkable_item_1).isChecked());
    215 
    216         assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_3).getGroupId());
    217         assertTrue(mMenu.findItem(R.id.checkable_item_2).isCheckable());
    218         assertTrue(mMenu.findItem(R.id.checkable_item_2).isChecked());
    219 
    220         assertEquals(R.id.checkable_group, mMenu.findItem(R.id.checkable_item_2).getGroupId());
    221         assertTrue(mMenu.findItem(R.id.checkable_item_3).isCheckable());
    222         assertTrue(mMenu.findItem(R.id.checkable_item_3).isChecked());
    223 
    224         // make item 1 checked and item 2 and item 3 will remain checked
    225         mMenu.findItem(R.id.checkable_item_1).setChecked(true);
    226         assertTrue(mMenu.findItem(R.id.checkable_item_1).isChecked());
    227         assertTrue(mMenu.findItem(R.id.checkable_item_2).isChecked());
    228         assertTrue(mMenu.findItem(R.id.checkable_item_3).isChecked());
    229     }
    230 
    231     @UiThreadTest
    232     @Test
    233     public void testInflateCheckableFromXmlExclusive() {
    234         mMenuInflater.inflate(R.menu.checkable, mMenu);
    235 
    236         // exclusive checkables (only item 3 is checked)
    237         assertEquals(R.id.exclusive_checkable_group,
    238                 mMenu.findItem(R.id.exclusive_checkable_item_1).getGroupId());
    239         assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_1).isCheckable());
    240         assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_1).isChecked());
    241 
    242         assertEquals(R.id.exclusive_checkable_group,
    243                 mMenu.findItem(R.id.exclusive_checkable_item_3).getGroupId());
    244         assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_2).isCheckable());
    245         assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_2).isChecked());
    246 
    247         assertEquals(R.id.exclusive_checkable_group,
    248                 mMenu.findItem(R.id.exclusive_checkable_item_2).getGroupId());
    249         assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_3).isCheckable());
    250         assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_3).isChecked());
    251 
    252         // make item 1 checked and item 3 will be unchecked
    253         mMenu.findItem(R.id.exclusive_checkable_item_1).setChecked(true);
    254         assertTrue(mMenu.findItem(R.id.exclusive_checkable_item_1).isChecked());
    255         assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_2).isChecked());
    256         assertFalse(mMenu.findItem(R.id.exclusive_checkable_item_3).isChecked());
    257     }
    258 
    259     @UiThreadTest
    260     @Test
    261     public void testInflateCheckableFromXmlSubmenu() {
    262         mMenuInflater.inflate(R.menu.checkable, mMenu);
    263 
    264         // checkables without group (all in a sub menu)
    265         SubMenu subMenu = mMenu.findItem(R.id.submenu).getSubMenu();
    266         assertNotNull(subMenu);
    267 
    268         assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_1).isCheckable());
    269         assertFalse(subMenu.findItem(R.id.nongroup_checkable_item_1).isChecked());
    270 
    271         assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_2).isCheckable());
    272         assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_2).isChecked());
    273 
    274         assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_3).isCheckable());
    275         assertTrue(subMenu.findItem(R.id.nongroup_checkable_item_3).isChecked());
    276 
    277         // make item 1 checked and item 2 and item 3 will remain checked
    278         subMenu.findItem(R.id.nongroup_checkable_item_1).setChecked(true);
    279         assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_1).isChecked());
    280         assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_2).isChecked());
    281         assertTrue(mMenu.findItem(R.id.nongroup_checkable_item_3).isChecked());
    282     }
    283 
    284     @UiThreadTest
    285     @Test
    286     public void testInflateTooltipFromXml() {
    287         mMenuInflater.inflate(R.menu.tooltip, mMenu);
    288 
    289         MenuItem item1 = mMenu.findItem(R.id.item1);
    290         MenuItem item2 = mMenu.findItem(R.id.item2);
    291         MenuItem item3 = mMenu.findItem(R.id.item3);
    292 
    293         assertEquals("tooltip1", item1.getTooltipText());
    294 
    295         assertEquals("tooltip2", item2.getTooltipText());
    296         item2.setTooltipText(null);
    297         assertNull(item2.getTooltipText());
    298         item2.setTooltipText("tooltip2_new");
    299         assertEquals("tooltip2_new", item2.getTooltipText());
    300 
    301         assertNull(item3.getTooltipText());
    302         item3.setTooltipText("tooltip3");
    303         assertEquals("tooltip3", item3.getTooltipText());
    304     }
    305 
    306     @UiThreadTest
    307     @Test
    308     public void testInflateContentDescriptionFromXml() {
    309         mMenuInflater.inflate(R.menu.content_description, mMenu);
    310 
    311         MenuItem item1 = mMenu.findItem(R.id.item1);
    312         MenuItem item2 = mMenu.findItem(R.id.item2);
    313         MenuItem item3 = mMenu.findItem(R.id.item3);
    314 
    315         assertEquals("description1", item1.getContentDescription());
    316 
    317         assertEquals("description2", item2.getContentDescription());
    318         item2.setContentDescription(null);
    319         assertNull(item2.getContentDescription());
    320         item2.setContentDescription("description2_new");
    321         assertEquals("description2_new", item2.getContentDescription());
    322 
    323         assertNull(item3.getContentDescription());
    324         item3.setContentDescription("description3");
    325         assertEquals("description3", item3.getContentDescription());
    326     }
    327 
    328     private void verifyDrawableContent(BitmapDrawable b, int resId) {
    329         try {
    330             ImageDecoder.Source src = ImageDecoder.createSource(mActivity.getResources(), resId);
    331             Bitmap expected = ImageDecoder.decodeBitmap(src, (decoder, info, s) -> {
    332                 decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);
    333             });
    334             WidgetTestUtils.assertEquals(expected, b.getBitmap());
    335         } catch (java.io.IOException e) {
    336             Assert.fail("the resource could not be decoded");
    337         }
    338     }
    339 }
    340