Home | History | Annotate | Download | only in paging
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package androidx.paging
     18 
     19 import android.support.test.filters.SmallTest
     20 import io.reactivex.Observable
     21 import io.reactivex.observers.TestObserver
     22 import io.reactivex.schedulers.TestScheduler
     23 import org.junit.Assert.assertEquals
     24 import org.junit.Test
     25 import org.junit.runner.RunWith
     26 import org.junit.runners.JUnit4
     27 
     28 @SmallTest
     29 @RunWith(JUnit4::class)
     30 class RxPagedListBuilderTest {
     31 
     32     /**
     33      * Creates a data source that will sequentially supply the passed lists
     34      */
     35     private fun testDataSourceSequence(data: List<List<String>>): DataSource.Factory<Int, String> {
     36         return object : DataSource.Factory<Int, String>() {
     37             var localData = data
     38             override fun create(): DataSource<Int, String> {
     39                 val currentList = localData.first()
     40                 localData = localData.drop(1)
     41                 return ListDataSource<String>(currentList)
     42             }
     43         }
     44     }
     45 
     46     @Test
     47     fun basic() {
     48         val factory = testDataSourceSequence(listOf(listOf("a", "b"), listOf("c", "d")))
     49         val scheduler = TestScheduler()
     50         val observable = RxPagedListBuilder(factory, 10)
     51                 .setFetchScheduler(scheduler)
     52                 .setNotifyScheduler(scheduler)
     53                 .buildObservable()
     54         val observer = TestObserver<PagedList<String>>()
     55 
     56         observable.subscribe(observer)
     57 
     58         // initial state
     59         observer.assertNotComplete()
     60         observer.assertValueCount(0)
     61 
     62         // load first item
     63         scheduler.triggerActions()
     64         observer.assertValueCount(1)
     65         assertEquals(listOf("a", "b"), observer.values().first())
     66 
     67         // invalidate triggers second load
     68         observer.values().first().dataSource.invalidate()
     69         scheduler.triggerActions()
     70         observer.assertValueCount(2)
     71         assertEquals(listOf("c", "d"), observer.values().last())
     72     }
     73 
     74     @Test
     75     fun checkSchedulers() {
     76         val factory = testDataSourceSequence(listOf(listOf("a", "b"), listOf("c", "d")))
     77         val notifyScheduler = TestScheduler()
     78         val fetchScheduler = TestScheduler()
     79         val observable: Observable<PagedList<String>> = RxPagedListBuilder(
     80                 factory, 10)
     81                 .setFetchScheduler(fetchScheduler)
     82                 .setNotifyScheduler(notifyScheduler)
     83                 .buildObservable()
     84         val observer = TestObserver<PagedList<String>>()
     85         observable.subscribe(observer)
     86 
     87         // notify has nothing to do
     88         notifyScheduler.triggerActions()
     89         observer.assertValueCount(0)
     90 
     91         // fetch creates list, but observer doesn't see
     92         fetchScheduler.triggerActions()
     93         observer.assertValueCount(0)
     94 
     95         // now notify reveals item
     96         notifyScheduler.triggerActions()
     97         observer.assertValueCount(1)
     98     }
     99 }
    100