/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 Ġandroidx . paging Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . Measure Spec . EX ACT LY Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Adapter List Update Callback Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . List Update Callback Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . common . truth . Truth . assert With Message Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠFor Ġsome Ġtests , Ġthis Ġtest Ġuses Ġa Ġreal Ġre cycler view Ġwith Ġa Ġreal Ġadapter Ġto Ġserve Ġas Ġan Ċ Ġ* Ġintegration Ġtest Ġso Ġthat Ġwe Ġcan Ġvalidate Ġall Ġupdates Ġand Ġstate Ġrest or ations Ġafter Ġupdates . Ċ Ġ*/ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Large Test Ċ class ĠNull P added List Diff With RecyclerView Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠNull P added ListAdapter ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext Ġ= ĠApplication Provider . getApplicationContext () ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠRecyclerView ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . item Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠNull P added ListAdapter () ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġthis Ġis Ġno Ġdifferent Ġthat Ġinit Ġbut Ġreads Ġbetter Ġin Ġtests Ġto Ġhave Ġa Ġreset Ġmethod ĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmeasure And Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cyclerView . measure ( EX ACT LY Ġor Ġ 1 0 0 , ĠEX ACT LY Ġor ĠR V _ HEIGHT ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout ( 0 , Ġ 0 , Ġ 1 0 0 , ĠR V _ HEIGHT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbasic () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 0 , Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadapter . set Items ( storage ) ĊĠĠĠĠĠĠĠ Ġmeasure And Layout () ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= Ġcapture UIS napshot () ĊĠĠĠĠĠĠĠ ĠassertThat ( snapshot ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Expected Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Item Top Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Item Index Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List Ġ= Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ fully Over lapping Range () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ loaded Before _ or _ After () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 5 , Ġcount Ġ= Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ part ially Over lapping () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ f ew er Items Loaded _ with More Place holders Before () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ no Place holders Left () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ more Items Loaded () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ more Items Loaded _ and Also More Offset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 , Ġcount Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 0 0 , Ġcount Ġ= Ġ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ expand Shrink () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 , Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġa Ġstate Ġrest or ation Ġtest Ġwith Ġvarious Ġ" current Ġscroll Ġpositions ". ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdistinct List Test _ with Var ious Initial Positions ( ĊĠĠĠĠĠĠĠ Ġpre : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġpost : ĠNull P added Storage ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġrest oring Ġpositions Ġin Ġdifferent Ġlist Ġstates ĊĠĠĠĠĠĠĠ Ġval Ġmin Size Ġ= Ġmin Of ( pre . size , Ġpost . size ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Test able Position Ġ= Ġ( min Size Ġ- Ġ( RV _ HEIGHT Ġ/ ĠITEM _ HEIGHT )). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠ Ġ( 0 .. last Test able Position ). forEach Ġ{ Ġinitial Pos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistinct List Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial List Pos Ġ= Ġinitial Pos , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistinct List Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpost , Ġ// Ġintention al , Ġwe Ġare Ġtrying Ġto Ġtest Ġgoing Ġin Ġreverse Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial List Pos Ġ= Ġinitial Pos , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ visible Range Removed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 , Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 0 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġswap List Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Swap Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . scroll By ( 0 , Ġ 3 0 Ġ* ĠITEM _ HEIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ= Ġ{ Ġ_, Ġnew Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( new Snapshot ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Expected Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Item Index Ġ= Ġpost . size Ġ- ĠR V _ HEIGHT Ġ/ ĠITEM _ HEIGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List Ġ= Ġpost ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdistinct Lists _ validate Diff () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 , Ġ 1 0 ), Ġ// Ġtheir Ġpositions Ġwon 't Ġbe Ġin Ġthe Ġnew Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( 1 0 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate Diff Test ( pre , Ġpost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Large Test ĊĠĠĠ Ġfun Ġrandom _ distinct List Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġa Ġrandom Ġtest Ġbut Ġif Ġit Ġfails , Ġthe Ġexception Ġwill Ġhave Ġenough Ġinformation Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġan Ġisolated Ġtest ĊĠĠĠĠĠĠĠ Ġval Ġrand Ġ= ĠRandom ( System . nano Time ()) ĊĠĠĠĠĠĠĠ Ġfun Ġrandom Null P added Storage ( start Id : ĠInt ) Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Id Ġ= Ġstart Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrepeat ( RANDOM _ TEST _ REPEAT _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Diff Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġrandom Null P added Storage ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġrandom Null P added Storage ( 1 _ 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcontinuous Match _ 1 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 1 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 1 3 , Ġcount Ġ= Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 9 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate Diff Test ( pre , Ġpost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcontinuous Match _ 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 6 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 9 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 4 , Ġcount Ġ= Ġ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate Diff Test ( pre , Ġpost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcontinuous Match _ 3 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 7 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate Diff Test ( pre , Ġpost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcontinuous Match _ 4 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 0 , Ġcount Ġ= Ġ 1 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 1 8 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġ 1 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( start Id Ġ= Ġ 5 , Ġcount Ġ= Ġ 1 7 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġ 9 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate Diff Test ( pre , Ġpost ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Large Test ĊĠĠĠ Ġfun Ġrandom Test _ with Continuous Match () Ġ{ ĊĠĠĠĠĠĠĠ Ġrandom Continuous Match Test ( shuffle Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Large Test ĊĠĠĠ Ġfun Ġrandom Test _ with Continuous Match _ with Shuffle () Ġ{ ĊĠĠĠĠĠĠĠ Ġrandom Continuous Match Test ( shuffle Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthat Ġif Ġtwo Ġlists Ġhave Ġsome Ġoverlap s , Ġwe Ġdispatch Ġthe Ġright Ġdiff Ġevents . ĊĠĠĠĠ Ġ* ĠIt Ġcan Ġalso Ġoptionally Ġshuffle Ġthe Ġlists . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrandom Continuous Match Test ( shuffle : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġa Ġrandom Ġtest Ġbut Ġif Ġit Ġfails , Ġthe Ġexception Ġwill Ġhave Ġenough Ġinformation Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġan Ġisolated Ġtest ĊĠĠĠĠĠĠĠ Ġval Ġrand Ġ= ĠRandom ( System . nano Time ()) ĊĠĠĠĠĠĠĠ Ġfun Ġrandom Null P added Storage ( start Id : ĠInt ) Ġ= ĠNull P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders Before Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcreate Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Id Ġ= Ġstart Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shuffle ) Ġit . sh uffled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholders After Ġ= Ġrand . nextInt ( 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrepeat ( RANDOM _ TEST _ REPEAT _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre Ġ= Ġrandom Null P added Storage ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Ġ= Ġrandom Null P added Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Id Ġ= Ġif Ġ( pre . storage Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre . get From Storage ( rand . nextInt ( pre . storage Count )). id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Diff Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠValid ates Ġthat Ġthe Ġupdate Ġevents Ġbetween Ġ[ pre ] Ġand Ġ[ post ] Ġare Ġcorrect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Diff Test ( ĊĠĠĠĠĠĠĠ Ġpre : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġpost : ĠNull P added Storage ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠValid ating List Update Callback ( pre , Ġpost ) ĊĠĠĠĠĠĠĠ Ġval Ġdiff Result Ġ= Ġpre . compute Diff ( post , ĠNull P added ListItem . CALLBACK ) ĊĠĠĠĠĠĠĠ Ġpre . dispatch Diff ( callback , Ġpost , Ġdiff Result ) ĊĠĠĠĠĠĠĠ Ġcallback . validate Running List Again st () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdistinct List Test ( ĊĠĠĠĠĠĠĠ Ġpre : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġpost : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġinitial List Pos : ĠInt , ĊĠĠĠĠĠĠĠ Ġfinal List Pos : ĠInt Ġ= Ġinitial List Pos ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġwith Ġvarious Ġinitial Ġlist Ġposition ing . ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġevery Ġcase , Ġwe Ġshould Ġpreserve Ġour Ġposition ĊĠĠĠĠĠĠĠ Ġswap List Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Ġ= Ġpre , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġpost , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Swap Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . scroll By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial List Pos Ġ* ĠITEM _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Ġ= Ġ{ Ġ_, Ġsnapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Ġpos : Ġ$ initial List Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġfinal Ġpos : Ġ$ final List Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre : Ġ$ pre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost : Ġ$ post ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). that ( snapshot ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Expected Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Item Index Ġ= Ġfinal List Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List Ġ= Ġpost ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġto Ġrun Ġtests Ġwhere Ġwe Ġsubmit Ġthe Ġ[ pre ] Ġlist , Ġrun Ġ[ pre Swap Action ] Ġ( where Ġit ĊĠĠĠĠ Ġ* Ġcan Ġscroll Ġetc ) Ġthen Ġsubmit Ġ[ post ] Ġlist , Ġrun Ġ[ post Swap Action ] Ġand Ġthen Ġcall Ġ[ validate ] ĊĠĠĠĠ Ġ* Ġwith ĠUI Ġsnapshots . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġswap List Test ( ĊĠĠĠĠĠĠĠ Ġpre : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġpost : ĠNull P added Storage , ĊĠĠĠĠĠĠĠ Ġpre Swap Action : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġpost Swap Action : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġvalidate : Ġ( pre Capture : ĠList < UI Item Snapshot >, Ġpost Capture : ĠList < UI Item Snapshot >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter . set Items ( pre ) ĊĠĠĠĠĠĠĠ Ġmeasure And Layout () ĊĠĠĠĠĠĠĠ Ġpre Swap Action () ĊĠĠĠĠĠĠĠ Ġval Ġpre Snapshot Ġ= Ġcapture UIS napshot () ĊĠĠĠĠĠĠĠ Ġadapter . set Items ( post ) ĊĠĠĠĠĠĠĠ Ġpost Swap Action () ĊĠĠĠĠĠĠĠ Ġmeasure And Layout () ĊĠĠĠĠĠĠĠ Ġval Ġpost Snapshot Ġ= Ġcapture UIS napshot () ĊĠĠĠĠĠĠĠ Ġvalidate ( pre Snapshot , Ġpost Snapshot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCapt ures Ġpositions Ġand Ġdata Ġof Ġeach Ġvisible Ġitem Ġin Ġthe ĠRecyclerView . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcapture UIS napshot (): ĠList < UI Item Snapshot > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġre cyclerView . child Count ). map NotNull Ġ{ Ġchild Pos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġre cyclerView . getChild At ( child Pos ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . top Ġ< ĠR V _ HEIGHT Ġ&& Ġview . bottom Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠviewHolder Ġ= Ġre cyclerView . getChild ViewHolder ( view ) Ġas ĠNull P added ListView Holder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUI Item Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġview . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound Item Ġ= ĠviewHolder . bound Item , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound Pos Ġ= ĠviewHolder . bound Pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCustom Ġadapter Ġclass Ġthat Ġalso Ġvalidates Ġits Ġupdate Ġevents Ġto Ġensure Ġthey Ġare Ġcorrect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠNull P added ListAdapter Ġ: ĠRecyclerView . Adapter < Null P added ListView Holder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitems : ĠNull P added List < Null P added ListItem >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Items ( items : ĠNull P added List < Null P added ListItem >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Items Ġ= Ġthis . items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Items Ġ= Ġthis . items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Items Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Range Inserted ( 0 , Ġitems . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġmy Items . compute Diff ( items , ĠNull P added ListItem . CALLBACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Observer Ġ= ĠTracking Adapter Observer ( previous Items , Ġitems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Adapter Data Observer ( diff Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠAdapter List Update Callback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Items . dispatch Diff ( callback , Ġitems , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Adapter Data Observer ( diff Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Observer . validate Running List Again st () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items Ġ= Ġitems ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Type : ĠInt ĊĠĠĠĠĠĠĠ Ġ): ĠNull P added ListView Holder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNull P added ListView Holder ( parent . context ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . item View . layout Params Ġ= ĠRecyclerView . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠNull P added ListView Holder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitems ?. get ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bound Item Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bound Pos Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitems ?. size Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠNull P added ListItem ( ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠCALL BACK Ġ= Ġobject Ġ: ĠDiff Util . Item Callback < Null P added ListItem >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item : ĠNull P added ListItem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Item : ĠNull P added ListItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item : ĠNull P added ListItem , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Item : ĠNull P added ListItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNull P added ListView Holder ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext ĊĠĠĠ Ġ) Ġ: ĠRecyclerView . ViewHolder ( View ( context )) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbound Item : ĠNull P added ListItem ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġbound Pos : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" VH [$ bound Pos Ġ, Ġ$ bound Item ]" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠUI Item Snapshot ( ĊĠĠĠĠĠĠĠ Ġ// Ġtop Ġcoordinate Ġof Ġthe Ġitem ĊĠĠĠĠĠĠĠ Ġval Ġtop : ĠInt , ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġitem Ġit Ġis Ġbound Ġto , Ġunless Ġit Ġwas Ġa Ġplaceholder ĊĠĠĠĠĠĠĠ Ġval Ġbound Item : ĠNull P added ListItem ?, ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġposition Ġit Ġwas Ġbound Ġto ĊĠĠĠĠĠĠĠ Ġval Ġbound Pos : ĠInt ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġclass ĠNull P added Storage ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġplaceholders Before : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata : ĠList < Null P added ListItem >, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġplaceholders After : ĠInt ĊĠĠĠ Ġ) Ġ: ĠNull P added List < Null P added ListItem > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstring Representation Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ placeholders Before :${ data . size }: $ placeholders After ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget From Storage ( local Index : ĠInt ): ĠNull P added ListItem Ġ= Ġdata [ local Index ] ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġplaceholders Before Ġ+ Ġdata . size Ġ+ Ġplaceholders After ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstorage Count : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġstring Representation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Items ( ĊĠĠĠĠĠĠĠ Ġstart Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġcount : ĠInt ĊĠĠĠ Ġ): ĠList < Null P added ListItem > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( start Id Ġuntil Ġstart Id Ġ+ Ġcount ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNull P added ListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ"$ it " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġexpected ĠUI Ġsnapshot Ġbased Ġon Ġthe Ġgiven Ġlist Ġand Ġscroll Ġposition Ġ/ Ġoffset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Expected Snapshot ( ĊĠĠĠĠĠĠĠ Ġfirst Item Top Offset : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġstart Item Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġbacking List : ĠNull P added List < Null P added ListItem > ĊĠĠĠ Ġ): ĠList < UI Item Snapshot > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( first Item Top Offset Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" first Ġitem Ġoffset Ġshould Ġnot Ġbe Ġnegative " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Height Ġ= ĠR V _ HEIGHT Ġ- Ġfirst Item Top Offset ĊĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġstart Item Index ĊĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= Ġfirst Item Top Offset ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < UI Item Snapshot >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ( remaining Height Ġ> Ġ 0 Ġ&& Ġpos Ġ< Ġbacking List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUI Item Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġtop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound Item Ġ= Ġbacking List . get ( pos ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbound Pos Ġ= Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ+= ĠITEM _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Height Ġ-= ĠITEM _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA ĠList Update Callback Ġimplementation Ġthat Ġtracks Ġall Ġchange Ġnotifications Ġand Ġthen Ġvalidate ĊĠĠĠĠ Ġ* Ġthat ĊĠĠĠĠ Ġ* Ġa ) Ġchanges Ġare Ġcorrect ĊĠĠĠĠ Ġ* Ġb ) Ġno Ġunnecessary Ġevents Ġare Ġdis patched Ġ( e . g . Ġdispatch ing Ġchange Ġfor Ġan Ġitem Ġthen Ġremoving ĊĠĠĠĠ Ġ* Ġit ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠValid ating List Update Callback < T >( ĊĠĠĠĠĠĠĠ Ġprevious List : ĠNull P added List < T > ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnew List : ĠNull P added List < T > ĊĠĠĠ Ġ) Ġ: ĠList Update Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġused Ġin Ġassertion Ġmessages ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold List : Ġ$ previous List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew List : Ġ$ new List ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġ// Ġall Ġchanges Ġare Ġapplied Ġto Ġthis Ġlist , Ġat Ġthe Ġend , Ġwe 'll Ġvalidate Ġagainst Ġthe Ġnew Ġlist ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġensure Ġall Ġupdates Ġmade Ġsense Ġand Ġno Ġunnecessary Ġupdates Ġare Ġmade ĊĠĠĠĠĠĠĠ Ġval Ġrunning List : ĠMutable List < List Snapshot Item > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious List ?. create Snapshot () Ġ?: Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġrunning List . size ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠInt . assert Within Bounds () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( this ). is At Least ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( this ). is At Most ( size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Inserted ( position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( count ). is At Least ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List . add ( position , ĠList Snapshot Item . Inserted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Removed ( position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( position Ġ+ Ġcount ). assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( count ). is At Least ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( position Ġuntil Ġposition Ġ+ Ġcount ). forEach Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ msg \ n should n 't Ġbe Ġremoving Ġan Ġitem Ġthat Ġalready Ġgot Ġa Ġchange Ġevent " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġpos : Ġ$ pos Ġ, Ġ${ running List [ pos ]}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( running List [ pos ]. is Original Item ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List . remove At ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Moved ( from Position : ĠInt , Ġto Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Position . assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Position . assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List . add ( to Position , Ġrunning List . remove At ( from Position )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( position : ĠInt , Ġcount : ĠInt , Ġpayload : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( position Ġ+ Ġcount ). assert Within Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( count ). is At Least ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( position Ġuntil Ġposition Ġ+ Ġcount ). forEach Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġwe Ġdon 't Ġdispatch Ġoverlapping Ġupdates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ msg \ n un necessary Ġchange Ġevent Ġfor Ġposition Ġ$ pos Ġ$ payload Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ running List [ pos ]}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( running List [ pos ]. is Original Item ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payload Ġ== ĠDiff ing Change Payload . PLACE HOLDER _ TO _ ITEM Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ== ĠDiff ing Change Payload . PLACE HOLDER _ POSITION _ CHANGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( running List [ pos ]). isInstanceOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Snapshot Item . Placeholder :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( running List [ pos ]). isInstanceOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Snapshot Item . Item :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List [ pos ] Ġ= ĠList Snapshot Item . Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= Ġpayload Ġas ? ĠDiff ing Change Payload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate Running List Again st () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġsize Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( size ). isEqualTo ( new List . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew List Snapshot Ġ= Ġnew List . create Snapshot () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List . forEach Indexed Ġ{ Ġindex , Ġlist Snapshot Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew ListItem Ġ= Ġnew List Snapshot [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Snapshot Item . assert Replacement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Snapshot Item . is Original Item ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġchanged , Ġreplace Ġfrom Ġnew Ġsnapshot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning List [ index ] Ġ= Ġnew List Snapshot [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnow Ġafter Ġthis , Ġeach Ġlist Ġmust Ġbe Ġexactly Ġequal , Ġif Ġnot , Ġsomething Ġis Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( running List ). contains Exactly Elements In ( new List Snapshot ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTracking Adapter Observer < T >( ĊĠĠĠĠĠĠĠ Ġprevious List : ĠNull P added List < T > ?, ĊĠĠĠĠĠĠĠ Ġpost List : ĠNull P added List < T > ĊĠĠĠ Ġ) Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallback Ġ= ĠValid ating List Update Callback ( previous List , Ġpost List ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Changed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Changed ( position Start , Ġitem Count , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Changed ( position Start : ĠInt , Ġitem Count : ĠInt , Ġpayload : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Changed ( position Start , Ġitem Count , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Inserted ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Removed ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġvalidate Running List Again st () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . validate Running List Again st () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR V _ HEIGHT Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠITEM _ HEIGHT Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR AN DOM _ TEST _ REPEAT _ SIZE Ġ= Ġ 1 _ 0 0 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > ĠNull P added List < T >. get ( index : ĠInt ): ĠT ? Ġ{ ĊĠĠĠ Ġif Ġ( index Ġ< Ġplaceholders Before ) Ġreturn Ġnull ĊĠĠĠ Ġval Ġstorage Index Ġ= Ġindex Ġ- Ġplaceholders Before ĊĠĠĠ Ġif Ġ( storage Index Ġ>= Ġstorage Count ) Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġget From Storage ( storage Index ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġsnapshot Ġof Ġthis Ġcurrent Ġthat Ġcan Ġbe Ġused Ġto Ġverify Ġdiffs . Ċ Ġ*/ Ċ private Ġfun Ġ< T > ĠNull P added List < T >. create Snapshot (): ĠMutable List < List Snapshot Item > Ġ= Ġ( 0 Ġuntil Ġsize ) ĊĠĠĠ Ġ. map To ( mutable ListOf ()) Ġ{ Ġpos Ġ-> ĊĠĠĠĠĠĠĠ Ġget ( pos )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList Snapshot Item . Item ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠList Snapshot Item . Placeholder ( pos ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠSe aled Ġclasses Ġto Ġidentify Ġitems Ġin Ġthe Ġlist . Ċ Ġ*/ Ċ internal Ġsealed Ġclass ĠList Snapshot Item Ġ{ ĊĠĠĠ Ġ// Ġmeans Ġthe Ġitem Ġdidn 't Ġchange Ġat Ġall Ġin Ġdiffs . ĊĠĠĠ Ġfun Ġis Original Item () Ġ= Ġthis Ġis ĠItem < *> Ġ|| Ġthis Ġis ĠPlace holder ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAssert s Ġthat Ġthis Ġitem Ġproperly Ġrepresents Ġthe Ġreplacement Ġ( new ListItem ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġassert Replacement ( ĊĠĠĠĠĠĠĠ Ġmsg : ĠString , ĊĠĠĠĠĠĠĠ Ġnew ListItem : ĠList Snapshot Item ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠItem < T >( val Ġitem : ĠT ) Ġ: ĠList Snapshot Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassert Replacement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem : ĠList Snapshot Item ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isEqualTo ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠPlace holder ( val Ġpos : ĠInt ) Ġ: ĠList Snapshot Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassert Replacement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem : ĠList Snapshot Item ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isInstanceOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace holder :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplacement Ġ= Ġnew ListItem Ġas ĠPlace holder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġposition Ġdidn 't Ġchange . ĠIf Ġit Ġdid , Ġwe Ġwould Ġbe Ġreplaced Ġwith Ġa Ġ[ Changed ]. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isEqualTo ( replacement . pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInsert ed Ġinto Ġthe Ġlist Ġwhen Ġwe Ġreceive Ġa Ġchange Ġnotification Ġabout Ġan Ġitem / placeholder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠChanged ( val Ġpayload : ĠDiff ing Change Payload ?) Ġ: ĠList Snapshot Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassert Replacement ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew ListItem : ĠList Snapshot Item ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġ 4 Ġcases Ġfor Ġchanges . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġeither Ġplaceholder Ġ-> Ġplaceholder Ġwith Ġnew Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġplaceholder Ġto Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġitem Ġto Ġplaceholder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġitem Ġchange Ġfrom Ġoriginal Ġdiff ing . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( payload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiff ing Change Payload . ITEM _ TO _ PLACE HOLDER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( new ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( Placeholder :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiff ing Change Payload . PLACE HOLDER _ TO _ ITEM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( new ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( Item :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiff ing Change Payload . PLACE HOLDER _ POSITION _ CHANGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( new ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( Placeholder :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġitem Ġchange Ġthat Ġcame Ġfrom Ġdiff ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( msg ). that ( new ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( Item :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġwhen Ġan Ġitem / placeholder Ġis Ġinserted Ġto Ġthe Ġlist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠInsert ed Ġ: ĠList Snapshot Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassert Replacement ( msg : ĠString , Ġnew ListItem : ĠList Snapshot Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġassert Ġhere , Ġit Ġcan Ġrepresent Ġanything Ġin Ġthe Ġnew Ġlist . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }