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.widget.cts;
     18 
     19 import com.android.cts.widget.R;
     20 
     21 
     22 import org.xmlpull.v1.XmlPullParser;
     23 
     24 import android.content.Context;
     25 import android.database.DataSetObserver;
     26 import android.graphics.Rect;
     27 import android.os.Parcelable;
     28 import android.test.ActivityInstrumentationTestCase2;
     29 import android.test.UiThreadTest;
     30 import android.util.AttributeSet;
     31 import android.util.Xml;
     32 import android.view.View;
     33 import android.view.ViewGroup;
     34 import android.widget.AbsSpinner;
     35 import android.widget.AdapterView;
     36 import android.widget.ArrayAdapter;
     37 import android.widget.Gallery;
     38 import android.widget.ImageView;
     39 import android.widget.Spinner;
     40 import android.widget.SpinnerAdapter;
     41 
     42 public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutCtsActivity> {
     43     private Context mContext;
     44 
     45     public AbsSpinnerTest() {
     46         super("com.android.cts.widget", RelativeLayoutCtsActivity.class);
     47     }
     48 
     49     @Override
     50     protected void setUp() throws Exception {
     51         super.setUp();
     52         mContext = getInstrumentation().getTargetContext();
     53     }
     54 
     55     @UiThreadTest
     56     public void testConstructor() {
     57         new Spinner(mContext);
     58 
     59         new Spinner(mContext, null);
     60 
     61         new Spinner(mContext, null, android.R.attr.spinnerStyle);
     62 
     63         new Gallery(mContext);
     64         new Gallery(mContext, null);
     65         new Gallery(mContext, null, 0);
     66 
     67         XmlPullParser parser = mContext.getResources().getXml(R.layout.gallery_test);
     68         AttributeSet attrs = Xml.asAttributeSet(parser);
     69         new Gallery(mContext, attrs);
     70         new Gallery(mContext, attrs, 0);
     71     }
     72 
     73     @UiThreadTest
     74     /**
     75      * Check points:
     76      * 1. Jump to the specific item.
     77      */
     78     public void testSetSelectionIntBoolean() {
     79         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
     80         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
     81                 com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
     82         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
     83         absSpinner.setAdapter(adapter);
     84         assertEquals(0, absSpinner.getSelectedItemPosition());
     85 
     86         absSpinner.setSelection(1, true);
     87         assertEquals(1, absSpinner.getSelectedItemPosition());
     88 
     89         absSpinner.setSelection(absSpinner.getCount() - 1, false);
     90         assertEquals(absSpinner.getCount() - 1, absSpinner.getSelectedItemPosition());
     91 
     92         // The animation effect depends on implementation in AbsSpinner's subClass.
     93         // It is not meaningful to check it.
     94     }
     95 
     96     @UiThreadTest
     97     /**
     98      * Check points:
     99      * 1. the currently selected item should be the one which set using this method.
    100      */
    101     public void testSetSelectionInt() {
    102         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
    103         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
    104                 com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
    105         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    106         absSpinner.setAdapter(adapter);
    107         assertEquals(0, absSpinner.getSelectedItemPosition());
    108 
    109         absSpinner.setSelection(1);
    110         assertEquals(1, absSpinner.getSelectedItemPosition());
    111 
    112         absSpinner.setSelection(absSpinner.getCount() - 1);
    113         assertEquals(absSpinner.getCount() - 1, absSpinner.getSelectedItemPosition());
    114     }
    115 
    116     @UiThreadTest
    117     /**
    118      * Check points:
    119      * 1. the adapter returned from getAdapter() should be the one specified using setAdapter().
    120      * 2. the adapter provides methods to transform spinner items based on their position
    121      * relative to the selected item.
    122      */
    123     public void testAccessAdapter() {
    124         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
    125         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
    126                 com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
    127         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    128 
    129         absSpinner.setAdapter(adapter);
    130         assertSame(adapter, absSpinner.getAdapter());
    131         assertEquals(adapter.getCount(), absSpinner.getCount());
    132         assertEquals(0, absSpinner.getSelectedItemPosition());
    133         assertEquals(adapter.getItemId(0), absSpinner.getSelectedItemId());
    134         absSpinner.setSelection(1);
    135         assertEquals(1, absSpinner.getSelectedItemPosition());
    136         assertEquals(adapter.getItemId(1), absSpinner.getSelectedItemId());
    137 
    138         // issue 1695243, if adapter is null, NullPointerException will be thrown when do layout.
    139         // There is neither limit in code nor description about it in javadoc.
    140     }
    141 
    142     @UiThreadTest
    143     public void testRequestLayout() {
    144         AbsSpinner absSpinner = new Spinner(mContext);
    145         absSpinner.layout(0, 0, 200, 300);
    146         assertFalse(absSpinner.isLayoutRequested());
    147 
    148         absSpinner.requestLayout();
    149         assertTrue(absSpinner.isLayoutRequested());
    150     }
    151 
    152     @UiThreadTest
    153     /**
    154      * Check points:
    155      * 1. The value returned from getCount() equals the count of Adapter associated with
    156      * this AdapterView.
    157      */
    158     public void testGetCount() {
    159         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
    160 
    161         ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(mContext,
    162                 com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
    163 
    164         absSpinner.setAdapter(adapter1);
    165         assertEquals(adapter1.getCount(), absSpinner.getCount());
    166 
    167         CharSequence anotherStringArray[] = { "another array string 1", "another array string 2" };
    168         ArrayAdapter<CharSequence> adapter2 = new ArrayAdapter<CharSequence>(mContext,
    169                 android.R.layout.simple_spinner_item, anotherStringArray);
    170 
    171         absSpinner.setAdapter(adapter2);
    172         assertEquals(anotherStringArray.length, absSpinner.getCount());
    173     }
    174 
    175     /**
    176      * Check points:
    177      * 1. Should return the position of the item which contains the specified point.
    178      * 2. Should return INVALID_POSITION if the point does not intersect an item
    179      */
    180     @UiThreadTest
    181     public void testPointToPosition() {
    182         AbsSpinner absSpinner = new Gallery(mContext);
    183         MockSpinnerAdapter adapter = new MockSpinnerAdapter();
    184         assertEquals(AdapterView.INVALID_POSITION, absSpinner.pointToPosition(10, 10));
    185 
    186         adapter.setCount(3);
    187         absSpinner.setAdapter(adapter);
    188         absSpinner.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    189         Rect rc = new Rect(0, 0, 100, 100);
    190         Rect rcChild0 = new Rect(0, 0, 20, rc.bottom);
    191         Rect rcChild1 = new Rect(rcChild0.right, 0, 70, rc.bottom);
    192         Rect rcChild2 = new Rect(rcChild1.right, 0, rc.right, rc.bottom);
    193         absSpinner.layout(rc.left, rc.top, rc.right, rc.bottom);
    194         absSpinner.getChildAt(0).layout(rcChild0.left, rcChild0.top,
    195                 rcChild0.right, rcChild0.bottom);
    196         absSpinner.getChildAt(1).layout(rcChild1.left, rcChild1.top,
    197                 rcChild1.right, rcChild1.bottom);
    198         absSpinner.getChildAt(2).layout(rcChild2.left, rcChild2.top,
    199                 rcChild2.right, rcChild2.bottom);
    200 
    201         assertEquals(AdapterView.INVALID_POSITION, absSpinner.pointToPosition(-1, -1));
    202         assertEquals(0, absSpinner.pointToPosition(rcChild0.left + 1, rc.bottom - 1));
    203         assertEquals(1, absSpinner.pointToPosition(rcChild1.left + 1, rc.bottom - 1));
    204         assertEquals(2, absSpinner.pointToPosition(rcChild2.left + 1, rc.bottom - 1));
    205         assertEquals(AdapterView.INVALID_POSITION,
    206                 absSpinner.pointToPosition(rc.right + 1, rc.bottom - 1));
    207 
    208     }
    209 
    210     /**
    211      * Check points:
    212      * 1. Should return the view corresponding to the currently selected item.
    213      * 2. Should return null if nothing is selected.
    214      */
    215     @UiThreadTest
    216     public void testGetSelectedView() {
    217         AbsSpinner absSpinner = new Gallery(mContext);
    218         MockSpinnerAdapter adapter = new MockSpinnerAdapter();
    219         assertNull(absSpinner.getSelectedView());
    220 
    221         absSpinner.setAdapter(adapter);
    222         absSpinner.layout(0, 0, 20, 20);
    223         assertSame(absSpinner.getChildAt(0), absSpinner.getSelectedView());
    224 
    225         absSpinner.setSelection(1, true);
    226         assertSame(absSpinner.getChildAt(1), absSpinner.getSelectedView());
    227 
    228     }
    229 
    230     @UiThreadTest
    231     /**
    232      * Check points:
    233      * 1. the view's current state saved by onSaveInstanceState() should be correctly restored
    234      * after onRestoreInstanceState().
    235      */
    236     public void testOnSaveAndRestoreInstanceState() {
    237         AbsSpinner absSpinner = (AbsSpinner) getActivity().findViewById(R.id.spinner1);
    238         ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mContext,
    239                 com.android.cts.widget.R.array.string, android.R.layout.simple_spinner_item);
    240         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    241         absSpinner.setAdapter(adapter);
    242         assertEquals(0, absSpinner.getSelectedItemPosition());
    243         assertEquals(adapter.getItemId(0), absSpinner.getSelectedItemId());
    244         Parcelable parcelable = absSpinner.onSaveInstanceState();
    245 
    246         absSpinner.setSelection(1);
    247         assertEquals(1, absSpinner.getSelectedItemPosition());
    248         assertEquals(adapter.getItemId(1), absSpinner.getSelectedItemId());
    249 
    250         absSpinner.onRestoreInstanceState(parcelable);
    251         absSpinner.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY);
    252         absSpinner.layout(absSpinner.getLeft(), absSpinner.getTop(), absSpinner.getRight(),
    253                 absSpinner.getBottom());
    254         assertEquals(0, absSpinner.getSelectedItemPosition());
    255         assertEquals(adapter.getItemId(0), absSpinner.getSelectedItemId());
    256     }
    257 
    258     public void testGenerateDefaultLayoutParams() {
    259 //        final MockSpinner absSpinner = new MockSpinner(mContext);
    260 //        LayoutParams layoutParams = (LayoutParams) absSpinner.generateDefaultLayoutParams();
    261 //        assertEquals(LayoutParams.MATCH_PARENT, layoutParams.width);
    262 //        assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.height);
    263     }
    264 
    265     public void testOnMeasure() {
    266         // onMeasure() is implementation details, do NOT test
    267     }
    268 
    269     /*
    270      * The Mock class of SpinnerAdapter to be used in test.
    271      */
    272     private class MockSpinnerAdapter implements SpinnerAdapter {
    273         public static final int DEFAULT_COUNT = 1;
    274         private int mCount = DEFAULT_COUNT;
    275 
    276         public View getDropDownView(int position, View convertView,
    277                 ViewGroup parent) {
    278             return null;
    279         }
    280 
    281         public int getCount() {
    282             return mCount;
    283         }
    284 
    285         public void setCount(int count) {
    286             mCount = count;
    287         }
    288 
    289         public Object getItem(int position) {
    290             return null;
    291         }
    292 
    293         public long getItemId(int position) {
    294             return position;
    295         }
    296 
    297         public int getItemViewType(int position) {
    298             return 0;
    299         }
    300 
    301         public View getView(int position, View convertView, ViewGroup parent) {
    302             return new ImageView(mContext);
    303         }
    304 
    305         public int getViewTypeCount() {
    306             return 0;
    307         }
    308 
    309         public boolean hasStableIds() {
    310             return false;
    311         }
    312 
    313         public boolean isEmpty() {
    314             return false;
    315         }
    316 
    317         public void registerDataSetObserver(DataSetObserver observer) {
    318         }
    319 
    320         public void unregisterDataSetObserver(DataSetObserver observer) {
    321         }
    322     }
    323 }
    324