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 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