/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . test Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines .* Ċ Ċ /** Ċ Ġ* ĠExec utes Ġa Ġ[ test Body ] Ġinside Ġan Ġimmediate Ġexecution Ġdispatcher . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġsimilar Ġto Ġ[ run Blocking ] Ġbut Ġit Ġwill Ġimmediately Ġprogress Ġpast Ġdelays Ġand Ġinto Ġ[ launch ] Ġand Ġ[ async ] Ġblocks . Ċ Ġ* ĠYou Ġcan Ġuse Ġthis Ġto Ġwrite Ġtests Ġthat Ġexecute Ġin Ġthe Ġpresence Ġof Ġcalls Ġto Ġ[ delay ] Ġwithout Ġcausing Ġyour Ġtest Ġto Ġtake Ċ Ġ* Ġextra Ġtime . Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ@ Test Ċ Ġ* Ġfun Ġexample Test () Ġ= Ġrun Blocking Test Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġdeferred Ġ= Ġasync Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġdelay ( 1 _ 0 0 0 ) Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 _ 0 0 0 ) Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ}. await () Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġdeferred . await () Ġ// Ġresult Ġavailable Ġimmediately Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġrequires Ġthat Ġall Ġcor outines Ġlaunched Ġinside Ġ[ test Body ] Ġcomplete , Ġor Ġare Ġcancelled , Ġas Ġpart Ġof Ġthe Ġtest Ċ Ġ* Ġconditions . Ċ Ġ* Ċ Ġ* ĠUnhandled Ġexceptions Ġthrown Ġby Ġcor outines Ġin Ġthe Ġtest Ġwill Ġbe Ġre - throw n Ġat Ġthe Ġend Ġof Ġthe Ġtest . Ċ Ġ* Ċ Ġ* Ġ@ throws ĠUn completed Cor outines Error ĠIf Ġthe Ġ[ test Body ] Ġdoes Ġnot Ġcomplete Ġ( or Ġcancel ) Ġall Ġcor outines Ġthat Ġit Ġla unches Ċ Ġ* Ġ( including Ġcor outines Ġsus pended Ġon Ġjoin / await ). Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext Ġadditional Ġcontext Ġelements . ĠIf Ġ[ context ] Ġcontains Ġ[ Coroutine Dispatcher ] Ġor Ġ[ Coroutine ExceptionHandler ], Ċ Ġ* ĠĠĠĠĠĠĠ Ġthen Ġthey Ġmust Ġimplement Ġ[ Delay Controller ] Ġand Ġ[ Test Coroutine ExceptionHandler ] Ġrespectively . Ċ Ġ* Ġ@ param Ġtest Body ĠThe Ġcode Ġof Ġthe Ġunit - test . Ċ Ġ*/ Ċ public Ġfun Ġrun Blocking Test ( context : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , Ġtest Body : Ġsuspend ĠTest Coroutine Scope . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġ( safe Context , Ġdispatcher ) Ġ= Ġcontext . check Arguments () ĊĠĠĠ Ġval Ġstarting Jobs Ġ= Ġsafe Context . active Jobs () ĊĠĠĠ Ġval Ġscope Ġ= ĠTest Coroutine Scope ( safe Context ) ĊĠĠĠ Ġval Ġdeferred Ġ= Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . test Body () ĊĠĠĠ Ġ} ĊĠĠĠ Ġdispatcher . advance Until Idle () ĊĠĠĠ Ġdeferred . get Completion Exception OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠ Ġ} ĊĠĠĠ Ġscope . cleanup Test Cor outines () ĊĠĠĠ Ġval Ġending Jobs Ġ= Ġsafe Context . active Jobs () ĊĠĠĠ Ġif Ġ(( ending Jobs Ġ- Ġstarting Jobs ). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUn completed Cor outines Error (" Test Ġfinished Ġwith Ġactive Ġjobs : Ġ$ ending Jobs ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠCor outine Context . active Jobs (): ĠSet < Job > Ġ{ ĊĠĠĠ Ġreturn ĠcheckNotNull ( this [ Job ]). children . filter Ġ{ Ġit . isActive Ġ}. toSet () Ċ } Ċ Ċ /** Ċ Ġ* ĠConvenience Ġmethod Ġfor Ġcalling Ġ[ run Blocking Test ] Ġon Ġan Ġexisting Ġ[ Test Coroutine Scope ]. Ċ Ġ*/ Ċ // Ġtodo : Ġneed Ġdocumentation Ġon Ġhow Ġthis Ġextension Ġis Ġsupposed Ġto Ġbe Ġused Ċ public Ġfun ĠTest Coroutine Scope . run Blocking Test ( block : Ġsuspend ĠTest Coroutine Scope . () Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠ Ġrun Blocking Test ( coroutine Context , Ġblock ) Ċ Ċ /** Ċ Ġ* ĠConvenience Ġmethod Ġfor Ġcalling Ġ[ run Blocking Test ] Ġon Ġan Ġexisting Ġ[ Test Coroutine Dispatcher ]. Ċ Ġ*/ Ċ public Ġfun ĠTest Coroutine Dispatcher . run Blocking Test ( block : Ġsuspend ĠTest Coroutine Scope . () Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠ Ġrun Blocking Test ( this , Ġblock ) Ċ Ċ private Ġfun ĠCor outine Context . check Arguments (): ĠPair < Coroutine Context , ĠDelay Controller > Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġoptimize Ġit ĊĠĠĠ Ġval Ġdispatcher Ġ= Ġget ( Continuation Interceptor ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ?. let Ġ{ Ġrequire ( this Ġis ĠDelay Controller ) Ġ{ Ġ" Dispatcher Ġmust Ġimplement ĠDelay Controller : Ġ$ this " Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġthis Ġ?: ĠTest Coroutine Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexception Handler Ġ= Ġ Ġget ( Coroutine ExceptionHandler ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( this Ġis ĠUn caught Exception Captor ) Ġ{ Ġ" coroutine ExceptionHandler Ġmust Ġimplement ĠUn caught Exception Captor : Ġ$ this " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis Ġ?: ĠTest Coroutine ExceptionHandler () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġjob Ġ= Ġget ( Job ) Ġ?: ĠSuper visor Job () ĊĠĠĠ Ġreturn ĠPair ( this Ġ+ Ġdispatcher Ġ+ Ġexception Handler Ġ+ Ġjob , Ġdispatcher Ġas ĠDelay Controller ) Ċ } Ċ