/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ @ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġkotlinx . coroutines . test Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . internal .* Ċ import Ġkotlin . coroutines .* Ċ Ċ /** Ċ Ġ* ĠA Ġscope Ġwhich Ġprovides Ġdetailed Ġcontrol Ġover Ġthe Ġexecution Ġof Ġcor outines Ġfor Ġtests . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Deprecated (" Use Ġ` Test Scope ` Ġin Ġcombination Ġwith Ġ` run Test ` Ġinstead ") Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġsealed Ġinterface ĠTest Coroutine Scope Ġ: ĠCor outine Scope Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġafter Ġthe Ġtest Ġcompletes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ* ĠIt Ġchecks Ġthat Ġthere Ġwere Ġno Ġun caught Ġexceptions Ġcaught Ġby Ġits Ġ[ Coroutine ExceptionHandler ]. ĊĠĠĠĠ Ġ* ĠĠ ĠIf Ġthere Ġwere Ġany , Ġthen Ġthe Ġfirst Ġone Ġis Ġthrown , Ġwhereas Ġthe Ġrest Ġare Ġsupp ressed Ġby Ġit . ĊĠĠĠĠ Ġ* Ġ* ĠIt Ġruns Ġthe Ġtasks Ġpending Ġin Ġthe Ġscheduler Ġat Ġthe Ġcurrent Ġtime . ĠIf Ġthere Ġare Ġany Ġun completed Ġtasks Ġafterwards , ĊĠĠĠĠ Ġ* ĠĠ Ġit Ġfails Ġwith Ġ[ Un completed Cor outines Error ]. ĊĠĠĠĠ Ġ* Ġ* ĠIt Ġchecks Ġwhether Ġsome Ġnew Ġchild Ġ[ Job ] s Ġwere Ġcreated Ġbut Ġnot Ġcompleted Ġsince Ġthis Ġ[ Test Coroutine Scope ] Ġwas ĊĠĠĠĠ Ġ* ĠĠ Ġcreated . ĠIf Ġso , Ġit Ġfails Ġwith Ġ[ Un completed Cor outines Error ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġbackward Ġcompatibility , Ġif Ġthe Ġ[ Coroutine ExceptionHandler ] Ġis Ġan Ġ[ Un caught Exception Captor ], Ġits ĊĠĠĠĠ Ġ* Ġ[ Test Coroutine ExceptionHandler . cleanup Test Cor outines ] Ġbehavior Ġis Ġperformed . ĊĠĠĠĠ Ġ* ĠL ik ew ise , Ġif Ġthe Ġ[ Continuation Interceptor ] Ġis Ġa Ġ[ Delay Controller ], Ġits Ġ[ Delay Controller . cleanup Test Cor outines ] ĊĠĠĠĠ Ġ* Ġis Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠThrowable Ġthe Ġfirst Ġun caught Ġexception , Ġif Ġthere Ġare Ġany Ġun caught Ġexceptions . ĊĠĠĠĠ Ġ* Ġ@ throws ĠAssertionError Ġif Ġany Ġpending Ġtasks Ġare Ġactive . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġcalled Ġmore Ġthan Ġonce . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ Deprecated (" Please Ġcall Ġ` run Test `, Ġwhich Ġautomatically Ġperforms Ġthe Ġcleanup , Ġinstead Ġof Ġusing Ġthis Ġfunction .") ĊĠĠĠ Ġ// ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 ĊĠĠĠ Ġpublic Ġfun Ġcleanup Test Cor outines () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġdelay - sk ipping Ġscheduler Ġused Ġby Ġthe Ġtest Ġdispatch ers Ġrunning Ġthe Ġcode Ġin Ġthis Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġpublic Ġval Ġtest Scheduler : ĠTest Coroutine Scheduler Ċ } Ċ Ċ private Ġclass ĠTest Coroutine Scope Impl ( ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ċ ) Ġ: ĠTest Coroutine Scope Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠSynchron ized Object () ĊĠĠĠ Ġprivate Ġvar Ġexceptions Ġ= Ġmutable ListOf < Throwable >() ĊĠĠĠ Ġprivate Ġvar Ġcleaned Up Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReports Ġan Ġexception Ġso Ġthat Ġit Ġis Ġthrown Ġon Ġ[ cleanup Test Cor outines ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġseveral Ġexceptions Ġare Ġreported , Ġonly Ġthe Ġfirst Ġone Ġwill Ġbe Ġthrown , Ġand Ġthe Ġother Ġones Ġwill Ġbe Ġsupp ressed Ġby ĊĠĠĠĠ Ġ* Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġ` false ` Ġif Ġ[ cleanup Test Cor outines ] Ġwas Ġalready Ġcalled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreport Exception ( throwable : ĠThrowable ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleaned Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions . add ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġtest Scheduler : ĠTest Coroutine Scheduler ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcoroutine Context [ Test Coroutine Scheduler ] !! ĊĊĠĠĠ Ġ/** ĠThese Ġjobs Ġexisted Ġbefore Ġthe Ġcoroutine Ġscope Ġwas Ġused , Ġso Ġit 's Ġal right Ġif Ġthey Ġdon 't Ġget Ġcancelled . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġinitial Jobs Ġ= Ġcoroutine Context . active Jobs () ĊĊĠĠĠ Ġoverride Ġfun Ġcleanup Test Cor outines () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelay Controller Ġ= Ġcoroutine Context . delay Controller ĊĠĠĠĠĠĠĠ Ġval Ġhas Un finished Jobs Ġ= Ġif Ġ( delay Controller Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Controller . cleanup Test Cor outines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn completed Cor outines Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Scheduler . run Current () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! test Scheduler . is Idle ( strict Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( coroutine Context [ Coroutine ExceptionHandler ] Ġas ? ĠUn caught Exception Captor )?. cleanup Test Cor outines () ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleaned Up ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" At tempting Ġto Ġclean Ġup Ġa Ġtest Ġcoroutine Ġscope Ġmore Ġthan Ġonce .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleaned Up Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexceptions . first OrNull ()?. let Ġ{ Ġto Throw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexceptions . drop ( 1 ). forEach Ġ{ Ġto Throw . add Sup pressed ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġto Throw ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Un finished Jobs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn completed Cor outines Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Un finished Ġcor outines Ġduring Ġteardown . ĠEnsure Ġall Ġcor outines Ġare " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġcompleted Ġor Ġcancelled Ġby Ġyour Ġtest ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= Ġcoroutine Context . active Jobs () ĊĠĠĠĠĠĠĠ Ġif Ġ(( jobs Ġ- Ġinitial Jobs ). isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn completed Cor outines Error (" Test Ġfinished Ġwith Ġactive Ġjobs : Ġ$ jobs ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠCor outine Context . active Jobs (): ĠSet < Job > Ġ{ ĊĠĠĠ Ġreturn ĠcheckNotNull ( this [ Job ]). children . filter Ġ{ Ġit . isActive Ġ}. toSet () Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġcoroutine Ġscope Ġfor Ġlaunch ing Ġtest Ġcor outines Ġusing Ġ[ Test Coroutine Dispatcher ]. Ċ Ġ* Ċ Ġ* Ġ[ create Test Coroutine Scope ] Ġis Ġa Ġsimilar Ġfunction Ġthat Ġdefaults Ġto Ġ[ Standard Test Dispatcher ]. Ċ Ġ*/ Ċ @ Deprecated ( ĊĠĠĠ Ġ" This Ġconstructs Ġa Ġ` Test Coroutine Scope ` Ġwith Ġa Ġdeprecated Ġ` Coroutine Dispatcher ` Ġby Ġdefault . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Please Ġuse Ġ` create Test Coroutine Scope ` Ġinstead .", ĊĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠ Ġ" create Test Coroutine Scope ( Test Coroutine Dispatcher () Ġ+ ĠTest Coroutine ExceptionHandler () Ġ+ Ġcontext )", ĊĠĠĠĠĠĠĠ Ġ" kotlin . coroutines . Empty Coroutine Context " ĊĠĠĠ Ġ), ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġfun ĠTest Coroutine Scope ( context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context ): ĠTest Coroutine Scope Ġ{ ĊĠĠĠ Ġval Ġscheduler Ġ= Ġcontext [ Test Coroutine Scheduler ] Ġ?: ĠTest Coroutine Scheduler () ĊĠĠĠ Ġreturn Ġcreate Test Coroutine Scope ( Test Coroutine Dispatcher ( scheduler ) Ġ+ ĠTest Coroutine ExceptionHandler () Ġ+ Ġcontext ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġcoroutine Ġscope Ġfor Ġlaunch ing Ġtest Ġcor outines . Ċ Ġ* Ċ Ġ* ĠIt Ġensures Ġthat Ġall Ġthe Ġtest Ġmodule Ġm achinery Ġis Ġproperly Ġinitialized . Ċ Ġ* Ġ* ĠIf Ġ[ context ] Ġdoesn 't Ġdefine Ġa Ġ[ Test Coroutine Scheduler ] Ġfor Ġorche str ating Ġthe Ġvirtual Ġtime Ġused Ġfor Ġdelay - sk ipping , Ċ Ġ* ĠĠ Ġa Ġnew Ġone Ġis Ġcreated , Ġunless Ġeither Ċ Ġ* ĠĠ Ġ- Ġa Ġ[ Test Dispatcher ] Ġis Ġprovided , Ġin Ġwhich Ġcase Ġ[ Test Dispatcher . scheduler ] Ġis Ġused ; Ċ Ġ* ĠĠ Ġ- Ġat Ġthe Ġmoment Ġof Ġthe Ġcreation Ġof Ġthe Ġscope , Ġ[ Dispatch ers . Main ] Ġis Ġdeleg ated Ġto Ġa Ġ[ Test Dispatcher ], Ġin Ġwhich Ġcase Ċ Ġ* ĠĠĠĠ Ġits Ġ[ Test Coroutine Scheduler ] Ġis Ġused . Ċ Ġ* Ġ* ĠIf Ġ[ context ] Ġdoesn 't Ġhave Ġa Ġ[ Continuation Interceptor ], Ġa Ġ[ Standard Test Dispatcher ] Ġis Ġcreated . Ċ Ġ* Ġ* ĠA Ġ[ Coroutine ExceptionHandler ] Ġis Ġcreated Ġthat Ġmakes Ġ[ Test Coroutine Scope . cleanup Test Cor outines ] Ġthrow Ġif Ġthere Ġwere Ċ Ġ* ĠĠ Ġany Ġun caught Ġexceptions , Ġor Ġforwards Ġthe Ġexceptions Ġfurther Ġin Ġa Ġplatform - specific Ġmanner Ġif Ġthe Ġcleanup Ġwas Ċ Ġ* ĠĠ Ġalready Ġperformed Ġwhen Ġan Ġexception Ġhappened . ĠPass ing Ġa Ġ[ Coroutine ExceptionHandler ] Ġis Ġillegal , Ġunless Ġit 's Ġan Ċ Ġ* ĠĠ Ġ[ Un caught Exception Captor ], Ġin Ġwhich Ġcase Ġthe Ġbehavior Ġis Ġpreserved Ġfor Ġthe Ġtime Ġbeing Ġfor Ġbackward Ġcompatibility . Ċ Ġ* ĠĠ ĠIf Ġyou Ġneed Ġto Ġhave Ġa Ġspecific Ġ[ Coroutine ExceptionHandler ], Ġplease Ġpass Ġit Ġto Ġ[ launch ] Ġon Ġan Ġalready - created Ċ Ġ* ĠĠ Ġ[ Test Coroutine Scope ] Ġand Ġshare Ġyour Ġuse Ġcase Ġat Ċ Ġ* ĠĠ Ġ[ our Ġissue Ġtracker ]( https :// github . com / Kotlin / kotlin x . coroutines / issues ). Ċ Ġ* Ġ* ĠIf Ġ[ context ] Ġprovides Ġa Ġ[ Job ], Ġthat Ġjob Ġis Ġused Ġfor Ġthe Ġnew Ġscope ; Ġotherwise , Ġa Ġ[ Comp letable Job ] Ġis Ġcreated . Ċ Ġ* Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ context ] Ġhas Ġboth Ġ[ Test Coroutine Scheduler ] Ġand Ġa Ġ[ Test Dispatcher ] Ġlinked Ġto Ġa Ċ Ġ* Ġdifferent Ġscheduler . Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ context ] Ġhas Ġa Ġ[ Continuation Interceptor ] Ġthat Ġis Ġnot Ġa Ġ[ Test Dispatcher ]. Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ[ context ] Ġhas Ġan Ġ[ Coroutine ExceptionHandler ] Ġthat Ġis Ġnot Ġan Ċ Ġ* Ġ[ Un caught Exception Captor ]. Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Deprecated ( ĊĠĠĠ Ġ" This Ġfunction Ġwas Ġintroduced Ġin Ġorder Ġto Ġhelp Ġmigrate Ġfrom ĠTest Coroutine Scope Ġto ĠTest Scope . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Please Ġuse ĠTest Scope () Ġconstruction Ġinstead , Ġor Ġjust Ġrun Test (), Ġwithout Ġcreating Ġa Ġscope .", ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġfun Ġcreate Test Coroutine Scope ( context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context ): ĠTest Coroutine Scope Ġ{ ĊĠĠĠ Ġval Ġctx With Dispatcher Ġ= Ġcontext . with Delay Skipping () ĊĠĠĠ Ġvar Ġscope : ĠTest Coroutine Scope Impl ? Ġ= Ġnull ĊĠĠĠ Ġval Ġown ExceptionHandler Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠAbstract Coroutine Context Element ( Coroutine ExceptionHandler ), ĠTest Coroutine Scope ExceptionHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Exception ( context : ĠCor outine Context , Ġexception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! scope !!. report Exception ( exception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception Ġ// Ġlet Ġthis Ġexception Ġcrash Ġeverything ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġval Ġexception Handler Ġ= Ġwhen Ġ( val Ġexception Handler Ġ= Ġctx With Dispatcher [ Coroutine ExceptionHandler ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUn caught Exception Captor Ġ-> Ġexception Handler ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġown ExceptionHandler ĊĠĠĠĠĠĠĠ Ġis ĠTest Coroutine Scope ExceptionHandler Ġ-> Ġown ExceptionHandler ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" A ĠCor outine ExceptionHandler Ġwas Ġpassed Ġto ĠTest Coroutine Scope . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġpass Ġit Ġas Ġan Ġargument Ġto Ġa Ġ` launch ` Ġor Ġ` async ` Ġblock Ġon Ġan Ġalready - created Ġscope Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" if Ġun caught Ġexceptions Ġrequire Ġspecial Ġtreatment ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġjob : ĠJob Ġ= Ġctx With Dispatcher [ Job ] Ġ?: ĠJob () ĊĠĠĠ Ġreturn ĠTest Coroutine Scope Impl ( ctx With Dispatcher Ġ+ Ġexception Handler Ġ+ Ġjob ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġscope Ġ= Ġit ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠA Ġmarker Ġthat Ġshows Ġthat Ġthis Ġ[ Coroutine ExceptionHandler ] Ġwas Ġcreated Ġfor Ġ[ Test Coroutine Scope ]. ĠWith Ġthis , Ċ Ġ* Ġconstructing Ġa Ġnew Ġ[ Test Coroutine Scope ] Ġwith Ġthe Ġ[ Coroutine Scope . coroutine Context ] Ġof Ġan Ġexisting Ġone Ġwill Ġoverride Ċ Ġ* Ġthe Ġexception Ġhandler , Ġinstead Ġof Ġfailing . Ġ*/ Ċ private Ġinterface ĠTest Coroutine Scope ExceptionHandler Ġ: ĠCor outine ExceptionHandler Ċ Ċ private Ġinline Ġval ĠCor outine Context . delay Controller : ĠDelay Controller ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġthis [ Continuation Interceptor ] ĊĠĠĠĠĠĠĠ Ġreturn Ġhandler Ġas ? ĠDelay Controller ĊĠĠĠ Ġ} ĊĊ Ċ /** Ċ Ġ* ĠThe Ġcurrent Ġvirtual Ġtime Ġon Ġ[ test Scheduler ][ Test Coroutine Scope . test Scheduler ]. Ċ Ġ* Ġ@ see ĠTest Coroutine Scheduler . currentTime Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ public Ġval ĠTest Coroutine Scope . currentTime : ĠLong ĊĠĠĠ Ġget () Ġ= Ġcoroutine Context . delay Controller ?. currentTime Ġ?: Ġtest Scheduler . currentTime Ċ Ċ /** Ċ Ġ* ĠAdv ances Ġthe Ġ[ test Scheduler ][ Test Coroutine Scope . test Scheduler ] Ġby Ġ[ delay Time Millis ] Ġand Ġruns Ġthe Ġtasks Ġup Ġto Ġthat Ċ Ġ* Ġmoment Ġ( inclusive ). Ċ Ġ* Ċ Ġ* Ġ@ see ĠTest Coroutine Scheduler . advance Time By Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Deprecated ( ĊĠĠĠ Ġ" The Ġname Ġof Ġthis Ġfunction Ġis Ġmis leading : Ġit Ġnot Ġonly Ġadv ances Ġthe Ġtime , Ġbut Ġalso Ġruns Ġthe Ġtasks Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" scheduled Ġ* at * Ġthe Ġending Ġmoment .", ĊĠĠĠ ĠReplace With (" this . test Scheduler . apply Ġ{ Ġadvance Time By ( delay Time Millis ); Ġrun Current () Ġ} "), ĊĠĠĠ ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġfun ĠTest Coroutine Scope . advance Time By ( delay Time Millis : ĠLong ): ĠUnit Ġ= ĊĠĠĠ Ġwhen Ġ( val Ġcontroller Ġ= Ġcoroutine Context . delay Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Scheduler . advance Time By ( delay Time Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Scheduler . run Current () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . advance Time By ( delay Time Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠAdv ances Ġthe Ġ[ test Scheduler ][ Test Coroutine Scope . test Scheduler ] Ġto Ġthe Ġpoint Ġwhere Ġthere Ġare Ġno Ġtasks Ġremaining . Ċ Ġ* Ġ@ see ĠTest Coroutine Scheduler . advance Until Idle Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ public Ġfun ĠTest Coroutine Scope . advance Until Idle () Ġ{ ĊĠĠĠ Ġcoroutine Context . delay Controller ?. advance Until Idle () Ġ?: Ġtest Scheduler . advance Until Idle () Ċ } Ċ Ċ /** Ċ Ġ* ĠRun Ġany Ġtasks Ġthat Ġare Ġpending Ġat Ġthe Ġcurrent Ġvirtual Ġtime , Ġaccording Ġto Ċ Ġ* Ġthe Ġ[ test Scheduler ][ Test Coroutine Scope . test Scheduler ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠTest Coroutine Scheduler . run Current Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ public Ġfun ĠTest Coroutine Scope . run Current () Ġ{ ĊĠĠĠ Ġcoroutine Context . delay Controller ?. run Current () Ġ?: Ġtest Scheduler . run Current () Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ @ Deprecated ( ĊĠĠĠ Ġ" The Ġtest Ġcoroutine Ġscope Ġisn 't Ġable Ġto Ġpause Ġits Ġdispatch ers Ġin Ġthe Ġgeneral Ġcase . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Only Ġ` Test Coroutine Dispatcher ` Ġsupports Ġpa using ; Ġpause Ġit Ġdirectly , Ġor Ġuse Ġa Ġdispatcher Ġthat Ġis Ġalways Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\" paused \", Ġlike Ġ` Standard Test Dispatcher `. ", ĊĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠ Ġ"( this . coroutine Context [ Continuation Interceptor ] !! Ġas ĠDelay Controller ). pause Dispatcher ( block )", ĊĠĠĠĠĠĠĠ Ġ" kotlin . coroutines . Continuation Interceptor " ĊĠĠĠ Ġ), ĊĠĠĠ ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġsuspend Ġfun ĠTest Coroutine Scope . pause Dispatcher ( block : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġdelay Controller For Pa using . pause Dispatcher ( block ) Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ @ Deprecated ( ĊĠĠĠ Ġ" The Ġtest Ġcoroutine Ġscope Ġisn 't Ġable Ġto Ġpause Ġits Ġdispatch ers Ġin Ġthe Ġgeneral Ġcase . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Only Ġ` Test Coroutine Dispatcher ` Ġsupports Ġpa using ; Ġpause Ġit Ġdirectly , Ġor Ġuse Ġa Ġdispatcher Ġthat Ġis Ġalways Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\" paused \", Ġlike Ġ` Standard Test Dispatcher `. ", ĊĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠ Ġ"( this . coroutine Context [ Continuation Interceptor ] !! Ġas ĠDelay Controller ). pause Dispatcher ()", ĊĠĠĠĠĠĠĠ Ġ" kotlin . coroutines . Continuation Interceptor " ĊĠĠĠ Ġ), ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġfun ĠTest Coroutine Scope . pause Dispatcher () Ġ{ ĊĠĠĠ Ġdelay Controller For Pa using . pause Dispatcher () Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ @ Deprecated ( ĊĠĠĠ Ġ" The Ġtest Ġcoroutine Ġscope Ġisn 't Ġable Ġto Ġpause Ġits Ġdispatch ers Ġin Ġthe Ġgeneral Ġcase . Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Only Ġ` Test Coroutine Dispatcher ` Ġsupports Ġpa using ; Ġpause Ġit Ġdirectly , Ġor Ġuse Ġa Ġdispatcher Ġthat Ġis Ġalways Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\" paused \", Ġlike Ġ` Standard Test Dispatcher `. ", ĊĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠ Ġ"( this . coroutine Context [ Continuation Interceptor ] !! Ġas ĠDelay Controller ). resume Dispatcher ()", ĊĠĠĠĠĠĠĠ Ġ" kotlin . coroutines . Continuation Interceptor " ĊĠĠĠ Ġ), ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . WARNING Ċ ) Ċ // ĠSince Ġ 1 . 6 . 0 , ĠERROR Ġin Ġ 1 . 7 . 0 Ġand Ġremoved Ġas Ġexperimental Ġin Ġ 1 . 8 . 0 Ċ public Ġfun ĠTest Coroutine Scope . resume Dispatcher () Ġ{ ĊĠĠĠ Ġdelay Controller For Pa using . resume Dispatcher () Ċ } Ċ Ċ /** Ċ Ġ* ĠList Ġof Ġun caught Ġcoroutine Ġexceptions , Ġfor Ġbackward Ġcompatibility . Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġlist Ġis Ġa Ġcopy Ġof Ġthe Ġexceptions Ġcaught Ġduring Ġexecution . Ċ Ġ* ĠDuring Ġ[ Test Coroutine Scope . cleanup Test Cor outines ] Ġthe Ġfirst Ġelement Ġof Ġthis Ġlist Ġis Ġre throw n Ġif Ġit Ġis Ġnot Ġempty . Ċ Ġ* Ċ Ġ* ĠExceptions Ġare Ġonly Ġcollected Ġin Ġthis Ġlist Ġif Ġthe Ġ[ Un caught Exception Captor ] Ġis Ġin Ġthe Ġtest Ġcontext . Ċ Ġ*/ Ċ @ Deprecated ( ĊĠĠĠ Ġ" This Ġlist Ġis Ġonly Ġpopulated Ġif Ġ` Un caught Exception Captor ` Ġis Ġin Ġthe Ġtest Ġcontext , Ġand Ġso Ġcan Ġbe Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" eas ily Ġmis used . ĠIt Ġis Ġonly Ġpresent Ġfor Ġbackward Ġcompatibility Ġand Ġwill Ġbe Ġremoved Ġin Ġthe Ġsubsequent Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" releases . ĠIf Ġyou Ġneed Ġto Ġcheck Ġthe Ġlist Ġof Ġexceptions , Ġplease Ġconsider Ġcreating Ġyour Ġown Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ"` Coroutine ExceptionHandler `. ", ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . WARNING Ċ ) Ċ public Ġval ĠTest Coroutine Scope . unc a ught Exceptions : ĠList < Throwable > ĊĠĠĠ Ġget () Ġ= Ġ( coroutine Context [ Coroutine ExceptionHandler ] Ġas ? ĠUn caught Exception Captor )?. unc a ught Exceptions ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List () Ċ Ċ private Ġval ĠTest Coroutine Scope . delay Controller For Pa using : ĠDelay Controller ĊĠĠĠ Ġget () Ġ= Ġcoroutine Context . delay Controller ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" This Ġscope Ġisn 't Ġable Ġto Ġpause Ġits Ġdispatch ers ") Ċ