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