package Ġio . ktor . client . test Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġplatform . Foundation .* Ċ import Ġkotlin . coroutines .* Ċ Ċ internal Ġclass ĠTest Dispatcher Ġ: ĠCor outine Dispatcher () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtasks Ġ= Ġmutable Set Of < Runnable >() ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch ( context : ĠCor outine Context , Ġblock : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtasks Ġ+= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġschedule ( block : Ġsuspend Ġ() Ġ-> ĠUnit , Ġon Done : Ġ( Throwable ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock . start Coroutine ( Test Continuation ( this , Ġon Done )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty () Ġ= Ġtasks . isEmpty () ĊĊĠĠĠ Ġfun Ġrun Single Task () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tasks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġtasks . iterator (). next () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . remove ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhelp () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠNS Date (). add Time Interval ( 1 . 0 ) Ġas ĠNS Date ĊĠĠĠĠĠĠĠ ĠNS Run Loop . main Run Loop . run Until Date ( date ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠTest Continuation ( ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠCor outine Context , ĊĠĠĠ Ġprivate Ġval Ġon Done : Ġ( Throwable ?) Ġ-> ĠUnit Ċ ) Ġ: ĠContinu ation < Unit > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġresume With ( result : ĠResult < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Done ( result . exception OrNull ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġhelp ( block : Ġsuspend ĠCor outine Dispatcher . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Dispatcher () ĊĠĠĠ Ġvar Ġdone Ġ= Ġfalse ĊĠĠĠ Ġvar Ġcause : ĠThrowable ? Ġ= Ġnull ĊĠĠĠ Ġdispatcher . schedule ({ Ġdispatcher . block () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġdone Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcause Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhile Ġ(! done ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatcher . run Single Task () ĊĠĠĠĠĠĠĠ Ġcause ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhile Ġ(! dispatcher . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatcher . run Single Task () ĊĠĠĠĠĠĠĠ Ġcause ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcause Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ