178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang/* 278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * Copyright (C) 2017 The Android Open Source Project 378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * 478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * you may not use this file except in compliance with the License. 678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * You may obtain a copy of the License at 778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * 878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * 1078d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * Unless required by applicable law or agreed to in writing, software 1178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 1278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * See the License for the specific language governing permissions and 1478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang * limitations under the License. 1578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang */ 1678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 1778d5efdfea790529ed9a0591256de91685a925e3Fan Zhangpackage com.android.settings.widget; 1878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 1978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 2078d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport android.text.InputType; 2178d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport android.text.TextWatcher; 2278d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport android.view.View; 2378d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport android.widget.EditText; 2478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 2578d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport com.android.settings.TestConfig; 2678d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport com.android.settings.testutils.SettingsRobolectricTestRunner; 2778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 2878d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.junit.Before; 2978d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.junit.Test; 3078d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.junit.runner.RunWith; 3178d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.mockito.Mock; 3278d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.mockito.MockitoAnnotations; 3378d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.robolectric.RuntimeEnvironment; 3478d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport org.robolectric.annotation.Config; 3578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 3678d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport static com.google.common.truth.Truth.assertThat; 3778d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport static org.mockito.Matchers.any; 389be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargentimport static org.mockito.Matchers.anyInt; 399be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargentimport static org.mockito.Mockito.never; 4078d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport static org.mockito.Mockito.spy; 4178d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport static org.mockito.Mockito.verify; 4278d5efdfea790529ed9a0591256de91685a925e3Fan Zhangimport static org.mockito.Mockito.when; 4378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 4478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang@RunWith(SettingsRobolectricTestRunner.class) 4578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 4678d5efdfea790529ed9a0591256de91685a925e3Fan Zhangpublic class ValidatedEditTextPreferenceTest { 4778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 4878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Mock 4978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang private View mView; 5078d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Mock 5178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang private ValidatedEditTextPreference.Validator mValidator; 5278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 5378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang private ValidatedEditTextPreference mPreference; 5478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 5578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Before 5678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang public void setUp() { 5778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang MockitoAnnotations.initMocks(this); 5878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference = new ValidatedEditTextPreference(RuntimeEnvironment.application); 5978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang } 6078d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 6178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Test 629be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent public void bindDialogView_nullEditText_shouldNotCrash() { 639be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent when(mView.findViewById(android.R.id.edit)).thenReturn(null); 649be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent // should not crash trying to get the EditText text 659be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent mPreference.onBindDialogView(mView); 669be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent } 679be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent 689be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent @Test 699be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent public void bindDialogView_emptyEditText_shouldNotSetSelection() { 709be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent final String testText = ""; 719be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent final EditText editText = spy(new EditText(RuntimeEnvironment.application)); 729be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent editText.setText(testText); 739be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent when(mView.findViewById(android.R.id.edit)).thenReturn(editText); 749be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent 759be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent mPreference.onBindDialogView(mView); 769be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent 779be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent // no need to setSelection if text was empty 789be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent verify(editText, never()).setSelection(anyInt()); 799be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent } 809be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent 819be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent @Test 829be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent public void bindDialogView_nonemptyEditText_shouldSetSelection() { 839be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent final String testText = "whatever"; 849be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent final EditText editText = spy(new EditText(RuntimeEnvironment.application)); 859be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent editText.setText(testText); 869be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent when(mView.findViewById(android.R.id.edit)).thenReturn(editText); 879be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent 8878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.onBindDialogView(mView); 8978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 909be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent // selection should be set to end of string 919be8c3fbfe39a5259c5f8c6adce67fbc5907c802Antony Sargent verify(editText).setSelection(testText.length()); 9278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang } 9378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 9478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Test 9578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang public void bindDialogView_hasValidator_shouldBindToEditText() { 9678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang final EditText editText = spy(new EditText(RuntimeEnvironment.application)); 9778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang when(mView.findViewById(android.R.id.edit)).thenReturn(editText); 9878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 9978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.setValidator(mValidator); 10078d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.onBindDialogView(mView); 10178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 10278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang verify(editText).addTextChangedListener(any(TextWatcher.class)); 10378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang } 10478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 10578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang @Test 10678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang public void bindDialogView_isPassword_shouldSetInputType() { 10778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang final EditText editText = spy(new EditText(RuntimeEnvironment.application)); 10878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang when(mView.findViewById(android.R.id.edit)).thenReturn(editText); 10978d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 11078d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.setValidator(mValidator); 11178d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.setIsPassword(true); 11278d5efdfea790529ed9a0591256de91685a925e3Fan Zhang mPreference.onBindDialogView(mView); 11378d5efdfea790529ed9a0591256de91685a925e3Fan Zhang 11478d5efdfea790529ed9a0591256de91685a925e3Fan Zhang assertThat(editText.getInputType() 11578d5efdfea790529ed9a0591256de91685a925e3Fan Zhang & (InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT)) 11678d5efdfea790529ed9a0591256de91685a925e3Fan Zhang .isNotEqualTo(0); 11778d5efdfea790529ed9a0591256de91685a925e3Fan Zhang } 11878d5efdfea790529ed9a0591256de91685a925e3Fan Zhang} 119