1 /* 2 * Copyright (C) 2019 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 com.android.settings.widget; 18 19 import static android.view.View.GONE; 20 import static android.view.View.VISIBLE; 21 22 import static com.google.common.truth.Truth.assertThat; 23 import static com.google.common.truth.Truth.assertWithMessage; 24 25 import android.content.Context; 26 import android.view.View; 27 import android.widget.Button; 28 29 import androidx.preference.PreferenceViewHolder; 30 import androidx.test.core.app.ApplicationProvider; 31 32 import com.android.settings.R; 33 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.robolectric.RobolectricTestRunner; 38 39 @RunWith(RobolectricTestRunner.class) 40 public class CardPreferenceTest { 41 42 private CardPreference mCardPreference; 43 private PreferenceViewHolder mHolder; 44 45 @Before setUp()46 public void setUp() { 47 Context context = ApplicationProvider.getApplicationContext(); 48 context.setTheme(R.style.Theme_Settings); 49 mCardPreference = new CardPreference(context); 50 51 View rootView = View.inflate(context, R.layout.card_preference_layout, /* parent= */ null); 52 mHolder = PreferenceViewHolder.createInstanceForTests(rootView); 53 } 54 55 @Test newACardPreference_layoutResourceShouldBeCardPreferenceLayout()56 public void newACardPreference_layoutResourceShouldBeCardPreferenceLayout() { 57 Context context = ApplicationProvider.getApplicationContext(); 58 context.setTheme(R.style.SettingsPreferenceTheme); 59 60 CardPreference cardPreference = new CardPreference(context); 61 62 assertThat(cardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout); 63 } 64 65 @Test onBindViewHolder_noButtonVisible_buttonsLayoutShouldBeGone()66 public void onBindViewHolder_noButtonVisible_buttonsLayoutShouldBeGone() { 67 mCardPreference.onBindViewHolder(mHolder); 68 69 assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE); 70 } 71 72 @Test onBindViewHolder_setPrimaryButtonVisibility_buttonsLayoutShouldBeVisible()73 public void onBindViewHolder_setPrimaryButtonVisibility_buttonsLayoutShouldBeVisible() { 74 mCardPreference.setPrimaryButtonVisible(true); 75 76 mCardPreference.onBindViewHolder(mHolder); 77 78 assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE); 79 } 80 81 @Test onBindViewHolder_setPrimaryButtonVisibility_shouldApplyToPrimaryButton()82 public void onBindViewHolder_setPrimaryButtonVisibility_shouldApplyToPrimaryButton() { 83 mCardPreference.setPrimaryButtonVisible(true); 84 85 mCardPreference.onBindViewHolder(mHolder); 86 87 assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE); 88 } 89 90 @Test onBindViewHolder_setSecondaryButtonVisibility_buttonsLayoutShouldBeVisible()91 public void onBindViewHolder_setSecondaryButtonVisibility_buttonsLayoutShouldBeVisible() { 92 mCardPreference.setSecondaryButtonVisible(true); 93 94 mCardPreference.onBindViewHolder(mHolder); 95 96 assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE); 97 } 98 99 @Test onBindViewHolder_setSecondaryButtonVisibility_shouldApplyToSecondaryButton()100 public void onBindViewHolder_setSecondaryButtonVisibility_shouldApplyToSecondaryButton() { 101 mCardPreference.setSecondaryButtonVisible(true); 102 103 mCardPreference.onBindViewHolder(mHolder); 104 105 assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE); 106 } 107 108 @Test onBindViewHolder_setPrimaryButtonText_shouldApplyToPrimaryButton()109 public void onBindViewHolder_setPrimaryButtonText_shouldApplyToPrimaryButton() { 110 String expectedText = "primary-button"; 111 mCardPreference.setPrimaryButtonText(expectedText); 112 113 mCardPreference.onBindViewHolder(mHolder); 114 115 assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText); 116 } 117 118 @Test onBindViewHolder_setSecondaryButtonText_shouldApplyToSecondaryButton()119 public void onBindViewHolder_setSecondaryButtonText_shouldApplyToSecondaryButton() { 120 String expectedText = "secondary-button"; 121 mCardPreference.setSecondaryButtonText(expectedText); 122 123 mCardPreference.onBindViewHolder(mHolder); 124 125 assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText); 126 } 127 128 @Test onBindViewHolder_initialTextForPrimaryButtonShouldBeEmpty()129 public void onBindViewHolder_initialTextForPrimaryButtonShouldBeEmpty() { 130 mCardPreference.onBindViewHolder(mHolder); 131 132 assertThat(getPrimaryButton().getText().toString()).isEqualTo(""); 133 } 134 135 @Test onBindViewHolder_initialTextForSecondaryButtonShouldBeEmpty()136 public void onBindViewHolder_initialTextForSecondaryButtonShouldBeEmpty() { 137 mCardPreference.onBindViewHolder(mHolder); 138 139 assertThat(getSecondaryButton().getText().toString()).isEqualTo(""); 140 } 141 142 @Test performClickOnPrimaryButton_shouldCalledClickListener()143 public void performClickOnPrimaryButton_shouldCalledClickListener() { 144 final boolean[] hasCalled = {false}; 145 View.OnClickListener clickListener = v -> hasCalled[0] = true; 146 mCardPreference.setPrimaryButtonClickListener(clickListener); 147 148 mCardPreference.onBindViewHolder(mHolder); 149 getPrimaryButton().performClick(); 150 151 assertThat(hasCalled[0]).isTrue(); 152 } 153 154 @Test performClickOnSecondaryButton_shouldCalledClickListener()155 public void performClickOnSecondaryButton_shouldCalledClickListener() { 156 final boolean[] hasCalled = {false}; 157 View.OnClickListener clickListener = v -> hasCalled[0] = true; 158 mCardPreference.setSecondaryButtonClickListener(clickListener); 159 160 mCardPreference.onBindViewHolder(mHolder); 161 getSecondaryButton().performClick(); 162 163 assertThat(hasCalled[0]).isTrue(); 164 } 165 166 @Test onBindViewHolder_primaryButtonDefaultIsGone()167 public void onBindViewHolder_primaryButtonDefaultIsGone() { 168 mCardPreference.onBindViewHolder(mHolder); 169 170 assertThat(getPrimaryButton().getVisibility()).isEqualTo(GONE); 171 } 172 173 @Test onBindViewHolder_secondaryButtonDefaultIsGone()174 public void onBindViewHolder_secondaryButtonDefaultIsGone() { 175 mCardPreference.onBindViewHolder(mHolder); 176 177 assertThat(getSecondaryButton().getVisibility()).isEqualTo(GONE); 178 } 179 180 @Test setPrimaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible()181 public void setPrimaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible() { 182 mCardPreference.setPrimaryButtonVisible(false); 183 mCardPreference.onBindViewHolder(mHolder); 184 185 mCardPreference.setPrimaryButtonVisible(true); 186 187 assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE); 188 } 189 190 @Test setPrimaryButtonText_setAfterBindViewHolder_setOnUi()191 public void setPrimaryButtonText_setAfterBindViewHolder_setOnUi() { 192 String expectedText = "123456"; 193 mCardPreference.onBindViewHolder(mHolder); 194 195 mCardPreference.setPrimaryButtonText(expectedText); 196 197 assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText); 198 } 199 200 @Test setPrimaryButtonText_setNull_shouldBeEmptyText()201 public void setPrimaryButtonText_setNull_shouldBeEmptyText() { 202 final String emptyString = ""; 203 mCardPreference.setPrimaryButtonText("1234"); 204 mCardPreference.onBindViewHolder(mHolder); 205 206 mCardPreference.setPrimaryButtonText(null); 207 208 assertThat(getPrimaryButton().getText().toString()).isEqualTo(emptyString); 209 } 210 211 @Test setPrimaryButtonClickListener_setAfterOnBindViewHolder()212 public void setPrimaryButtonClickListener_setAfterOnBindViewHolder() { 213 final String[] hasCalled = {""}; 214 String expectedClickedResult = "was called"; 215 View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult; 216 mCardPreference.onBindViewHolder(mHolder); 217 218 mCardPreference.setPrimaryButtonClickListener(clickListener); 219 getPrimaryButton().performClick(); 220 221 assertThat(hasCalled[0]).isEqualTo(expectedClickedResult); 222 } 223 224 @Test setPrimaryButtonClickListener_setNull_shouldClearTheOnClickListener()225 public void setPrimaryButtonClickListener_setNull_shouldClearTheOnClickListener() { 226 final String[] hasCalled = {"not called"}; 227 View.OnClickListener clickListener = v -> hasCalled[0] = "called once"; 228 mCardPreference.setPrimaryButtonClickListener(clickListener); 229 mCardPreference.onBindViewHolder(mHolder); 230 231 mCardPreference.setPrimaryButtonClickListener(null); 232 getPrimaryButton().performClick(); 233 234 assertThat(hasCalled[0]).isEqualTo("not called"); 235 } 236 237 @Test setSecondaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible()238 public void setSecondaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible() { 239 mCardPreference.setSecondaryButtonVisible(false); 240 mCardPreference.onBindViewHolder(mHolder); 241 242 mCardPreference.setSecondaryButtonVisible(true); 243 244 assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE); 245 } 246 247 @Test setSecondaryButtonText_setAfterBindViewHolder_setOnUi()248 public void setSecondaryButtonText_setAfterBindViewHolder_setOnUi() { 249 String expectedText = "10101010"; 250 mCardPreference.onBindViewHolder(mHolder); 251 252 mCardPreference.setSecondaryButtonText(expectedText); 253 254 assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText); 255 } 256 257 @Test setSecondaryButtonText_setNull_shouldBeEmptyText()258 public void setSecondaryButtonText_setNull_shouldBeEmptyText() { 259 String emptyString = ""; 260 mCardPreference.setSecondaryButtonText("1234"); 261 mCardPreference.onBindViewHolder(mHolder); 262 263 mCardPreference.setSecondaryButtonText(null); 264 265 assertThat(getSecondaryButton().getText().toString()).isEqualTo(emptyString); 266 } 267 268 @Test setSecondaryButtonClickListener_setAfterOnBindViewHolder()269 public void setSecondaryButtonClickListener_setAfterOnBindViewHolder() { 270 final String[] hasCalled = {""}; 271 String expectedClickedResult = "2nd was called"; 272 View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult; 273 mCardPreference.onBindViewHolder(mHolder); 274 275 mCardPreference.setSecondaryButtonClickListener(clickListener); 276 getSecondaryButton().performClick(); 277 278 assertThat(hasCalled[0]).isEqualTo(expectedClickedResult); 279 } 280 281 @Test setSecondaryButtonClickListener_setNull_shouldClearTheOnClickListener()282 public void setSecondaryButtonClickListener_setNull_shouldClearTheOnClickListener() { 283 final String[] hasCalled = {"not called"}; 284 View.OnClickListener clickListener = v -> hasCalled[0] = "called once"; 285 mCardPreference.setSecondaryButtonClickListener(clickListener); 286 mCardPreference.onBindViewHolder(mHolder); 287 288 mCardPreference.setSecondaryButtonClickListener(null); 289 getSecondaryButton().performClick(); 290 291 assertThat(hasCalled[0]).isEqualTo("not called"); 292 } 293 294 @Test 295 public void setPrimaryButtonVisibility_onlyPrimaryButtonVisible_setGone_buttonGroupShouldBeGone()296 setPrimaryButtonVisibility_onlyPrimaryButtonVisible_setGone_buttonGroupShouldBeGone() { 297 mCardPreference.setPrimaryButtonVisible(true); 298 mCardPreference.setSecondaryButtonVisible(false); 299 mCardPreference.onBindViewHolder(mHolder); 300 assertWithMessage("PreCondition: buttonsView should be Visible") 301 .that(getCardPreferenceButtonsView().getVisibility()) 302 .isEqualTo(VISIBLE); 303 304 mCardPreference.setPrimaryButtonVisible(false); 305 306 assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE); 307 } 308 309 @Test 310 public void setSecondaryButtonVisibility_only2ndButtonVisible_setGone_buttonGroupShouldBeGone()311 setSecondaryButtonVisibility_only2ndButtonVisible_setGone_buttonGroupShouldBeGone() { 312 mCardPreference.setPrimaryButtonVisible(false); 313 mCardPreference.setSecondaryButtonVisible(true); 314 mCardPreference.onBindViewHolder(mHolder); 315 assertWithMessage("PreCondition: buttonsView should be Visible") 316 .that(getCardPreferenceButtonsView().getVisibility()) 317 .isEqualTo(VISIBLE); 318 319 mCardPreference.setSecondaryButtonVisible(false); 320 321 assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE); 322 } 323 getCardPreferenceButtonsView()324 private View getCardPreferenceButtonsView() { 325 return mHolder.findViewById(R.id.card_preference_buttons); 326 } 327 getPrimaryButton()328 private Button getPrimaryButton() { 329 return (Button) mHolder.findViewById(android.R.id.button1); 330 } 331 getSecondaryButton()332 private Button getSecondaryButton() { 333 return (Button) mHolder.findViewById(android.R.id.button2); 334 } 335 } 336