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 static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertTrue; 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.times; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.verifyNoMoreInteractions; 25 import static org.mockito.Mockito.verifyZeroInteractions; 26 27 import android.app.Activity; 28 import android.app.Instrumentation; 29 import android.support.test.InstrumentationRegistry; 30 import android.support.test.annotation.UiThreadTest; 31 import android.support.test.filters.SmallTest; 32 import android.support.test.rule.ActivityTestRule; 33 import android.support.test.runner.AndroidJUnit4; 34 import android.text.TextUtils; 35 import android.widget.RadioButton; 36 37 import com.android.compatibility.common.util.CtsTouchUtils; 38 39 import org.junit.Before; 40 import org.junit.Rule; 41 import org.junit.Test; 42 import org.junit.runner.RunWith; 43 44 @SmallTest 45 @RunWith(AndroidJUnit4.class) 46 public class RadioButtonTest { 47 private Instrumentation mInstrumentation; 48 private Activity mActivity; 49 private RadioButton mRadioButton; 50 51 @Rule 52 public ActivityTestRule<RadioButtonCtsActivity> mActivityRule = 53 new ActivityTestRule<>(RadioButtonCtsActivity.class); 54 55 @Before 56 public void setup() { 57 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 58 mActivity = mActivityRule.getActivity(); 59 mRadioButton = (RadioButton) mActivity.findViewById(R.id.radio_button); 60 } 61 62 @Test 63 public void testConstructor() { 64 new RadioButton(mActivity); 65 new RadioButton(mActivity, null); 66 new RadioButton(mActivity, null, android.R.attr.radioButtonStyle); 67 new RadioButton(mActivity, null, 0, 68 android.R.style.Widget_DeviceDefault_CompoundButton_RadioButton); 69 new RadioButton(mActivity, null, 0, 70 android.R.style.Widget_DeviceDefault_Light_CompoundButton_RadioButton); 71 new RadioButton(mActivity, null, 0, 72 android.R.style.Widget_Material_CompoundButton_RadioButton); 73 new RadioButton(mActivity, null, 0, 74 android.R.style.Widget_Material_Light_CompoundButton_RadioButton); 75 } 76 77 @Test(expected=NullPointerException.class) 78 public void testConstructorWithNullContext1() { 79 new RadioButton(null); 80 } 81 82 @Test(expected=NullPointerException.class) 83 public void testConstructorWithNullContext2() { 84 new RadioButton(null, null); 85 } 86 87 @Test(expected=NullPointerException.class) 88 public void testConstructorWithNullContext3() { 89 new RadioButton(null, null, 0); 90 } 91 92 @UiThreadTest 93 @Test 94 public void testText() { 95 assertTrue(TextUtils.equals( 96 mActivity.getString(R.string.hello_world), mRadioButton.getText())); 97 98 mRadioButton.setText("new text"); 99 assertTrue(TextUtils.equals("new text", mRadioButton.getText())); 100 101 mRadioButton.setText(R.string.text_name); 102 assertTrue(TextUtils.equals( 103 mActivity.getString(R.string.text_name), mRadioButton.getText())); 104 } 105 106 @UiThreadTest 107 @Test 108 public void testAccessChecked() { 109 final RadioButton.OnCheckedChangeListener mockCheckedChangeListener = 110 mock(RadioButton.OnCheckedChangeListener.class); 111 mRadioButton.setOnCheckedChangeListener(mockCheckedChangeListener); 112 verifyZeroInteractions(mockCheckedChangeListener); 113 114 assertFalse(mRadioButton.isChecked()); 115 116 // not checked -> not checked 117 mRadioButton.setChecked(false); 118 verifyZeroInteractions(mockCheckedChangeListener); 119 assertFalse(mRadioButton.isChecked()); 120 121 // not checked -> checked 122 mRadioButton.setChecked(true); 123 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, true); 124 assertTrue(mRadioButton.isChecked()); 125 126 // checked -> checked 127 mRadioButton.setChecked(true); 128 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, true); 129 assertTrue(mRadioButton.isChecked()); 130 131 // checked -> not checked 132 mRadioButton.setChecked(false); 133 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, false); 134 assertFalse(mRadioButton.isChecked()); 135 136 verifyNoMoreInteractions(mockCheckedChangeListener); 137 } 138 139 @UiThreadTest 140 @Test 141 public void testToggleViaApi() { 142 final RadioButton.OnCheckedChangeListener mockCheckedChangeListener = 143 mock(RadioButton.OnCheckedChangeListener.class); 144 mRadioButton.setOnCheckedChangeListener(mockCheckedChangeListener); 145 verifyZeroInteractions(mockCheckedChangeListener); 146 147 assertFalse(mRadioButton.isChecked()); 148 149 // toggle to checked 150 mRadioButton.toggle(); 151 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, true); 152 assertTrue(mRadioButton.isChecked()); 153 154 // try toggle to not checked - this should leave the radio button in checked state 155 mRadioButton.toggle(); 156 assertTrue(mRadioButton.isChecked()); 157 158 verifyNoMoreInteractions(mockCheckedChangeListener); 159 } 160 161 @Test 162 public void testToggleViaEmulatedTap() { 163 final RadioButton.OnCheckedChangeListener mockCheckedChangeListener = 164 mock(RadioButton.OnCheckedChangeListener.class); 165 mRadioButton.setOnCheckedChangeListener(mockCheckedChangeListener); 166 verifyZeroInteractions(mockCheckedChangeListener); 167 168 assertFalse(mRadioButton.isChecked()); 169 170 // tap to checked 171 CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mRadioButton); 172 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, true); 173 assertTrue(mRadioButton.isChecked()); 174 175 // tap to not checked - this should leave the radio button in checked state 176 CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mRadioButton); 177 assertTrue(mRadioButton.isChecked()); 178 179 verifyNoMoreInteractions(mockCheckedChangeListener); 180 } 181 182 @UiThreadTest 183 @Test 184 public void testToggleViaPerformClick() { 185 final RadioButton.OnCheckedChangeListener mockCheckedChangeListener = 186 mock(RadioButton.OnCheckedChangeListener.class); 187 mRadioButton.setOnCheckedChangeListener(mockCheckedChangeListener); 188 verifyZeroInteractions(mockCheckedChangeListener); 189 190 assertFalse(mRadioButton.isChecked()); 191 192 // click to checked 193 mRadioButton.performClick(); 194 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mRadioButton, true); 195 assertTrue(mRadioButton.isChecked()); 196 197 // click to not checked - this should leave the radio button in checked state 198 mRadioButton.performClick(); 199 assertTrue(mRadioButton.isChecked()); 200 201 verifyNoMoreInteractions(mockCheckedChangeListener); 202 } 203 } 204