/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAt Large ĠResearch Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . opend c . simulator . resources Ċ Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . opend c . simulator . core . run Blocking Simulation Ċ import Ġorg . opend c . simulator . resources . consumer . Sim Speed Consumer Adapter Ċ import Ġorg . opend c . simulator . resources . consumer . Sim Work Consumer Ċ Ċ /** Ċ Ġ* ĠA Ġtest Ġsuite Ġfor Ġthe Ġ[ Sim Resource Source ] Ġclass . Ċ Ġ*/ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠSim Resource Source Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Speed () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 0 0 0 Ġ* Ġcapacity , Ġcapacity )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Sim Resource Command . Exit ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Double >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠSim Speed Consumer Adapter ( consumer , Ġres :: add ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( adapter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 . 0 , Ġcapacity , Ġ 0 . 0 ), Ġres ) Ġ{ Ġ" Speed Ġis Ġreported Ġcorrectly " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Adjust Capacity () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( 1 . 0 , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġspy k ( Sim Work Consumer ( 2 . 0 , Ġ 1 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġprovider . consume ( consumer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . capacity Ġ= Ġ 0 . 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 0 0 0 , Ġclock . millis ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġconsumer . on Event ( any (), ĠSim Resource Event . Capacity ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Speed Limit () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 0 0 0 Ġ* Ġcapacity , Ġ 2 Ġ* Ġcapacity )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Sim Resource Command . Exit ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Double >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠSim Speed Consumer Adapter ( consumer , Ġres :: add ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( adapter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 . 0 , Ġcapacity , Ġ 0 . 0 ), Ġres ) Ġ{ Ġ" Speed Ġis Ġreported Ġcorrectly " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTest Ġto Ġsee Ġwhether Ġno Ġinfinite Ġrecursion Ġoccurs Ġwhen Ġinterrupt ing Ġduring Ġ[ Sim Resource Consumer . onStart ] Ġor ĊĠĠĠĠ Ġ* Ġ[ Sim Resource Consumer . onNext ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Intermediate Interrupt () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġobject Ġ: ĠSim Resource Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( ctx : ĠSim Resource Context ): ĠSim Resource Command Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSim Resource Command . Exit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Event ( ctx : ĠSim Resource Context , Ġevent : ĠSim Resource Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Interrupt () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġres Ctx : ĠSim Resource Context ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġobject Ġ: ĠSim Resource Consumer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis First Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Event ( ctx : ĠSim Resource Context , Ġevent : ĠSim Resource Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSim Resource Event . Start Ġ-> Ġres Ctx Ġ= Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( ctx : ĠSim Resource Context ): ĠSim Resource Command Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 . 0 , Ġctx . remaining Work ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is First ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSim Resource Command . Consume ( 4 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSim Resource Command . Exit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ctx . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġclock . millis ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Failure () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . on Event ( any (), Ġeq ( Sim Resource Event . Start )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Exception Propagation On Next () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 . 0 , Ġ 1 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Concurrent Consumption () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 . 0 , Ġ 1 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġprovider . consume ( consumer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Closed Consumption () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 . 0 , Ġ 1 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Close During Consumption () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Consume ( 1 . 0 , Ġ 1 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġprovider . consume ( consumer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 0 , Ġclock . millis ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Idle () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Idle ( clock . millis () Ġ+ Ġ 5 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Sim Resource Command . Exit ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 0 , Ġclock . millis ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Infinite Sleep () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Idle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then Throws ( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . consume ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Incorrect Deadline () Ġ= Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠSim Resource Scheduler Tr amp oline ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 2 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠSim Resource Source ( capacity , Ġscheduler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġmock k < Sim Resource Consumer >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġconsumer . onNext ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Sim Resource Command . Idle ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Sim Resource Command . Exit ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < IllegalArgumentException > Ġ{ Ġprovider . consume ( consumer ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ