1 /* 2 * Copyright (C) 2017 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; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Mockito.doReturn; 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.spy; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 import android.app.Activity; 27 import android.content.Context; 28 import android.os.Bundle; 29 import android.support.v7.preference.Preference; 30 import android.support.v7.preference.PreferenceCategory; 31 import android.support.v7.preference.PreferenceManager; 32 import android.support.v7.preference.PreferenceScreen; 33 import android.view.View; 34 35 import com.android.settings.testutils.FakeFeatureFactory; 36 import com.android.settings.testutils.SettingsRobolectricTestRunner; 37 import com.android.settings.testutils.shadow.SettingsShadowResources; 38 39 import org.junit.Before; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.Mock; 43 import org.mockito.MockitoAnnotations; 44 import org.robolectric.RuntimeEnvironment; 45 import org.robolectric.annotation.Config; 46 import org.robolectric.util.ReflectionHelpers; 47 48 @RunWith(SettingsRobolectricTestRunner.class) 49 public class SettingsPreferenceFragmentTest { 50 51 private static final int ITEM_COUNT = 5; 52 53 @Mock 54 private Activity mActivity; 55 @Mock 56 private View mListContainer; 57 @Mock 58 private PreferenceScreen mPreferenceScreen; 59 private Context mContext; 60 private TestFragment mFragment; 61 private View mEmptyView; 62 63 @Before 64 public void setUp() { 65 MockitoAnnotations.initMocks(this); 66 FakeFeatureFactory.setupForTest(); 67 mContext = RuntimeEnvironment.application; 68 mFragment = spy(new TestFragment()); 69 doReturn(mActivity).when(mFragment).getActivity(); 70 71 mEmptyView = new View(mContext); 72 ReflectionHelpers.setField(mFragment, "mEmptyView", mEmptyView); 73 74 doReturn(ITEM_COUNT).when(mPreferenceScreen).getPreferenceCount(); 75 } 76 77 @Test 78 public void removePreference_nested_shouldRemove() { 79 final String key = "test_key"; 80 final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null)); 81 when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class)); 82 83 final PreferenceCategory nestedCategory = new ProgressCategory(mContext); 84 final Preference preference = new Preference(mContext); 85 preference.setKey(key); 86 preference.setPersistent(false); 87 88 mScreen.addPreference(nestedCategory); 89 nestedCategory.addPreference(preference); 90 91 assertThat(mFragment.removePreference(mScreen, key)).isTrue(); 92 assertThat(nestedCategory.getPreferenceCount()).isEqualTo(0); 93 } 94 95 @Test 96 public void removePreference_flat_shouldRemove() { 97 final String key = "test_key"; 98 final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null)); 99 when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class)); 100 101 final Preference preference = mock(Preference.class); 102 when(preference.getKey()).thenReturn(key); 103 104 mScreen.addPreference(preference); 105 106 assertThat(mFragment.removePreference(mScreen, key)).isTrue(); 107 assertThat(mScreen.getPreferenceCount()).isEqualTo(0); 108 } 109 110 @Test 111 public void removePreference_doNotExist_shouldNotRemove() { 112 final String key = "test_key"; 113 final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null)); 114 when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class)); 115 116 final Preference preference = mock(Preference.class); 117 when(preference.getKey()).thenReturn(key); 118 119 mScreen.addPreference(preference); 120 121 assertThat(mFragment.removePreference(mScreen, "not" + key)).isFalse(); 122 assertThat(mScreen.getPreferenceCount()).isEqualTo(1); 123 } 124 125 @Test 126 public void testUpdateEmptyView_containerInvisible_emptyViewVisible() { 127 doReturn(View.INVISIBLE).when(mListContainer).getVisibility(); 128 doReturn(mListContainer).when(mActivity).findViewById(android.R.id.list_container); 129 doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); 130 131 mFragment.updateEmptyView(); 132 133 assertThat(mEmptyView.getVisibility()).isEqualTo(View.VISIBLE); 134 } 135 136 @Test 137 public void testUpdateEmptyView_containerNull_emptyViewGone() { 138 doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); 139 140 mFragment.updateEmptyView(); 141 142 assertThat(mEmptyView.getVisibility()).isEqualTo(View.GONE); 143 } 144 145 @Test 146 @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class) 147 public void onCreate_hasExtraFragmentKey_shouldExpandPreferences() { 148 doReturn(mContext.getTheme()).when(mActivity).getTheme(); 149 doReturn(mContext.getResources()).when(mFragment).getResources(); 150 doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); 151 final Bundle bundle = new Bundle(); 152 bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, "test_key"); 153 when(mFragment.getArguments()).thenReturn(bundle); 154 155 mFragment.onCreate(null /* icicle */); 156 157 verify(mPreferenceScreen).setInitialExpandedChildrenCount(Integer.MAX_VALUE); 158 } 159 160 @Test 161 @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class) 162 public void onCreate_noPreferenceScreen_shouldNotCrash() { 163 doReturn(mContext.getTheme()).when(mActivity).getTheme(); 164 doReturn(mContext.getResources()).when(mFragment).getResources(); 165 doReturn(null).when(mFragment).getPreferenceScreen(); 166 final Bundle bundle = new Bundle(); 167 bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, "test_key"); 168 when(mFragment.getArguments()).thenReturn(bundle); 169 170 mFragment.onCreate(null /* icicle */); 171 // no crash 172 } 173 174 public static class TestFragment extends SettingsPreferenceFragment { 175 176 @Override 177 public int getMetricsCategory() { 178 return 0; 179 } 180 } 181 } 182