/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . material Ċ Ċ import Ġandroidx . compose . foundation . interaction . Interaction Ċ import Ġandroidx . compose . foundation . interaction . Mutable Interaction Source Ċ import Ġandroidx . compose . foundation . interaction . Press Interaction Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . required Size Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . layout . bounds In Parent Ċ import Ġandroidx . compose . ui . layout . on Glob ally Position ed Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . platform . Local Layout Direction Ċ import Ġandroidx . compose . ui . platform . Local View Configuration Ċ import Ġandroidx . compose . ui . platform . test Tag Ċ import Ġandroidx . compose . ui . semantics . ProgressBar Range Info Ċ import Ġandroidx . compose . ui . semantics . Semantics Actions Ċ import Ġandroidx . compose . ui . semantics . Semantics Properties Ċ import Ġandroidx . compose . ui . test . Semantics Matcher Ċ import Ġandroidx . compose . ui . test . assert Ċ import Ġandroidx . compose . ui . test . assert Height Is EqualTo Ċ import Ġandroidx . compose . ui . test . assert Range Info Equals Ċ import Ġandroidx . compose . ui . test . assert Width Is EqualTo Ċ import Ġandroidx . compose . ui . test . junit 4 . create Compose Rule Ċ import Ġandroidx . compose . ui . test . on Node With Tag Ċ import Ġandroidx . compose . ui . test . perform Semantics Action Ċ import Ġandroidx . compose . ui . test . perform Touch Input Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Medium Test Ċ import Ġcom . google . common . truth . Truth Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ Medium Test Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠSlider Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtag Ġ= Ġ" slider " ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġrule Ġ= Ġcreate Compose Rule () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider Position _ value Co erc ion () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Range Ġ= Ġ 0 f .. 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġ 2 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 1 f , Ġ 0 f .. 1 f , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġ- 1 2 3 1 4 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 0 f , Ġ 0 f .. 1 f , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġslider Position _ steps Throw When LessThan Zero () Ġ{ ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( value Ġ= Ġ 0 f , Ġon Value Change Ġ= Ġ{}, Ġsteps Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ semantics _ continuous () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Range Info Equals ( ProgressBar Range Info ( 0 f , Ġ 0 f .. 1 f , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert ( Semantics Matcher . key Is Defined ( Semantics Actions . Set Progress )) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 0 . 5 f , Ġ 0 f .. 1 f , Ġ 0 )) ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Semantics Action ( Semantics Actions . Set Progress ) Ġ{ Ġit ( 0 . 7 f ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 0 . 7 f , Ġ 0 f .. 1 f , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ semantics _ ste pped () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ}, Ġsteps Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Range Info Equals ( ProgressBar Range Info ( 0 f , Ġ 0 f .. 1 f , Ġ 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert ( Semantics Matcher . key Is Defined ( Semantics Actions . Set Progress )) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġ 0 . 6 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 0 . 6 f , Ġ 0 f .. 1 f , Ġ 4 )) ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Semantics Action ( Semantics Actions . Set Progress ) Ġ{ Ġit ( 0 . 7 5 f ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). assert Range Info Equals ( ProgressBar Range Info ( 0 . 8 f , Ġ 0 f .. 1 f , Ġ 4 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ semantics _ focus able () Ġ{ ĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( value Ġ= Ġ 0 f , Ġon Value Change Ġ= Ġ{}, Ġmodifier Ġ= ĠModifier . test Tag ( tag )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert ( Semantics Matcher . key Is Defined ( Semantics Properties . Focused )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ semantics _ disabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert ( Semantics Matcher . key Is Defined ( Semantics Properties . Disabled )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ drag () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 1 0 0 Ġ- Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ drag _ out _ of _ bounds () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat () Ġ+ Ġ 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 1 0 0 Ġ- Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ tap () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ tap _ range Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġrange End Ġ= Ġmutable State Of ( 0 . 2 5 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Range Ġ= Ġ 0 f .. range End . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġchange Ġto Ġ 1 Ġsince Ġ[ calculate Fraction ] Ġco er ces Ġbetween Ġ 0 .. 1 ĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange End . value Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ drag _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 1 0 0 Ġ+ Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ drag _ out _ of _ bounds _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat () Ġ+ Ġ 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 1 0 0 Ġ+ Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ tap _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ tap _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Fraction ( left : ĠFloat , Ġright : ĠFloat , Ġpos : ĠFloat ) Ġ= Ġwith ( rule . density ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= ĠThumb Radius . to Px () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġleft Ġ+ Ġoffset ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġright Ġ- Ġoffset ĊĊĠĠĠĠĠĠĠ Ġ(( pos Ġ- Ġstart ) Ġ/ Ġ( end Ġ- Ġstart )). coerce In ( 0 f , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ sizes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġrule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Material Content For Size Assertions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Max Width Ġ= Ġ 1 0 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Max Height Ġ= Ġ 1 0 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĠSlider ( value Ġ= Ġstate . value , Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Height Is EqualTo ( 4 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Width Is EqualTo ( 1 0 0 . dp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ min _ size () Ġ{ ĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( Modifier . required Size ( 0 . dp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Width Is EqualTo ( Thumb Radius Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Height Is EqualTo ( Thumb Radius Ġ* Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ no Un wanted Callback Calls () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcall Count Ġ= Ġmutable State Of ( 0 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Count . value Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( call Count . value ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ value Change Finished _ calledOnce () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġcall Count Ġ= Ġmutable State Of ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Finished Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Count . value Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( call Count . value ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ). perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 5 0 f , Ġ 5 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( call Count . value ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġslider _ interaction Source _ reset When Disposed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinteraction Source Ġ= ĠMutable Interaction Source () ĊĠĠĠĠĠĠĠ Ġvar Ġemit Slider Ġby Ġmutable State Of ( true ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġscope : ĠCor outine Scope ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġremember Coroutine Scope () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( emit Slider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source Ġ= Ġinteraction Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinteractions Ġ= Ġmutable ListOf < Interaction >() ĊĊĠĠĠĠĠĠĠ Ġscope !!. launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source . inter actions . collect Ġ{ Ġinteractions . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions ). isEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ Ġdown ( center ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions ). has Size ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions . first ()). isInstanceOf ( Press Interaction . Press :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDispose ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Slider Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions ). has Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions . first ()). isInstanceOf ( Press Interaction . Press :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( inter actions [ 1 ]). isInstanceOf ( Press Interaction . Cancel :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat (( inter actions [ 1 ] Ġas ĠPress Interaction . Cancel ). press ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( inter actions [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ drag Thumb () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 1 0 0 Ġ- Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ drag _ out _ of _ bounds () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat () Ġ+ Ġ 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 1 0 0 Ġ- Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ tap () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 1 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ tap _ range Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 2 5 f ) ĊĠĠĠĠĠĠĠ Ġval Ġrange End Ġ= Ġmutable State Of (. 2 5 f ) ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Range Ġ= Ġ 0 f .. range End . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġchange Ġto Ġ 1 Ġsince Ġ[ calculate Fraction ] Ġco er ces Ġbetween Ġ 0 .. 1 ĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange End . value Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( Offset ( center X Ġ+ Ġ 5 0 , Ġcenter Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ drag _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 1 0 0 Ġ+ Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ drag _ out _ of _ bounds _ rtl () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Layout Direction Ġprovides ĠLayout Direction . R tl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 f .. 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- width . toFloat (), Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( width . toFloat () Ġ+ Ġ 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 1 0 0 Ġ+ Ġs lop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ close Thumb s _ drag Right () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 . 5 f .. 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 . 5 f .. 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( s lop , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset ( 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ+ Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). isEqualTo ( 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ close Thumb s _ drag Left () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutable State Of ( 0 . 5 f .. 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġvar Ġs lop Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs lop Ġ= ĠLocal View Configuration . current . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġstate . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ Ġstate . value Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value ). isEqualTo ( 0 . 5 f .. 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġrule . on Node With Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. perform Touch Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- s lop Ġ- Ġ 1 , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove By ( Offset (- 1 0 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġhere Ġas Ġwe 're Ġin Ġrtl Ġand Ġgoing Ġin Ġthe Ġopposite Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Ġ= Ġcalculate Fraction ( left , Ġright , Ġcenter X Ġ- Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . start ). is Within ( 0 . 0 0 1 f ). of ( expected ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( state . value . end Inclusive ). isEqualTo ( 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegression Ġtest Ġfor Ġbug : Ġ 2 1 0 2 8 9 1 6 1 Ġwhere ĠRange Slider Ġwas Ġignoring Ġsome Ġmodifiers Ġlike Ġweight . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Opt In ( Experimental Material Api :: class ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrange Slider _ weight Modifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġslider Bounds Ġ= ĠRect ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġrule . set Material Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Local Density . current ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow ( Modifier . width ( 5 0 0 . to Dp ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( Modifier . required Size ( 1 0 0 . to Dp ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRange Slider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġ 0 f .. 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . test Tag ( tag ). weight ( 1 f ). on Glob ally Position ed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslider Bounds Ġ= Ġit . bounds In Parent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( Modifier . required Size ( 1 0 0 . to Dp ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( slider Bounds . left ). isEqualTo ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( slider Bounds . right ). isEqualTo ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ