1 /* 2 * Copyright (C) 2016 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.gestures; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.ArgumentMatchers.anyString; 22 import static org.mockito.Mockito.mock; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 import android.content.Context; 27 28 import androidx.preference.Preference; 29 import androidx.preference.PreferenceScreen; 30 import androidx.preference.TwoStatePreference; 31 32 import com.android.settings.widget.VideoPreference; 33 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.mockito.Answers; 38 import org.mockito.Mock; 39 import org.mockito.MockitoAnnotations; 40 import org.robolectric.RobolectricTestRunner; 41 import org.robolectric.RuntimeEnvironment; 42 43 @RunWith(RobolectricTestRunner.class) 44 public class GesturePreferenceControllerTest { 45 46 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 47 private Context mContext; 48 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 49 private PreferenceScreen mScreen; 50 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 51 52 private TestPrefController mController; 53 private Preference mPreference; 54 55 @Before setUp()56 public void setUp() { 57 MockitoAnnotations.initMocks(this); 58 mController = new TestPrefController(mContext, "testKey"); 59 mPreference = new Preference(RuntimeEnvironment.application); 60 mPreference.setKey(mController.getPreferenceKey()); 61 when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference); 62 } 63 64 @Test display_configIsTrue_shouldDisplay()65 public void display_configIsTrue_shouldDisplay() { 66 mController.mIsPrefAvailable = true; 67 when(mScreen.findPreference(anyString())).thenReturn(mock(VideoPreference.class)); 68 69 mController.displayPreference(mScreen); 70 71 assertThat(mPreference.isVisible()).isTrue(); 72 } 73 74 @Test display_configIsFalse_shouldNotDisplay()75 public void display_configIsFalse_shouldNotDisplay() { 76 mController.mIsPrefAvailable = false; 77 78 mController.displayPreference(mScreen); 79 80 assertThat(mPreference.isVisible()).isFalse(); 81 } 82 83 @Test onStart_shouldStartVideoPreference()84 public void onStart_shouldStartVideoPreference() { 85 final VideoPreference videoPreference = mock(VideoPreference.class); 86 when(mScreen.findPreference(mController.getVideoPrefKey())).thenReturn(videoPreference); 87 mController.mIsPrefAvailable = true; 88 mController.displayPreference(mScreen); 89 90 mController.onStart(); 91 92 verify(videoPreference).onViewVisible(); 93 } 94 95 @Test onStop_shouldStopVideoPreference()96 public void onStop_shouldStopVideoPreference() { 97 final VideoPreference videoPreference = mock(VideoPreference.class); 98 when(mScreen.findPreference(mController.getVideoPrefKey())).thenReturn(videoPreference); 99 mController.mIsPrefAvailable = true; 100 101 mController.displayPreference(mScreen); 102 mController.onStop(); 103 104 verify(videoPreference).onViewInvisible(); 105 } 106 107 @Test updateState_preferenceSetCheckedWhenSettingIsOn()108 public void updateState_preferenceSetCheckedWhenSettingIsOn() { 109 // Mock a TwoStatePreference 110 final TwoStatePreference preference = mock(TwoStatePreference.class); 111 // Set the setting to be enabled. 112 mController.mIsPrefEnabled = true; 113 // Run through updateState 114 mController.updateState(preference); 115 116 // Verify pref is checked (as setting is enabled). 117 verify(preference).setChecked(true); 118 } 119 120 @Test updateState_preferenceSetUncheckedWhenSettingIsOff()121 public void updateState_preferenceSetUncheckedWhenSettingIsOff() { 122 // Mock a TwoStatePreference 123 final TwoStatePreference preference = mock(TwoStatePreference.class); 124 // Set the setting to be disabled. 125 mController.mIsPrefEnabled = false; 126 127 // Run through updateState 128 mController.updateState(preference); 129 130 // Verify pref is unchecked (as setting is disabled). 131 verify(preference).setChecked(false); 132 } 133 134 private class TestPrefController extends GesturePreferenceController { 135 136 boolean mIsPrefAvailable; 137 boolean mIsPrefEnabled; 138 TestPrefController(Context context, String key)139 private TestPrefController(Context context, String key) { 140 super(context, key); 141 } 142 143 @Override getAvailabilityStatus()144 public int getAvailabilityStatus() { 145 return mIsPrefAvailable ? AVAILABLE : UNSUPPORTED_ON_DEVICE; 146 } 147 148 @Override getVideoPrefKey()149 protected String getVideoPrefKey() { 150 return "videoKey"; 151 } 152 153 @Override isChecked()154 public boolean isChecked() { 155 return mIsPrefEnabled; 156 } 157 158 @Override setChecked(boolean isChecked)159 public boolean setChecked(boolean isChecked) { 160 return false; 161 } 162 } 163 } 164