package Ġcom . mir u ken . error Ċ Ċ import Ġcom . mir u ken . test . assert Async Ċ import Ġcom . mir u ken . callback . Handler Ċ import Ġcom . mir u ken . callback . plus Ċ import Ġcom . mir u ken . concurrent . Promise Ċ import Ġcom . mir u ken . protocol . proxy Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Test Name Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util .* Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertNull Ċ Ċ class ĠErrors Handler Test Ġ{ ĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field Ġval Ġtest Name Ġ= ĠTest Name () ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Suppress Ġresult Ġby Ġdefault `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠErrors Handler () ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠErrors ( handler ). handle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalArgumentException (" This Ġis Ġbad ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). then Ġ Ġ{ Ġhandled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġhandled Ġ= Ġtrue } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertFalse ( handled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Recover s Ġfrom Ġexception `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠPayment Tech () Ġ+ ĠErrors Handler () ĊĠĠĠĠĠĠĠ ĠassertFalse ( handler . recover . proxy < Payments >(). validate Card (" 1 2 3 4 ")) ĊĠĠĠĠĠĠĠ Ġval Ġreceipt : ĠRe ceipt Ġ= Ġhandler . recover . proxy < Payments >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Receipt ( UUID . randomUUID ()) ĊĠĠĠĠĠĠĠ ĠassertNull ( receipt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Recover s Ġfrom Ġexception Ġasync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhandled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠPayment Tech () Ġ+ ĠErrors Handler () ĊĠĠĠĠĠĠĠ Ġassert Async Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . recover . proxy < Payments >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. process Payments ( 1 0 0 0 0 . to BigDecimal ()) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertFalse ( handled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Custom izes Ġexception Ġhandling `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ Ġ= Ġ( Custom ErrorHandler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠPayment Tech () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠErrors Handler ()) ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . recover . proxy < Payments >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. process Payments ( 1 0 0 0 . to BigDecimal ()) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠRe ceipt ( val Ġtotal : ĠBigDecimal ) ĊĊĠĠĠ Ġinterface ĠPay ments Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġvalidate Card ( card : ĠString ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġprocess Payments ( payment : ĠBigDecimal ): ĠPromise < UUID > ĊĠĠĠĠĠĠĠ Ġfun Ġget Receipt ( confirmation : ĠUUID ): ĠRe ceipt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPayment Tech Ġ: ĠHandler (), ĠPay ments Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvalidate Card ( card : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( card . length Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Credit Ġcard Ġmust Ġbe Ġat Ġleast Ġ 1 0 Ġdigits " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess Payments ( payment : ĠBigDecimal ): ĠPromise < UUID > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payment Ġ> Ġ 5 0 0 . to BigDecimal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise . reject ( IllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Amount Ġexceeded Ġlimit ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise . resolve ( UUID . randomUUID ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Receipt ( confirmation : ĠUUID ): ĠRe ceipt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Confirmation Ġ$ confirmation Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCustom ErrorHandler Ġ: ĠHandler (), ĠErrors Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : Ġ ĠAny ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠĠ ĠAny ? ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠPromise . resolve ( UUID . randomUUID ()) ĊĠĠĠ Ġ} Ċ }