package Ġp mp uro . button en abler Ċ Ċ import Ġcom . google . common . truth . Truth Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . take Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ import Ġjava . io . IOException Ċ Ċ private Ġconst Ġval ĠKEY _ CLICK ED Ġ= Ġ" CLICK ED " Ċ private Ġconst Ġval ĠKEY _ DISABLED Ġ= Ġ" DISABLED " Ċ private Ġconst Ġval ĠKEY _ ENABLED Ġ= Ġ" ENABLED " Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠButton En abler Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġevents Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` the Ġdefault Ġvalue Ġis Ġtrue `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ ĠButton En abler ( this ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( enabled . value ). isEqualTo ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Click s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( enabled . value ). isEqualTo ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` handler Ġcalls Ġthe Ġaction `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtested Ġ= ĠButton En abler ( this ) Ġ{ Ġevents . add ( KEY _ CLICK ED ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstarter Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested . handle Click s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( tested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstarter . await () ĊĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( events ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ CLICK ED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` handler Ġemits Ġdisabled Ġwhile Ġclick Ġhandled `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtested Ġ= ĠButton En abler ( this ) Ġ{ Ġevents . add ( KEY _ CLICK ED ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcollector Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstarter Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested . handle Click s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtested . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠlistOf ( collector , Ġstarter ). await All () ĊĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( events ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ENABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ DISABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ CLICK ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ENABLED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` action Ġt oler ates Ġexceptions Ġbut Ġhandle Click s Ġreturns `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaction Throws Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġtested Ġ= ĠButton En abler ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( KEY _ CLICK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Throws ) Ġthrow ĠIOException (" example Ġexception ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcollector Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstarter Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtested . handle Click s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtested . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Throws Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Throws Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" Not Ġhappens ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠlistOf ( collector , Ġstarter ). await All () ĊĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( events ). contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ENABLED , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ DISABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ CLICK ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ENABLED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` handle Click s Ġreturns Ġthe Ġexception `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" example Ġexception " ĊĊĠĠĠĠĠĠĠ Ġval Ġtested Ġ= ĠButton En abler ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġstarter Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtested . handle Click s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtested . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstarter . await () ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( result ). isInstanceOf ( IOException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` null Ġreturned Ġif Ġno Ġexception `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Action : Ġsuspend Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠĠĠĠĠ Ġval Ġtested Ġ= ĠButton En abler ( this , Ġempty Action ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġasync ( this . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtested . handle Click s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtested . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandler . await () ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( result ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < String >. add Event ( enabled : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ Ġadd ( if Ġ( enabled ) ĠKEY _ ENABLED Ġelse ĠKEY _ DISABLED ) Ċ } Ċ