package Ġcom . soft bank robot ics . dx . pep per extras Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġcom . al de bar an . qi . Promise Ċ import Ġcom . soft bank robot ics . dx . pep per extras . util .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith ĊĊ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠCor outine Scope Ext Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest C ancell ing Async Future Future Cancel s The Coroutine () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġasync Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . request Cancellation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( job !!. is Completed ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( job !!. is Cancelled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠVery Ġuseful Ġfeature : Ġyou Ġcan Ġput Ġa Ġbig Ġtry Ġcatch Ġin Ġyour Ġasync Future Ġcalls . ĠIf Ġthe ĊĠĠĠ Ġ// Ġasync Future Ġget Ġcancelled , Ġdo Ġany Ġrequired Ġcleaning Ġinto Ġthe Ġcatch . ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest C ancell ing Async Future Can Be Ca ught () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġfuture . cancel ( true ) ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠOK ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest C ancell ing Async Future Can Be Ca ught When Using Await () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPromise < Void >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . future . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġfuture . request Cancellation () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Await OrNull Throws If Coroutine Scope Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPromise < Void >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . setOn Cancel Ġ{ Ġp . set Cancelled () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . future . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġfuture . request Cancellation () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Await OrNull DoesNot ThrowIf Future Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPromise < Void >() ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . setOn Cancel Ġ{ Ġp . set Cancelled () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . future . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġp . future . request Cancellation () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest IsActive () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// future . cancel ( true ) ĊĠĠĠĠĠĠĠ Ġfuture . request Cancellation () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmake S ure Await Stop Execution If Coroutine Scope Was Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexception Ca ught Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġfuture Cancelled Before Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPromise < Void >() ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( i Ġ< Ġ 9 9 9 9 9 9 9 9 ) Ġi += Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( future Cancelled Before Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Cancelled Before Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . future . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ca ught Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay ( 1 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġfuture . request Cancellation () ĊĠĠĠĠĠĠĠ Ġfuture Cancelled Before Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġfuture Cancelled Before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( before ) ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( after ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( exception Ca ught ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Execution In Single Th readed Global Scope Execute In One Thread () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Thread Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref Thread Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 1 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ref Thread , ĠThread . currentThread (). name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġfuture . await OrNull () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancellation DoesNot Propag ate To Children Of Global Scope () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnot Cancelled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfirst Child Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġfirst Ġcoroutine Ġis Ġnot Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Child Ġis Ġcancelled Ġ!! ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsecond Child Ġ= ĠSingle Thread . Global Scope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEven Ġif Ġthis Ġone Ġis Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" B oom ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Child . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Child . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( not Cancelled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancellation Propag ates To Children Of New Coroutine Scope () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnot Cancelled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠSingle Thread . new Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Child Ġ= Ġscope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġfirst Ġcoroutine Ġis Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Cancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Child Ġis Ġcancelled Ġ!! ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsecond Child Ġ= Ġscope . async Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthis Ġone Ġis Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" B oom ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Child . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Child . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertFalse ( not Cancelled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Async Future LA ZY Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtoggle Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠSingle Thread . Global Scope . async Future ( start Ġ= ĠCor outine Start . LA ZY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . await OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( toggle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }