/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . example . paging . paging with network . reddit . ui Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Intent Ċ import Ġandroid . util . Log Ċ import Ġandroidx . arch . core . executor . testing . Count ing Task Executor Rule Ċ import Ġandroidx . test . Instrumentation Registry Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . android . example . paging . paging with network . R Ċ import Ġcom . android . example . paging . paging with network . reddit . Default Service Locator Ċ import Ġcom . android . example . paging . paging with network . reddit . Service Locator Ċ import Ġcom . android . example . paging . paging with network . reddit . api . Red dit Api Ċ import Ġcom . android . example . paging . paging with network . reddit . repository . Red dit Post Repository Ċ import Ġcom . android . example . paging . paging with network . reddit . ui . Red dit Activity . Companion . DEFAULT _ SUB RE DD IT Ċ import Ġcom . android . example . paging . paging with network . repository . Fake Red dit Api Ċ import Ġcom . android . example . paging . paging with network . repository . Post Factory Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġorg . hamcrest . Core Matchers .` is ` Ċ import Ġorg . hamcrest . Core Matchers . notNull Value Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . adapter . rx java 2 . Rx Java 2 Call Adapter Factory Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ /** Ċ Ġ* ĠSimple Ġsanity Ġtest Ġto Ġensure Ġdata Ġis Ġdisplayed Ċ Ġ*/ Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠRed dit Activity Test ( private Ġval Ġtype : ĠRed dit Post Repository . Type ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Parameterized . Parameters ( name Ġ= Ġ"{ 0 }") ĊĠĠĠĠĠĠĠ Ġfun Ġparams () Ġ= ĠRed dit Post Repository . Type . values () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġtest Rule Ġ= ĠCount ing Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval Ġpost Factory Ġ= ĠPost Factory () ĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfake Api Ġ= ĠFake Red dit Api () ĊĠĠĠĠĠĠĠ Ġfake Api . add Post ( post Factory . create Red dit Post ( DEFAULT _ SUB RE DD IT )) ĊĠĠĠĠĠĠĠ Ġfake Api . add Post ( post Factory . create Red dit Post ( DEFAULT _ SUB RE DD IT )) ĊĠĠĠĠĠĠĠ Ġfake Api . add Post ( post Factory . create Red dit Post ( DEFAULT _ SUB RE DD IT )) ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠInstrument ation Registry . getTarget Context (). application Context Ġas ĠApplication ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġa Ġcontrolled Ġservice Ġlocator Ġw / Ġfake ĠAPI ĊĠĠĠĠĠĠĠ ĠService Locator . swap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDefault Service Locator ( app Ġ= Ġapp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse InMemory Db Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Red dit Api (): ĠRed dit Api Ġ= Ġfake Api ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class , ĠTimeout Exception :: class ) ĊĠĠĠ Ġfun Ġshow Some Results () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠRed dit Activity . intent For ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= ĠInstrument ation Registry . getTarget Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= ĠInstrument ation Registry . get Instrumentation (). startActivity Sync ( intent ) ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġactivity . findViewById < RecyclerView >( R . id . list ) ĊĠĠĠĠĠĠĠ ĠassertThat ( re cyclerView . adapter , Ġnot NullValue ()) ĊĠĠĠĠĠĠĠ ĠwaitFor Adapter Change ( re cyclerView ) ĊĠĠĠĠĠĠĠ ĠassertThat ( re cyclerView . adapter ?. item Count , Ġ` is `( 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwaitFor Adapter Change ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ ĠInstrument ation Registry . get Instrumentation (). run On Main Sync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. register Adapter Data Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Rule . drain Tasks ( 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView . adapter ?. item Count Ġ?: Ġ 0 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( latch . await ( 1 0 , ĠTimeUnit . SECONDS ), Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġre dd it Top Test () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġlogger . level Ġ= ĠHttp Logging Interceptor . Level . BASIC ĊĊ Ċ // ĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () Ċ // Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // Ċ //// ĠĠĠĠĠĠĠ Ġ// https :// www . reddit . com / Ċ // ĠĠĠĠĠĠĠ Ġval Ġapi Ġ= Ġ ĠRet rofit . Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" http :// www . baidu . com /") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( client ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Rx Java 2 Call Adapter Factory . create ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Red dit Api :: class . java ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġapi Ġ= ĠRed dit Api . create () ĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor { Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠResponse Body . create ( MediaType . parse (" application / x - www - form - urlencoded "), Ġ"{ content : ĠHello ĠWorld }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠResponse . Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request ( it . request ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. protocol ( Protocol . HTTP _ 1 _ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. code ( 2 0 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( body ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message (" Test ĠMessage ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠHttp Logging Interceptor ( Http Logging Interceptor . Logger Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" API ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġlogger . level Ġ= ĠHttp Logging Interceptor . Level . BASIC ĊĊĊĠĠĠĠĠĠĠ Ġval Ġjson Str Ġ= Ġ"{\" name \":\" V ictor ĠA po yan \" }" ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠResponse Body . create ( MediaType . parse (" application / json "), Ġjson Str . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠResponse . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( json Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request ( it . request ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. protocol ( Protocol . HTTP _ 1 _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" content - type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġapi Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" https :// news . baidu . com /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Rx Java 2 Call Adapter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Red dit Api :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġapi . get Top Test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" API ", Ġit . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAssert . assertNotNull (" HelloWorld ") ĊĠĠĠ Ġ} ĊĊ Ċ }