1 /* 2 * Copyright (C) 2023 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 package com.android.settings.development; 17 18 19 import static com.android.settings.development.GrammaticalGenderPreferenceController.GRAMMATICAL_GENDER_PROPERTY; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Mockito.doReturn; 24 import static org.mockito.Mockito.verify; 25 import static org.mockito.Mockito.when; 26 27 import android.app.IActivityManager; 28 import android.content.Context; 29 import android.content.res.Configuration; 30 import android.content.res.Resources; 31 import android.os.RemoteException; 32 import android.os.SystemProperties; 33 34 import androidx.preference.ListPreference; 35 import androidx.preference.PreferenceScreen; 36 37 import org.junit.Before; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.Mock; 41 import org.mockito.MockitoAnnotations; 42 import org.robolectric.RobolectricTestRunner; 43 import org.robolectric.RuntimeEnvironment; 44 45 @RunWith(RobolectricTestRunner.class) 46 public class GrammaticalGenderPreferenceControllerTest { 47 @Mock 48 private ListPreference mPreference; 49 @Mock 50 private PreferenceScreen mPreferenceScreen; 51 @Mock 52 private IActivityManager mActivityManager; 53 private Configuration mConfiguration; 54 private Context mContext; 55 private GrammaticalGenderPreferenceController mController; 56 private String[] mListValues; 57 private String[] mListSummaries; 58 59 @Before setUp()60 public void setUp() throws Exception { 61 MockitoAnnotations.initMocks(this); 62 mContext = RuntimeEnvironment.application; 63 final Resources resources = mContext.getResources(); 64 mListValues = resources.getStringArray( 65 com.android.settingslib.R.array.grammatical_gender_values); 66 mListSummaries = resources.getStringArray( 67 com.android.settingslib.R.array.grammatical_gender_entries); 68 mConfiguration = new Configuration(); 69 mController = new GrammaticalGenderPreferenceController(mContext, mActivityManager); 70 when(mPreferenceScreen.findPreference(mController.getPreferenceKey())) 71 .thenReturn(mPreference); 72 mController.displayPreference(mPreferenceScreen); 73 doReturn(mConfiguration).when(mActivityManager).getConfiguration(); 74 } 75 76 @Test onPreferenceChange_setNeuter_shouldEnableNeuter()77 public void onPreferenceChange_setNeuter_shouldEnableNeuter() throws RemoteException { 78 mController.onPreferenceChange(mPreference, mListValues[1]); 79 final String currentValue = SystemProperties.get(GRAMMATICAL_GENDER_PROPERTY); 80 assertThat(currentValue).isEqualTo(mListValues[1]); 81 verify(mActivityManager).updatePersistentConfiguration(mConfiguration); 82 assertThat(mConfiguration.getGrammaticalGender()) 83 .isEqualTo(Integer.parseInt(mListValues[1])); 84 } 85 86 @Test updateState_setNeuter_shouldSetPreferenceToNeuter()87 public void updateState_setNeuter_shouldSetPreferenceToNeuter() { 88 SystemProperties.set(GRAMMATICAL_GENDER_PROPERTY, mListValues[1]); 89 90 mController.updateState(mPreference); 91 92 verify(mPreference).setValue(mListValues[1]); 93 verify(mPreference).setSummary(mListSummaries[1]); 94 } 95 96 @Test onPreferenceChange_setFeminine_shouldEnableFeminine()97 public void onPreferenceChange_setFeminine_shouldEnableFeminine() throws RemoteException { 98 mController.onPreferenceChange(mPreference, mListValues[2]); 99 final String currentValue = SystemProperties.get(GRAMMATICAL_GENDER_PROPERTY); 100 assertThat(currentValue).isEqualTo(mListValues[2]); 101 verify(mActivityManager).updatePersistentConfiguration(mConfiguration); 102 assertThat(mConfiguration.getGrammaticalGender()) 103 .isEqualTo(Integer.parseInt(mListValues[2])); 104 } 105 106 @Test updateState_setFeminine_shouldSetPreferenceToFeminine()107 public void updateState_setFeminine_shouldSetPreferenceToFeminine() { 108 SystemProperties.set(GRAMMATICAL_GENDER_PROPERTY, mListValues[2]); 109 110 mController.updateState(mPreference); 111 112 verify(mPreference).setValue(mListValues[2]); 113 verify(mPreference).setSummary(mListSummaries[2]); 114 } 115 116 @Test onPreferenceChange_setMasculine_shouldEnableMasculine()117 public void onPreferenceChange_setMasculine_shouldEnableMasculine() throws RemoteException { 118 mController.onPreferenceChange(mPreference, mListValues[3]); 119 final String currentValue = SystemProperties.get(GRAMMATICAL_GENDER_PROPERTY); 120 assertThat(currentValue).isEqualTo(mListValues[3]); 121 verify(mActivityManager).updatePersistentConfiguration(mConfiguration); 122 assertThat(mConfiguration.getGrammaticalGender()) 123 .isEqualTo(Integer.parseInt(mListValues[3])); 124 } 125 126 @Test updateState_setMasculine_shouldSetPreferenceToMasculine()127 public void updateState_setMasculine_shouldSetPreferenceToMasculine() { 128 SystemProperties.set(GRAMMATICAL_GENDER_PROPERTY, mListValues[3]); 129 130 mController.updateState(mPreference); 131 132 verify(mPreference).setValue(mListValues[3]); 133 verify(mPreference).setSummary(mListSummaries[3]); 134 } 135 136 @Test updateState_noValueSet_shouldSetDefaultToNotSpecified()137 public void updateState_noValueSet_shouldSetDefaultToNotSpecified() { 138 mController.updateState(mPreference); 139 140 verify(mPreference).setValue(mListValues[0]); 141 verify(mPreference).setSummary(mListSummaries[0]); 142 } 143 } 144