package Ġcom . mir u ken . validate Ċ Ċ import Ġcom . mir u ken . callback . Handler Ċ import Ġcom . mir u ken . callback . plus Ċ import Ġcom . mir u ken . callback . policy . Handler Descriptor Factory Ċ import Ġcom . mir u ken . callback . policy . Mutable Handler Descriptor Factory Ċ import Ġcom . mir u ken . callback . policy . register Descriptor Ċ import Ġcom . mir u ken . concurrent . Promise Ċ import Ġcom . mir u ken . concurrent . delay Ċ import Ġcom . mir u ken . protocol . proxy Ċ import Ġcom . mir u ken . test . assert Async Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Test Name Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Period Ċ import Ġjavax . validation . groups . Default Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertSame Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠValidator Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfactory : ĠHandler Descriptor Factory ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field Ġval Ġtest Name Ġ= ĠTest Name () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġfactory Ġ= ĠMutable Handler Descriptor Factory (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Descriptor < Validate Team >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Descriptor < Validate Player >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler Descriptor Factory . use Factory ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Valid ates Ġtarget `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠValidate Player () ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= ĠPlayer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo b Ġ= ĠLocalDate . of ( 2 0 0 5 , Ġ 6 , Ġ 1 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġhandler . validate ( player ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( outcome . isValid ) ĊĠĠĠĠĠĠĠ ĠassertSame ( outcome , Ġplayer . validation Outcome ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" first Ġname Ġis Ġrequired ", Ġoutcome [" firstName "]) ĊĠĠĠĠĠĠĠ ĠassertEquals (" last Ġname Ġis Ġrequired ", Ġoutcome [" lastName "]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Valid ates Ġtarget Ġfor Ġscope `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠValidate Player () ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= ĠPlayer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo b Ġ= ĠLocalDate . of ( 2 0 0 5 , Ġ 6 , Ġ 1 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġhandler . validate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer , ĠDefault :: class , ĠRe cre ational :: class ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( outcome . isValid ) ĊĠĠĠĠĠĠĠ ĠassertSame ( outcome , Ġplayer . validation Outcome ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" player Ġmust Ġbe Ġ 1 0 Ġor Ġyo un ger ", Ġoutcome [" dob "]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Valid ates Ġtarget Ġasync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠValidate Team () ĊĠĠĠĠĠĠĠ Ġval Ġteam ĠĠĠ Ġ= ĠTeam () ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . validate Async ( team ) Ġthen Ġ{ Ġoutcome Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( outcome . isValid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame ( outcome , Ġteam . validation Outcome ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" name Ġis Ġrequired ", Ġoutcome [" name "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Valid ates Ġtarget Ġasync Ġfor Ġscope `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠValidate Team () ĊĠĠĠĠĠĠĠ Ġval Ġteam ĠĠĠ Ġ= ĠTeam (). apply Ġ{ Ġco ach Ġ= ĠCo ach () Ġ} ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . validate Async ( team , ĠDefault :: class , ĠE cn l :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Ġ{ Ġoutcome Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( outcome . isValid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame ( outcome , Ġteam . validation Outcome ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco ach Ġ= Ġoutcome . get Outcome (" co ach ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( co ach !!. isValid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" license d Ġco ach Ġis Ġrequired ", Ġco ach [" license "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Valid ates Ġbefore Ġmethod `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġ( Team Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠValidate Player ()) ĊĠĠĠĠĠĠĠ Ġval Ġteam ĠĠĠ Ġ= ĠTeam () ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= ĠPlayer (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" Way ne " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlastName Ġ Ġ= Ġ" Ro oney " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo b ĠĠĠĠĠĠ Ġ= ĠLocalDate . of ( 1 9 8 5 , 1 0 , 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . valid ( player ). proxy < Team Management >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Player ( player , Ġteam ) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( team . players !!. contains ( player )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Reject s Ġmethod Ġif Ġinvalid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġ( Team Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠValidate Player ()) ĊĠĠĠĠĠĠĠ Ġval Ġteam ĠĠĠ Ġ= ĠTeam () ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= ĠPlayer () ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . valid ( player ). proxy < Team Management >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Player ( player , Ġteam ) Ġcancelled Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Reject s Ġmethod Ġif Ġinvalid Ġasync `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġ( Team Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠValidate Player ()) ĊĠĠĠĠĠĠĠ Ġval Ġteam ĠĠĠ Ġ= ĠTeam () ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= ĠPlayer () ĊĠĠĠĠĠĠĠ Ġassert Async ( test Name ) Ġ{ Ġdone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . valid Async ( player ). proxy < Team Management >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Player ( player , Ġteam ) Ġcancelled Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠE cn l ĊĠĠĠ Ġinterface ĠRe cre ational ĊĊĠĠĠ Ġinterface ĠTeam Management Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Player ( player : ĠPlayer , Ġteam : ĠTeam ): ĠPromise < Team > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTeam Manager Ġ: ĠHandler (), ĠTeam Management Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Player ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer : ĠPlayer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteam : ĠĠ ĠTeam ĊĠĠĠĠĠĠĠ Ġ): ĠPromise < Team > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteam . players Ġ= Ġ( team . players Ġ?: Ġempty List ()) Ġ+ ĠlistOf ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise . resolve ( team ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠValidate Team Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Valid ates ĊĠĠĠĠĠĠĠ Ġfun Ġshould Have Name ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteam : ĠĠĠ ĠTeam , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome : ĠValidation Result . Outcome ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠPromise . delay ( 1 0 ) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( team . name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" name ", Ġ" name Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Valid ates ( E cn l :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġshould Have License s Co ach ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteam : ĠĠĠ ĠTeam , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome : ĠValidation Result . Outcome ĊĠĠĠĠĠĠĠĠ Ġ) Ġ= ĠPromise . delay ( 1 0 ) Ġthen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteam . co ach ?. also Ġ{ Ġco ach Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( co ach . license . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" co ach . license ", Ġ" license d Ġco ach Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġoutcome . add Error (" co ach ", Ġ" co ach Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠValidate Player Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Valid ates ĊĠĠĠĠĠĠĠ Ġfun Ġshould Have FullName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer : Ġ ĠPlayer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome : ĠValidation Result . Outcome ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player . firstName . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" firstName ", Ġ" first Ġname Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player . lastName . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" lastName ", Ġ" last Ġname Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player . dob Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" dob ", Ġ" DO B Ġis Ġrequired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Valid ates ( Re cre ational :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġmust Be Ten Or Under ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidation : ĠValidation ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutcome Ġ= Ġvalidation . outcome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ Ġ= Ġvalidation . target Ġas ĠPlayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . dob ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġage Ġ= ĠPeriod . between ( it , ĠLocalDate . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( age . years Ġ> Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutcome . add Error (" dob ", Ġ" player Ġmust Ġbe Ġ 1 0 Ġor Ġyo un ger ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }