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