/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 . compose . foundation Ċ Ċ import Ġandroidx . compose . animation . core . Exponent ial Dec ay Ċ import Ġandroidx . compose . animation . core . Manual Frame Clock Ċ import Ġandroidx . compose . animation . core . advance Clock Millis Ċ import Ġandroidx . compose . foundation . animation . Fl ing Config Ċ import Ġandroidx . compose . foundation . gest ures . Scroll able Controller Ċ import Ġandroidx . compose . foundation . gest ures . scroll able Ċ import Ġandroidx . compose . foundation . layout . Stack Ċ import Ġandroidx . compose . foundation . layout . preferred Size Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . gesture . scroll orientation lock ing . Orientation Ċ import Ġandroidx . compose . ui . platform . test Tag Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . milliseconds Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . ui . test . Test Ui Dispatcher Ċ import Ġandroidx . ui . test . center Ċ import Ġandroidx . ui . test . create Compose Rule Ċ import Ġandroidx . ui . test . mon otonic Frame Animation Clock Of Ċ import Ġandroidx . ui . test . on Node With Tag Ċ import Ġandroidx . ui . test . perform Gesture Ċ import Ġandroidx . ui . test . run Blocking With Manual Clock Ċ import Ġandroidx . ui . test . run On Idle Ċ import Ġandroidx . ui . test . run On Ui Thread Ċ import Ġandroidx . ui . test . swipe Ċ import Ġandroidx . ui . test . swipe With Velocity Ċ import Ġandroidx . ui . test . waitFor Idle Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . common . truth . Truth . assert With Message Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ Ċ @ Large Test Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠScroll able Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġcompose Test Rule Ġ= Ġcreate Compose Rule () ĊĊĠĠĠ Ġprivate Ġval Ġscroll able Box Tag Ġ= Ġ" scroll able Box " ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ horizontal Scroll () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Total Ġ= Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is GreaterThan ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x , Ġthis . center . y Ġ+ Ġ 1 0 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( last Total ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ- Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is LessThan ( 0 . 0 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ vertical Scroll () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Vertical ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x , Ġthis . center . y Ġ+ Ġ 1 0 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Total Ġ= Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is GreaterThan ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( last Total ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x , Ġthis . center . y Ġ- Ġ 1 0 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is LessThan ( 0 . 0 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ start Stop _ notify () Ġ= Ġrun Blocking With Manual Clock ( true ) Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġstart Trigger Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġstop Trigger Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll Started Ġ= Ġ{ Ġstart Trigger ++ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll Stopped Ġ= Ġ{ Ġstop Trigger ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( start Trigger ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stop Trigger ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġwait Ġfor Ġanimation Ġso Ġstop Ġis Ġ 0 , Ġas Ġwe Ġfl ing ing Ġstill ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( start Trigger ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stop Trigger ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġ// Ġafter Ġwait Ġwe Ġexpect Ġstop Ġto Ġtrigger ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( start Trigger ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stop Trigger ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ disabled W ont Call Lambda () Ġ= Ġrun Blocking With Manual Clock ( true ) Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġenabled Ġ= Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġenabled . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġval Ġprev Total Ġ= Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is GreaterThan ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( prev Total ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ velocity Proxy () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġvelocity Triggered Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll Stopped Ġ= Ġ{ Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Triggered Ġ= Ġvelocity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe With Velocity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Velocity Ġ= Ġ 1 1 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġadvance Ġclock s , Ġso Ġanimation Ġwon 't Ġtrigger Ġyet ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġinterrupt ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe With Velocity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ- Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Velocity Ġ= Ġ 3 1 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġfirst Ġvelocity , Ġas Ġfl ing Ġwas Ġdis rupted ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( velocity Triggered Ġ- Ġ 1 1 2 f ). is LessThan ( 0 . 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ start Without S lop _ if Fl ing ing () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġadvance Ġclock s ĊĠĠĠĠĠĠĠ Ġval Ġprev Total Ġ= Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is GreaterThan ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 1 4 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlast Ġswipe Ġshould Ġadd Ġexactly Ġ 1 1 4 Ġas Ġwe Ġdon 't Ġadvance Ġclock s Ġand Ġalready Ġfl ing ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġprev Total Ġ+ Ġ 1 1 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total Ġ- Ġexpected ). is LessThan ( 0 . 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ cancel _ calls Drag Stop () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġby Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġdrag Stopped Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Ġ< Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġcontroller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll Stopped Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Stopped ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 1 0 0 , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). is GreaterThan ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( drag Stopped ). isEqualTo ( 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ sn apping Scrolling () Ġ= Ġrun Blocking With Manual Clock ( true ) Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( orientation Ġ= ĠOrientation . Vertical , Ġcontroller Ġ= Ġcontroller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . smooth Scroll By ( 1 0 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( 1 0 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . smooth Scroll By (- 2 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( 8 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ explicit Dis posal () Ġ= Ġrun Blocking With Manual Clock ( true ) Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġdisposed Ġ= Ġmutable State Of ( false ) ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message (" Anim ating Ġafter Ġdispose ! "). that ( dis posed . value ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġset Scroll able Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dis posed . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . scroll able ( orientation Ġ= ĠOrientation . Vertical , Ġcontroller Ġ= Ġcontroller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . smooth Scroll By ( 3 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( 3 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . smooth Scroll By ( 2 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġadvance Ġclock s Ġyet , Ġtoggle Ġdisposed Ġvalue ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisposed . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġ// Ġstill Ġ 3 0 0 Ġand Ġdidn 't Ġfail Ġin Ġon Scroll Consumption Requested .. Ġlambda ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( total ). isEqualTo ( 3 0 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġscroll able _ nested Drag () Ġ= Ġrun Blocking With Manual Clock Ġ{ Ġclock Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġinner Drag Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġouter Drag Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġanimation Clock Ġ= Ġmon otonic Frame Animation Clock Of ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġouter State Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Drag Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġanimation Clock ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinner State Ġ= ĠScroll able Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Scroll Delta Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Drag Ġ+= Ġit Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Config Ġ= ĠF ling Config ( decay Animation Ġ= ĠExp onent ial Dec ay ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Clock Ġ= Ġanimation Clock ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Ġ= ĠContent Gravity . Center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test Tag ( scroll able Box Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. preferred Size ( 3 0 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġouter State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . preferred Size ( 3 0 0 . dp ). scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġinner State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠOrientation . Horizontal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Node With Tag ( scroll able Box Tag ). perform Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . swipe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġthis . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠOffset ( this . center . x Ġ+ Ġ 2 0 0 f , Ġthis . center . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlast Equal Drag Ġ= Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( inner Drag ). is GreaterThan ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( outer Drag ). is GreaterThan ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġconsumed Ġhalf Ġdelta Ġin Ġchild , Ġso Ġexactly Ġhalf Ġshould Ġgo Ġto Ġthe Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( outer Drag ). isEqualTo ( inner Drag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Drag ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġadvance Clock And Await Animation ( clock ) ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġnothing Ġshould Ġchange Ġas Ġwe Ġdon 't Ġdo Ġnested Ġfl ing ĊĠĠĠĠĠĠĠ Ġrun On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( outer Drag ). isEqualTo ( last Equal Drag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Scroll able Content ( scroll able Modifier Factory : Ġ@ Composable Ġ() Ġ-> ĠModifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompose Test Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll able Ġ= Ġscroll able Modifier Factory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test Tag ( scroll able Box Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. preferred Size ( 1 0 0 . dp ). then ( scroll able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadvance Clock And Await Animation ( clock : ĠManual Frame Clock ) Ġ{ ĊĠĠĠĠĠĠĠ ĠwaitFor Idle () ĊĠĠĠĠĠĠĠ Ġwith Context ( Test Ui Dispatcher . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclock . advance Clock Millis ( 5 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ