/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttps :// 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 . google . ac comp an ist . pager Ċ Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . aspect Ratio Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . text . Basic Text Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . platform . test Tag Ċ import Ġandroidx . compose . ui . test . Semantics Node Interaction Ċ import Ġandroidx . compose . ui . test . assert Height Is At Least Ċ import Ġandroidx . compose . ui . test . assert Left Position In Root Is EqualTo Ċ import Ġandroidx . compose . ui . test . assert Width Is EqualTo Ċ import Ġandroidx . compose . ui . test . getUn cli pped Bounds In Root Ċ import Ġandroidx . compose . ui . test . on Root Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . height Ċ import Ġandroidx . compose . ui . unit . width Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ Ċ @ Opt In ( Experimental Pager Api :: class ) Ġ// ĠP ager Ġis Ġcurrently Ġexperimental Ċ @ Large Test Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠVertical Pager Test ( ĊĠĠĠ Ġprivate Ġval Ġvertical Alignment : ĠAlignment . Vertical , ĊĠĠĠ Ġ// ĠWe Ġdon 't Ġuse Ġthe ĠD p Ġtype Ġdue Ġto Ġhttps :// yout rack . jetbrains . com / issue / KT - 3 5 5 2 3 ĊĠĠĠ Ġprivate Ġval Ġitem Spacing Dp : ĠInt , ĊĠĠĠ Ġoverride Ġval Ġoff screen Limit : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġreverse Layout : ĠBoolean , ĊĠĠĠ Ġoverride Ġval Ġinfinite Loop : ĠBoolean , Ċ ) Ġ: ĠP ager Test () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Parameterized . Parameters ĊĠĠĠĠĠĠĠ Ġfun Ġdata (): ĠCollection < Array < Any >> Ġ= Ġdataset ( false ) Ġ+ Ġdataset ( true ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdataset ( loop ing : ĠBoolean ): ĠCollection < Array < Any >> Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvertical Alignment , Ġitem Spacing Dp , Ġoff screen Limit , Ġreverse Layout , Ġinfinite Loop ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTest Ġtypical Ġfull - width Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Center Vert ically , Ġ 0 , Ġ 2 , Ġfalse , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Top , Ġ 0 , Ġ 2 , Ġfalse , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Bottom , Ġ 0 , Ġ 2 , Ġfalse , Ġlooping ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFull - width Ġitems Ġwith Ġspacing ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Center Vert ically , Ġ 4 , Ġ 2 , Ġfalse , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Top , Ġ 4 , Ġ 2 , Ġfalse , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Bottom , Ġ 4 , Ġ 2 , Ġfalse , Ġlooping ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFull - width Ġitems Ġwith Ġreverse Layout Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Center Vert ically , Ġ 0 , Ġ 2 , Ġtrue , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Top , Ġ 0 , Ġ 2 , Ġtrue , Ġlooping ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Bottom , Ġ 0 , Ġ 2 , Ġtrue , Ġlooping ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTest Ġan Ġincreased Ġoff screen Limit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Alignment . Center Vert ically , Ġ 0 , Ġ 4 , Ġfalse , Ġlooping ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠSem antics Node Interaction . swipe Ac ross Center ( ĊĠĠĠĠĠĠĠ Ġdistance Percentage : ĠFloat , ĊĠĠĠĠĠĠĠ Ġvelocity : ĠFloat , ĊĠĠĠ Ġ): ĠSem antics Node Interaction Ġ= Ġswipe Ac ross Center With Velocity ( ĊĠĠĠĠĠĠĠ Ġdistance Percentage Y Ġ= Ġif Ġ( reverse Layout ) Ġ- distance Percentage Ġelse Ġdistance Percentage , ĊĠĠĠĠĠĠĠ Ġvelocity Ġ= Ġvelocity , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠSem antics Node Interaction . assert La id Out Item Position ( ĊĠĠĠĠĠĠĠ Ġpage : ĠInt , ĊĠĠĠĠĠĠĠ ĠcurrentPage : ĠInt ĊĠĠĠ Ġ): ĠSem antics Node Interaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Bounds Ġ= Ġcompose Test Rule . on Root (). getUn cli pped Bounds In Root () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Item Size Ġ= Ġroot Bounds . width ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġexpected Ġcoordinates . ĠThis Ġuses Ġthe Ġimplicit Ġfact Ġthat ĠVertical Pager Ġby ĊĠĠĠĠĠĠĠ Ġ// Ġuse ĠAlignment . Center Vert ically Ġby Ġdefault , Ġand Ġthat Ġwe 're Ġusing Ġitems ĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġan Ġaspect Ġratio Ġof Ġ 1 : 1 ĊĠĠĠĠĠĠĠ Ġval Ġexpected Left Ġ= Ġ( root Bounds . width Ġ- Ġexpected Item Size ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġexpected First Item Top Ġ= Ġwhen Ġ( vertical Alignment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlignment . Top Ġ-> Ġ 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlignment . Bottom Ġ-> Ġroot Bounds . height Ġ- Ġexpected Item Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ/* ĠAlignment . Center Vert ically Ġ*/ Ġ-> Ġ( root Bounds . height Ġ- Ġexpected Item Size ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġassert Width Is EqualTo ( expected Item Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Height Is At Least ( expected Item Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Left Position In Root Is EqualTo ( expected Left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Delta Ġ= Ġ(( expected Item Size Ġ+ Ġitem Spacing Dp . dp ) Ġ* Ġ( page Ġ- ĠcurrentPage )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġsure Ġwhy , Ġbut Ġthere 's Ġa Ġrounding Ġerror Ġsomewhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġreduce Ġthis Ġtolerance Ġand Ġwork Ġout Ġwhere Ġthe Ġissue Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reverse Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Top Position In Root Is EqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Top Ġ= Ġexpected First Item Top Ġ- Ġpage Delta , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtolerance Ġ= Ġ 1 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Top Position In Root Is EqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Top Ġ= Ġexpected First Item Top Ġ+ Ġpage Delta , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtolerance Ġ= Ġ 1 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Pager Content ( page Count : ĠInt ): ĠP ager State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpager State Ġ= ĠP ager State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Count Ġ= Ġpage Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff screen Limit Ġ= Ġoff screen Limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfinite Loop Ġ= Ġinfinite Loop , ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ Ġtesting Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠSt ick Ġto ĠL TR Ġfor Ġvertical Ġtests ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent ( Layout Direction . L tr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp lier Scope Ġ= Ġremember Coroutine Scope () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVertical Pager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġpager State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Spacing Ġ= Ġitem Spacing Dp . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Layout Ġ= Ġreverse Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Alignment Ġ= Ġvertical Alignment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. aspect Ratio ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( random Color ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test Tag ( page . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġpage . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . align ( Alignment . Center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpager State ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġversion Ġof Ġ` assert Top Position In Root Is EqualTo ` Ġwhich Ġallows Ġsetting Ġof Ġthe Ġtolerance . Ċ Ġ*/ Ċ private Ġfun ĠSem antics Node Interaction . assert Top Position In Root Is EqualTo ( ĊĠĠĠ Ġexpected Top : ĠD p , ĊĠĠĠ Ġtolerance : ĠD p Ġ= Ġ 0 . 5 . dp Ċ ): ĠSem antics Node Interaction Ġ{ ĊĠĠĠ ĠassertThat ( getUn cli pped Bounds In Root (). top . value ) ĊĠĠĠĠĠĠĠ Ġ. is Within ( tolerance . value ) ĊĠĠĠĠĠĠĠ Ġ. of ( expected Top . value ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ