1e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang/* 2e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * Copyright (C) 2017 The Android Open Source Project 3e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * 4e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * you may not use this file except in compliance with the License. 6e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * You may obtain a copy of the License at 7e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * 8e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * http://www.apache.org/licenses/LICENSE-2.0 9e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * 10e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * Unless required by applicable law or agreed to in writing, software 11e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * See the License for the specific language governing permissions and 14e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang * limitations under the License. 15e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang */ 16e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 17e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangpackage com.android.settings.dashboard; 18e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 19e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport android.app.Activity; 200bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyuleiimport android.support.v7.widget.LinearLayoutManager; 21efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang 22e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport com.android.settings.TestConfig; 230bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyuleiimport com.android.settings.dashboard.conditional.ConditionManager; 240bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyuleiimport com.android.settings.dashboard.conditional.FocusRecyclerView; 25aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhangimport com.android.settings.testutils.SettingsRobolectricTestRunner; 26e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport com.android.settingslib.drawer.CategoryKey; 27aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhangimport com.android.settingslib.drawer.DashboardCategory; 28cbf797e65ceb4e41ef094a861b8db23733965578Maurice Lamimport com.android.settingslib.drawer.Tile; 29e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 30e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.junit.Before; 31e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.junit.Test; 32e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.junit.runner.RunWith; 33e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.mockito.Mock; 34e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.mockito.MockitoAnnotations; 35e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.robolectric.annotation.Config; 36e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport org.robolectric.util.ReflectionHelpers; 37e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 38aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhangimport static org.mockito.ArgumentMatchers.nullable; 395b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Lingimport static org.mockito.Mockito.any; 409ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryadimport static org.mockito.Mockito.doNothing; 41e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport static org.mockito.Mockito.doReturn; 42e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport static org.mockito.Mockito.mock; 430bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyuleiimport static org.mockito.Mockito.never; 44e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport static org.mockito.Mockito.spy; 45e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport static org.mockito.Mockito.verify; 46e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangimport static org.mockito.Mockito.when; 47e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 489ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad 49e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang@RunWith(SettingsRobolectricTestRunner.class) 50e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 51e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhangpublic class DashboardSummaryTest { 52e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 53e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang @Mock 54e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang private DashboardAdapter mAdapter; 55e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang @Mock 56e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang private DashboardFeatureProvider mDashboardFeatureProvider; 570bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei @Mock 580bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei private FocusRecyclerView mDashboard; 590bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei @Mock 600bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei private LinearLayoutManager mLayoutManager; 610bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei @Mock 620bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei private ConditionManager mConditionManager; 63aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhang @Mock 64aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhang private SummaryLoader mSummaryLoader; 65e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 66e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang private DashboardSummary mSummary; 67e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 68e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang @Before 69e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang public void setUp() { 70e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang MockitoAnnotations.initMocks(this); 71e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang mSummary = spy(new DashboardSummary()); 72e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang ReflectionHelpers.setField(mSummary, "mAdapter", mAdapter); 73e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang ReflectionHelpers.setField(mSummary, "mDashboardFeatureProvider", 74e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang mDashboardFeatureProvider); 750bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei ReflectionHelpers.setField(mSummary, "mDashboard", mDashboard); 760bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei ReflectionHelpers.setField(mSummary, "mLayoutManager", mLayoutManager); 770bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei ReflectionHelpers.setField(mSummary, "mConditionManager", mConditionManager); 78aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhang ReflectionHelpers.setField(mSummary, "mSummaryLoader", mSummaryLoader); 79e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang } 80e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang 81e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang @Test 82e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang public void updateCategoryAndSuggestion_shouldGetCategoryFromFeatureProvider() { 83e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang doReturn(mock(Activity.class)).when(mSummary).getActivity(); 84e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang mSummary.updateCategoryAndSuggestion(null); 85aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhang 86aeb94f0e5cd22a0e7b4ef1e3fe486375ea5b8c0cFan Zhang verify(mSummaryLoader).updateSummaryToCache(nullable(DashboardCategory.class)); 87e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang verify(mDashboardFeatureProvider).getTilesForCategory(CategoryKey.CATEGORY_HOMEPAGE); 88e8a77c551ed3296dfe7958d68bea5993f2e5404eFan Zhang } 890bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei 900bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei @Test 910bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei public void onConditionChanged_PositionAtTop_ScrollToTop() { 920bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(1); 930bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei mSummary.onConditionsChanged(); 945b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling mSummary.onConditionsChanged(); 950bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei verify(mDashboard).scrollToPosition(0); 960bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei } 970bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei 980bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei @Test 990bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei public void onConditionChanged_PositionNotTop_RemainPosition() { 1000bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei when(mLayoutManager.findFirstCompletelyVisibleItemPosition()).thenReturn(2); 1010bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei mSummary.onConditionsChanged(); 1025b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling mSummary.onConditionsChanged(); 1030bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei verify(mDashboard, never()).scrollToPosition(0); 1040bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei } 105efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang 106efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang @Test 1075b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling public void onConditionChanged_firstCall_shouldIgnore() { 1085b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling mSummary.onConditionsChanged(); 1095b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling verify(mAdapter, never()).setConditions(any()); 1105b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling } 1115b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling 1125b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling @Test 1135b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling public void onConditionChanged_secondCall_shouldSetConditionsOnAdapter() { 1145b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling mSummary.onConditionsChanged(); 1155b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling mSummary.onConditionsChanged(); 1165b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling verify(mAdapter).setConditions(any()); 1175b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling } 1185b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling 1195b01294d8414cf03bbf7f4a2b30268537c03a0d7Doris Ling @Test 1209ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad public void onCategoryChanged_noRebuildOnFirstCall() { 121efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang doReturn(mock(Activity.class)).when(mSummary).getActivity(); 1229ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad doNothing().when(mSummary).rebuildUI(); 1239ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad mSummary.onCategoriesChanged(); 1249ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad verify(mSummary, never()).rebuildUI(); 1259ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad } 126efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang 1279ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad @Test 1289ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad public void onCategoryChanged_rebuildOnSecondCall() { 1299ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad doReturn(mock(Activity.class)).when(mSummary).getActivity(); 1309ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad doNothing().when(mSummary).rebuildUI(); 1319ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad mSummary.onCategoriesChanged(); 132efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang mSummary.onCategoriesChanged(); 1339ca41dd89a7d6af79e80ab4293f2f650185a9e27Soroosh Mariooryad verify(mSummary).rebuildUI(); 134efba6b4e143fe834dc3ded2cae0abc1a3e4748f7Fan Zhang } 135cbf797e65ceb4e41ef094a861b8db23733965578Maurice Lam 136cbf797e65ceb4e41ef094a861b8db23733965578Maurice Lam @Test 1374940539479cca6e95a4693cc260eaef48fc67d6bDoris Ling public void onSuggestionDismissed_shouldNotRebuildUI() { 138cbf797e65ceb4e41ef094a861b8db23733965578Maurice Lam mSummary.onSuggestionDismissed(mock(Tile.class)); 1394940539479cca6e95a4693cc260eaef48fc67d6bDoris Ling verify(mSummary, never()).rebuildUI(); 140cbf797e65ceb4e41ef094a861b8db23733965578Maurice Lam } 1410bb598c4d0c556ed509b8a0d1a365437e566348ejackqdyulei}