15efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang/*
25efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Copyright (C) 2016 The Android Open Source Project
35efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
45efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Licensed under the Apache License, Version 2.0 (the "License");
55efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * you may not use this file except in compliance with the License.
65efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * You may obtain a copy of the License at
75efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
85efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *      http://www.apache.org/licenses/LICENSE-2.0
95efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang *
105efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * Unless required by applicable law or agreed to in writing, software
115efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * distributed under the License is distributed on an "AS IS" BASIS,
125efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * See the License for the specific language governing permissions and
145efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang * limitations under the License.
155efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang */
165efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
175efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpackage com.android.settingslib.widget;
185efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
195efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.support.v14.preference.PreferenceFragment;
205efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.support.v7.preference.PreferenceManager;
215efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport android.support.v7.preference.PreferenceScreen;
225efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
235efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.SettingLibRobolectricTestRunner;
245efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.TestConfig;
255efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport com.android.settingslib.core.lifecycle.Lifecycle;
265efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
275efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.Before;
285efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.Test;
295efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.junit.runner.RunWith;
305efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.mockito.Mock;
315efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.mockito.MockitoAnnotations;
325efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.annotation.Config;
335efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport org.robolectric.shadows.ShadowApplication;
345efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
355efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static com.google.common.truth.Truth.assertThat;
365efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static org.mockito.Matchers.any;
375efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static org.mockito.Mockito.mock;
385efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static org.mockito.Mockito.times;
395efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static org.mockito.Mockito.verify;
405efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langimport static org.mockito.Mockito.when;
415efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
425efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang@RunWith(SettingLibRobolectricTestRunner.class)
435efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
445efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Langpublic class FooterPreferenceMixinTest {
455efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
465efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Mock
475efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private PreferenceFragment mFragment;
485efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Mock
495efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private PreferenceScreen mScreen;
505efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
515efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private Lifecycle mLifecycle;
525efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    private FooterPreferenceMixin mMixin;
535efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
545efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Before
555efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void setUp() {
565efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        MockitoAnnotations.initMocks(this);
575efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        mLifecycle = new Lifecycle();
585efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        when(mFragment.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
595efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        when(mFragment.getPreferenceManager().getContext())
605efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang                .thenReturn(ShadowApplication.getInstance().getApplicationContext());
615efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        mMixin = new FooterPreferenceMixin(mFragment, mLifecycle);
625efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
635efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
645efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
655efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void createFooter_screenNotAvailable_noCrash() {
665efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(mMixin.createFooterPreference()).isNotNull();
675efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
685efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
695efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
705efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void createFooter_screenAvailable_canAttachToScreen() {
715efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
725efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
735efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final FooterPreference preference = mMixin.createFooterPreference();
745efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
755efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(preference).isNotNull();
765efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        verify(mScreen).addPreference(preference);
775efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
785efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
795efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
805efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void createFooter_screenAvailableDelayed_canAttachToScreen() {
815efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        final FooterPreference preference = mMixin.createFooterPreference();
825efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
835efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        mLifecycle.setPreferenceScreen(mScreen);
845efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
855efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        assertThat(preference).isNotNull();
865efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        verify(mScreen).addPreference(preference);
875efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
885efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
895efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    @Test
905efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    public void createFooterTwice_screenAvailable_replaceOldFooter() {
915efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
925efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
935efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        mMixin.createFooterPreference();
945efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        mMixin.createFooterPreference();
955efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
965efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        verify(mScreen).removePreference(any(FooterPreference.class));
975efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang        verify(mScreen, times(2)).addPreference(any(FooterPreference.class));
985efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang    }
995efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang
1005efe8f0a096fd13d5ecdacf90447e0b4ef132967Juan Lang}
101