10ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam/* 20ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Copyright (C) 2017 The Android Open Source Project 30ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 40ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 50ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * you may not use this file except in compliance with the License. 60ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * You may obtain a copy of the License at 70ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 80ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * http://www.apache.org/licenses/LICENSE-2.0 90ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 100ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Unless required by applicable law or agreed to in writing, software 110ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 120ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * See the License for the specific language governing permissions and 140ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * limitations under the License. 150ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam */ 160ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 170ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lampackage com.android.setupwizardlib.template; 180ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 190ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Matchers.anyInt; 200ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Matchers.eq; 210ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Mockito.doNothing; 220ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Mockito.doReturn; 230ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Mockito.spy; 240ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.mockito.Mockito.verify; 250ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport static org.robolectric.RuntimeEnvironment.application; 260ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 270ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.support.v7.widget.RecyclerView; 280ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.support.v7.widget.RecyclerView.OnScrollListener; 290ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 300ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.BuildConfig; 310ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner; 320ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 330ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.junit.Before; 340ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.junit.Test; 350ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.junit.runner.RunWith; 360ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.mockito.ArgumentCaptor; 370ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.mockito.Mock; 380ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.mockito.MockitoAnnotations; 390ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport org.robolectric.annotation.Config; 400ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 410ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam@Config(constants = BuildConfig.class, sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }) 420ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam@RunWith(SuwLibRobolectricTestRunner.class) 430ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lampublic class RecyclerViewScrollHandlingDelegateTest { 440ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 450ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Mock 460ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private RequireScrollMixin mRequireScrollMixin; 470ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 480ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private RecyclerView mRecyclerView; 490ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private RecyclerViewScrollHandlingDelegate mDelegate; 500ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private ArgumentCaptor<OnScrollListener> mListenerCaptor; 510ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 520ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Before 530ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void setUp() throws Exception { 540ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam MockitoAnnotations.initMocks(this); 550ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 560ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mRecyclerView = spy(new RecyclerView(application)); 570ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam doReturn(20).when(mRecyclerView).computeVerticalScrollRange(); 580ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam doReturn(0).when(mRecyclerView).computeVerticalScrollExtent(); 590ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam doReturn(0).when(mRecyclerView).computeVerticalScrollOffset(); 600ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mListenerCaptor = ArgumentCaptor.forClass(OnScrollListener.class); 610ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam doNothing().when(mRecyclerView).addOnScrollListener(mListenerCaptor.capture()); 620ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 630ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mDelegate = new RecyclerViewScrollHandlingDelegate(mRequireScrollMixin, mRecyclerView); 640ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mRecyclerView.layout(0, 0, 50, 50); 650ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 660ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 670ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Test 680ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void testRequireScroll() { 690ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mDelegate.startListening(); 700ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam verify(mRequireScrollMixin).notifyScrollabilityChange(true); 710ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 720ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 730ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Test 740ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void testScrolledToBottom() { 750ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mDelegate.startListening(); 760ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam verify(mRequireScrollMixin).notifyScrollabilityChange(true); 770ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 780ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam doReturn(20).when(mRecyclerView).computeVerticalScrollOffset(); 790ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mListenerCaptor.getValue().onScrolled(mRecyclerView, 0, 20); 800ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 810ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam verify(mRequireScrollMixin).notifyScrollabilityChange(false); 820ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 830ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 840ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Test 850ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void testClickScrollButton() { 860ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mDelegate.pageScrollDown(); 870ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam verify(mRecyclerView).smoothScrollBy(anyInt(), eq(50)); 880ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 890ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam} 90