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