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 android.widget.cts.R; 20 21 import android.content.Context; 22 import android.test.ActivityInstrumentationTestCase2; 23 import android.test.UiThreadTest; 24 import android.widget.RatingBar; 25 import android.widget.RatingBar.OnRatingBarChangeListener; 26 27 /** 28 * Test {@link RatingBar}. 29 */ 30 public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarCtsActivity> { 31 private Context mContext; 32 private RatingBarCtsActivity mActivity; 33 34 public RatingBarTest() { 35 super("android.widget.cts", RatingBarCtsActivity.class); 36 } 37 38 @Override 39 protected void setUp() throws Exception { 40 super.setUp(); 41 mActivity = getActivity(); 42 assertNotNull(mActivity); 43 mContext = getInstrumentation().getContext(); 44 } 45 46 public void testConstructor() { 47 new RatingBar(mContext, null, android.R.attr.ratingBarStyle); 48 49 new RatingBar(mContext, null); 50 51 new RatingBar(mContext); 52 53 RatingBar ratingBar = (RatingBar) mActivity.findViewById(R.id.ratingbar_constructor); 54 assertNotNull(ratingBar); 55 assertFalse(ratingBar.isIndicator()); 56 assertEquals(50, ratingBar.getNumStars()); 57 assertEquals(1.2f, ratingBar.getRating()); 58 assertEquals(0.2f, ratingBar.getStepSize()); 59 } 60 61 @UiThreadTest 62 public void testAccessOnRatingBarChangeListener() { 63 RatingBar ratingBar = (RatingBar)mActivity.findViewById(R.id.ratingbar_constructor); 64 65 MockOnRatingBarChangeListener listener = new MockOnRatingBarChangeListener(); 66 67 // set OnRatingBarChangeListener 68 // normal value 69 ratingBar.setOnRatingBarChangeListener(listener); 70 assertSame(listener, ratingBar.getOnRatingBarChangeListener()); 71 ratingBar.setRating(2.2f); 72 assertTrue(listener.hasCalledOnRatingChanged()); 73 74 // exceptional value 75 listener.reset(); 76 ratingBar.setOnRatingBarChangeListener(null); 77 assertNull(ratingBar.getOnRatingBarChangeListener()); 78 ratingBar.setRating(1.2f); 79 assertFalse(listener.hasCalledOnRatingChanged()); 80 } 81 82 public void testAccessIndicator() { 83 RatingBar ratingBar = new RatingBar(mContext); 84 85 ratingBar.setIsIndicator(true); 86 assertTrue(ratingBar.isIndicator()); 87 88 ratingBar.setIsIndicator(false); 89 assertFalse(ratingBar.isIndicator()); 90 } 91 92 public void testAccessNumStars() { 93 MockRatingBar mockRatingBar = new MockRatingBar(mContext); 94 95 // set NumStars 96 // normal value 97 assertFalse(mockRatingBar.hasCalledRequestLayout()); 98 mockRatingBar.setNumStars(20); 99 assertTrue(mockRatingBar.hasCalledRequestLayout()); 100 assertEquals(20, mockRatingBar.getNumStars()); 101 102 // exceptional value 103 mockRatingBar.reset(); 104 mockRatingBar.setNumStars(-10); 105 assertFalse(mockRatingBar.hasCalledRequestLayout()); 106 assertEquals(20, mockRatingBar.getNumStars()); 107 108 mockRatingBar.reset(); 109 mockRatingBar.setNumStars(Integer.MAX_VALUE); 110 assertTrue(mockRatingBar.hasCalledRequestLayout()); 111 assertEquals(Integer.MAX_VALUE, mockRatingBar.getNumStars()); 112 } 113 114 public void testAccessRating() { 115 RatingBar ratingBar = new RatingBar(mContext); 116 117 // set Rating 118 // normal value 119 ratingBar.setRating(2.0f); 120 assertEquals(2.0f, ratingBar.getRating()); 121 122 // exceptional value 123 ratingBar.setRating(-2.0f); 124 assertEquals(0f, ratingBar.getRating()); 125 126 ratingBar.setRating(Float.MAX_VALUE); 127 assertEquals((float) ratingBar.getNumStars(), ratingBar.getRating()); 128 } 129 130 public void testSetMax() { 131 RatingBar ratingBar = new RatingBar(mContext); 132 133 // normal value 134 ratingBar.setMax(10); 135 assertEquals(10, ratingBar.getMax()); 136 137 ratingBar.setProgress(10); 138 139 // exceptional values 140 ratingBar.setMax(-10); 141 assertEquals(10, ratingBar.getMax()); 142 assertEquals(10, ratingBar.getProgress()); 143 144 ratingBar.setMax(Integer.MAX_VALUE); 145 assertEquals(Integer.MAX_VALUE, ratingBar.getMax()); 146 } 147 148 public void testAccessStepSize() { 149 RatingBar ratingBar = new RatingBar(mContext); 150 151 // normal value 152 ratingBar.setStepSize(1.5f); 153 float expectedMax = ratingBar.getNumStars() / ratingBar.getStepSize(); 154 float expectedProgress = expectedMax / ratingBar.getMax() * ratingBar.getProgress(); 155 assertEquals((int) expectedMax, ratingBar.getMax()); 156 assertEquals((int) expectedProgress, ratingBar.getProgress()); 157 assertEquals((float) ratingBar.getNumStars() / (int) (ratingBar.getNumStars() / 1.5f), 158 ratingBar.getStepSize()); 159 160 int currentMax = ratingBar.getMax(); 161 int currentProgress = ratingBar.getProgress(); 162 float currentStepSize = ratingBar.getStepSize(); 163 // exceptional value 164 ratingBar.setStepSize(-1.5f); 165 assertEquals(currentMax, ratingBar.getMax()); 166 assertEquals(currentProgress, ratingBar.getProgress()); 167 assertEquals(currentStepSize, ratingBar.getStepSize()); 168 169 ratingBar.setStepSize(0f); 170 assertEquals(currentMax, ratingBar.getMax()); 171 assertEquals(currentProgress, ratingBar.getProgress()); 172 assertEquals(currentStepSize, ratingBar.getStepSize()); 173 174 ratingBar.setStepSize(ratingBar.getNumStars() + 0.1f); 175 assertEquals(currentMax, ratingBar.getMax()); 176 assertEquals(currentProgress, ratingBar.getProgress()); 177 assertEquals(currentStepSize, ratingBar.getStepSize()); 178 179 ratingBar.setStepSize(Float.MAX_VALUE); 180 assertEquals(currentMax, ratingBar.getMax()); 181 assertEquals(currentProgress, ratingBar.getProgress()); 182 assertEquals(currentStepSize, ratingBar.getStepSize()); 183 } 184 185 /** 186 * The listener interface for receiving OnRatingBarChangeListener events. 187 * The class that is interested in processing a OnRatingBarChangeListener 188 * event implements this interface, and the object created with that class 189 * is registered with a component using the component's 190 * <code>setOnRatingBarChangeListener<code> method. When 191 * the OnRatingBarChangeListener event occurs, that object's appropriate 192 * method is invoked. 193 */ 194 private class MockOnRatingBarChangeListener implements OnRatingBarChangeListener { 195 private boolean mCalledOnRatingChanged = false; 196 197 boolean hasCalledOnRatingChanged() { 198 return mCalledOnRatingChanged; 199 } 200 201 /* 202 * (non-Javadoc) 203 * @see android.widget.RadioGroup.OnRatingBarChangeListener#onRatingChanged 204 * (RatingBar ratingBar, float rating, boolean fromTouch) 205 */ 206 public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromTouch) { 207 mCalledOnRatingChanged = true; 208 } 209 210 public void reset() { 211 mCalledOnRatingChanged = false; 212 } 213 } 214 215 /* 216 * Mock class for ProgressBar to test protected methods 217 */ 218 private class MockRatingBar extends RatingBar { 219 public MockRatingBar(Context context) { 220 super(context); 221 } 222 223 private boolean mCalledOnMeasure = false; 224 private boolean mCalledRequestLayout = false; 225 226 public boolean hasCalledOnMeasure() { 227 return mCalledOnMeasure; 228 } 229 230 @Override 231 protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 232 mCalledOnMeasure = true; 233 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 234 } 235 236 public void requestLayout() { 237 mCalledRequestLayout = true; 238 super.requestLayout(); 239 } 240 241 public boolean hasCalledRequestLayout() { 242 return mCalledRequestLayout; 243 } 244 245 public void reset() { 246 mCalledOnMeasure = false; 247 mCalledRequestLayout = false; 248 } 249 } 250 } 251