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