138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake/*
291f3de362ba7218d74f121e6f78ea31519e829fcIan Lake * Copyright 2018 The Android Open Source Project
338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake *
438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * Licensed under the Apache License, Version 2.0 (the "License");
538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * you may not use this file except in compliance with the License.
638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * You may obtain a copy of the License at
738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake *
838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake *      http://www.apache.org/licenses/LICENSE-2.0
938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake *
1038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * Unless required by applicable law or agreed to in writing, software
1138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * distributed under the License is distributed on an "AS IS" BASIS,
1238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * See the License for the specific language governing permissions and
1438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * limitations under the License.
1538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake */
1638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.loader.app;
1838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
1991f3de362ba7218d74f121e6f78ea31519e829fcIan Lakeimport static org.junit.Assert.assertFalse;
200f4d973e9bb5a00727068f6a76338908c21902fdIan Lakeimport static org.junit.Assert.assertNull;
2138f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport static org.junit.Assert.assertTrue;
224c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lakeimport static org.mockito.Mockito.mock;
2338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
2438f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport android.content.Context;
2538f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport android.support.test.filters.SmallTest;
2638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
276160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikasimport androidx.loader.app.test.DummyLoader;
286160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikasimport androidx.loader.content.Loader;
296160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikas
3038f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport org.junit.Test;
3138f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport org.junit.runner.RunWith;
324c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lakeimport org.junit.runners.JUnit4;
3338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
344c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake@RunWith(JUnit4.class)
3538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake@SmallTest
3638f4f4174d9cd53c553f14c19746500cb861b089Ian Lakepublic class LoaderViewModelTest {
3738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
3838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    @Test
3938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    public void testHasRunningLoaders() {
4038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
4138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        assertFalse("LoaderViewModel should not be running with before putLoader",
4238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake                loaderViewModel.hasRunningLoaders());
4338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
444c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
4538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        loaderViewModel.putLoader(0, info);
4638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        assertTrue("LoaderViewModel should be running after a running LoaderInfo is added",
4738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake                loaderViewModel.hasRunningLoaders());
4838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
4938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        loaderViewModel.removeLoader(0);
5038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        assertFalse("LoaderViewModel should not be running after all LoaderInfos are removed",
5138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake                loaderViewModel.hasRunningLoaders());
5238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    }
5338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
5438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    @Test
5538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    public void testOnCleared() {
5638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
574c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
5838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        loaderViewModel.putLoader(0, info);
5938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
6038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        assertFalse("LoaderInfo shouldn't be destroyed before onCleared", info.mDestroyed);
6138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        loaderViewModel.onCleared();
6238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        assertTrue("LoaderInfo should be destroyed after onCleared", info.mDestroyed);
630f4d973e9bb5a00727068f6a76338908c21902fdIan Lake        assertNull("LoaderInfo should be removed from LoaderViewModel after onCleared",
640f4d973e9bb5a00727068f6a76338908c21902fdIan Lake                loaderViewModel.getLoader(0));
6538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    }
6638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
6738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    private class AlwaysRunningLoaderInfo extends LoaderManagerImpl.LoaderInfo<Boolean> {
6838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        boolean mDestroyed = false;
6938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
7038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        AlwaysRunningLoaderInfo(Context context) {
7101b544c7352c805d3c18f023b2eaeecb924ee1b3Ian Lake            super(0, null, new DummyLoader(context), null);
7238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        }
7338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
7438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        @Override
7538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        boolean isCallbackWaitingForData() {
7638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake            return true;
7738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        }
7838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake
7938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        @Override
805404d815b5a1cc57d7b1dc6c1f89627f627e76eeIan Lake        Loader<Boolean> destroy(boolean reset) {
8138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake            mDestroyed = true;
825404d815b5a1cc57d7b1dc6c1f89627f627e76eeIan Lake            return super.destroy(reset);
8338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake        }
8438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake    }
8538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake}
86