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.CheckBox; 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 CheckBoxTest { 47 private Instrumentation mInstrumentation; 48 private Activity mActivity; 49 private CheckBox mCheckBox; 50 51 @Rule 52 public ActivityTestRule<CheckBoxCtsActivity> mActivityRule = 53 new ActivityTestRule<>(CheckBoxCtsActivity.class); 54 55 @Before 56 public void setup() { 57 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 58 mActivity = mActivityRule.getActivity(); 59 mCheckBox = (CheckBox) mActivity.findViewById(R.id.check_box); 60 } 61 62 @Test 63 public void testConstructor() { 64 new CheckBox(mActivity); 65 new CheckBox(mActivity, null); 66 new CheckBox(mActivity, null, android.R.attr.checkboxStyle); 67 new CheckBox(mActivity, null, 0, 68 android.R.style.Widget_DeviceDefault_CompoundButton_CheckBox); 69 new CheckBox(mActivity, null, 0, 70 android.R.style.Widget_DeviceDefault_Light_CompoundButton_CheckBox); 71 new CheckBox(mActivity, null, 0, 72 android.R.style.Widget_Material_CompoundButton_CheckBox); 73 new CheckBox(mActivity, null, 0, 74 android.R.style.Widget_Material_Light_CompoundButton_CheckBox); 75 } 76 77 @Test(expected=NullPointerException.class) 78 public void testConstructorWithNullContext1() { 79 new CheckBox(null); 80 } 81 82 @Test(expected=NullPointerException.class) 83 public void testConstructorWithNullContext2() { 84 new CheckBox(null, null); 85 } 86 87 @Test(expected=NullPointerException.class) 88 public void testConstructorWithNullContext3() { 89 new CheckBox(null, null, -1); 90 } 91 92 @UiThreadTest 93 @Test 94 public void testText() { 95 assertTrue(TextUtils.equals( 96 mActivity.getString(R.string.hello_world), mCheckBox.getText())); 97 98 mCheckBox.setText("new text"); 99 assertTrue(TextUtils.equals("new text", mCheckBox.getText())); 100 101 mCheckBox.setText(R.string.text_name); 102 assertTrue(TextUtils.equals(mActivity.getString(R.string.text_name), mCheckBox.getText())); 103 } 104 105 @UiThreadTest 106 @Test 107 public void testAccessChecked() { 108 final CheckBox.OnCheckedChangeListener mockCheckedChangeListener = 109 mock(CheckBox.OnCheckedChangeListener.class); 110 mCheckBox.setOnCheckedChangeListener(mockCheckedChangeListener); 111 verifyZeroInteractions(mockCheckedChangeListener); 112 113 assertFalse(mCheckBox.isChecked()); 114 115 // not checked -> not checked 116 mCheckBox.setChecked(false); 117 verifyZeroInteractions(mockCheckedChangeListener); 118 assertFalse(mCheckBox.isChecked()); 119 120 // not checked -> checked 121 mCheckBox.setChecked(true); 122 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, true); 123 assertTrue(mCheckBox.isChecked()); 124 125 // checked -> checked 126 mCheckBox.setChecked(true); 127 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, true); 128 assertTrue(mCheckBox.isChecked()); 129 130 // checked -> not checked 131 mCheckBox.setChecked(false); 132 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, false); 133 assertFalse(mCheckBox.isChecked()); 134 135 verifyNoMoreInteractions(mockCheckedChangeListener); 136 } 137 138 @UiThreadTest 139 @Test 140 public void testToggleViaApi() { 141 final CheckBox.OnCheckedChangeListener mockCheckedChangeListener = 142 mock(CheckBox.OnCheckedChangeListener.class); 143 mCheckBox.setOnCheckedChangeListener(mockCheckedChangeListener); 144 verifyZeroInteractions(mockCheckedChangeListener); 145 146 assertFalse(mCheckBox.isChecked()); 147 148 // toggle to checked 149 mCheckBox.toggle(); 150 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, true); 151 assertTrue(mCheckBox.isChecked()); 152 153 // toggle to not checked 154 mCheckBox.toggle(); 155 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, false); 156 assertFalse(mCheckBox.isChecked()); 157 158 verifyNoMoreInteractions(mockCheckedChangeListener); 159 } 160 161 @Test 162 public void testToggleViaEmulatedTap() { 163 final CheckBox.OnCheckedChangeListener mockCheckedChangeListener = 164 mock(CheckBox.OnCheckedChangeListener.class); 165 mCheckBox.setOnCheckedChangeListener(mockCheckedChangeListener); 166 verifyZeroInteractions(mockCheckedChangeListener); 167 168 assertFalse(mCheckBox.isChecked()); 169 170 // tap to checked 171 CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mCheckBox); 172 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, true); 173 assertTrue(mCheckBox.isChecked()); 174 175 // tap to not checked 176 CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mCheckBox); 177 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, false); 178 assertFalse(mCheckBox.isChecked()); 179 180 verifyNoMoreInteractions(mockCheckedChangeListener); 181 } 182 183 @UiThreadTest 184 @Test 185 public void testToggleViaPerformClick() { 186 final CheckBox.OnCheckedChangeListener mockCheckedChangeListener = 187 mock(CheckBox.OnCheckedChangeListener.class); 188 mCheckBox.setOnCheckedChangeListener(mockCheckedChangeListener); 189 verifyZeroInteractions(mockCheckedChangeListener); 190 191 assertFalse(mCheckBox.isChecked()); 192 193 // click to checked 194 mCheckBox.performClick(); 195 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, true); 196 assertTrue(mCheckBox.isChecked()); 197 198 // click to not checked 199 mCheckBox.performClick(); 200 verify(mockCheckedChangeListener, times(1)).onCheckedChanged(mCheckBox, false); 201 assertFalse(mCheckBox.isChecked()); 202 203 verifyNoMoreInteractions(mockCheckedChangeListener); 204 } 205 } 206