package Ġcom . ba eld ung . coroutines Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . system . measure Time Millis Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertTrue ĊĊ Ċ class ĠCor outines Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Build Sequence _ when Take N Elements _ then Should Return It In AL azy Way () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠ Ġval Ġfib onacci Seq Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( a Ġ+ Ġb ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġa Ġ+ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġtmp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġfib onacci Seq . take ( 5 ). toList () ĊĊĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠ ĠassertEquals ( res , ĠlistOf ( 1 , Ġ 1 , Ġ 2 , Ġ 3 , Ġ 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Lazy Seq _ when Take N Elements _ then Should Return All Elements () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠ Ġval Ġlazy Seq Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" START Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" STEP Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" END ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġlazy Seq . take ( 1 0 ). toList () ĊĊĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠ ĠassertEquals ( res , ĠlistOf ( 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Async Coroutine _ when Start It _ then Should Execute It InThe Async Way () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġexpensive Computation ( res ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . add (" Hello , ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠ ĠassertEquals ( res , ĠlistOf (" Hello ,", Ġ" word ! ")) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġexpensive Computation ( res : ĠMutable List < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġres . add (" word !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven H uge Amount Of Cor outines _ when Start It _ then Should Execute It Without OutOf Memory () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Cor outines Ġ= Ġ 1 0 0 _ 0 0 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= ĠList ( numberOf Cor outines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter . increment AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . forEach Ġ{ Ġit . join () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( counter . get (), ĠnumberOf Cor outines ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven C ancellable Job _ when Request For Cancel _ then Should Quit () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" is Ġworking ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 3 0 0 L ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// then Ġcancel Ġsuccessfully ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Async Action _ when Declare Timeout _ then Should Finish When Timed Out () Ġ{ Ċĉ ĉ assert Fails With ( Cancellation Exception :: class ){ ĊĠĠĠĠĠĠĠ Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout ( 1 3 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 0 0 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Some Ġexpensive Ġcomputation Ġ$ i Ġ... ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċĉ ĉ } ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Have Two Ex pensive Action _ when Execute The m Async _ then They Should Run Concurrent ly () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġasync ( Dispatch ers . Default ) Ġ{ Ġsome Ex pensive Computation ( delay ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo Ġ= Ġasync ( Dispatch ers . Default ) Ġ{ Ġsome Ex pensive Computation ( delay ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( time Ġ< Ġdelay Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven Two Ex pensive Action _ when Execute The m Lazy _ then They Should Not Concurrent ly () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// given ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġasync ( Dispatch ers . Default , ĠCor outine Start . LA ZY ) Ġ{ Ġsome Ex pensive Computation ( delay ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo Ġ= Ġasync ( Dispatch ers . Default , ĠCor outine Start . LA ZY ) Ġ{ Ġsome Ex pensive Computation ( delay ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// when ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo . await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// then ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( time Ġ> Ġdelay Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsome Ex pensive Computation ( delay In Milliseconds : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelay ( delay In Milliseconds ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ