package Ġau . com . di us . p act . provider . junit 5 Ċ Ċ import Ġau . com . di us . p act . core . model . Broker Url Source Ċ import Ġau . com . di us . p act . core . model . Interaction Ċ import Ġau . com . di us . p act . core . model . Provider State Ċ import Ġau . com . di us . p act . core . support . isNotEmpty Ċ import Ġau . com . di us . p act . provider . Provider Utils Ċ import Ġau . com . di us . p act . provider . StateChange Result Ċ import Ġau . com . di us . p act . provider . Verification Failure Type Ċ import Ġau . com . di us . p act . provider . Verification Result Ċ import Ġau . com . di us . p act . provider . j units upport . Ignore Missing StateChange Ċ import Ġau . com . di us . p act . provider . j units upport . Missing StateChange Method Ċ import Ġau . com . di us . p act . provider . j units upport . State Ċ import Ġau . com . di us . p act . provider . j units upport . StateChange Action Ċ import Ġcom . github . m ichael bull . result . Err Ċ import Ġmu . K Logging Ċ import Ġorg . junit . jupiter . api . extension . After Test Execution Callback Ċ import Ġorg . junit . jupiter . api . extension . Before Test Execution Callback Ċ import Ġorg . junit . jupiter . api . extension . Extension Context Ċ import Ġorg . junit . platform . commons . support . Annotation Support Ċ import Ġorg . junit . platform . commons . support . Hierarchy Traversal Mode Ċ import Ġorg . junit . platform . commons . support . Reflection Support Ċ import Ġjava . lang . reflect . Method Ċ Ċ /** Ċ Ġ* ĠJ Unit Ġ 5 Ġtest Ġextension Ġclass Ġfor Ġexecuting Ġstate Ġchange Ġcallbacks Ċ Ġ*/ Ċ class ĠP act Verification StateChange Extension ( ĊĠ Ġprivate Ġval Ġinteraction : ĠInteraction , ĊĠ Ġprivate Ġval Ġp act Source : Ġau . com . di us . p act . core . model . P act Source Ċ ) Ġ: ĠBefore Test Execution Callback , ĠAfter Test Execution Callback Ġ{ ĊĠ Ġoverride Ġfun Ġbefore Test Execution ( extension Context : ĠExtension Context ) Ġ{ ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" before Each Ġfor Ġinteraction Ġ'${ interaction . description } '" Ġ} ĊĠĠĠ Ġval Ġstore Ġ= Ġextension Context . get Store ( Extension Context . Namespace . create (" p act - jvm ")) ĊĠĠĠ Ġval Ġtest Context Ġ= Ġstore . get (" interaction Context ") Ġas ĠP act Verification Context ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġprovider State Context Ġ= Ġinvoke StateChange Methods ( extension Context , Ġtest Context , ĊĠĠĠĠĠĠĠ Ġinteraction . provider States , ĠState Change Action . SETUP ) ĊĠĠĠĠĠ Ġtest Context . executionContext Ġ= Ġmutable Map Of (" provider State " Ġto Ġprovider State Context ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpending Ġ= Ġp act Source Ġis ĠBroker Url Source Ġ&& Ġp act Source . result ?. pending Ġ== Ġtrue ĊĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Provider Ġstate Ġchange Ġcallback Ġfailed " Ġ} ĊĠĠĠĠĠ Ġval Ġerror Ġ= ĠState Change Result ( Err ( e )) ĊĠĠĠĠĠ Ġtest Context . test Execution Result . add ( Verification Result . Failed ( ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Provider Ġstate Ġchange Ġcallback Ġfailed ", ĊĠĠĠĠĠĠĠ Ġfailures Ġ= Ġmap Of ( interaction . interaction Id . or Empty () Ġto ĊĠĠĠĠĠĠĠĠĠ ĠlistOf ( Verification Failure Type . StateChange Failure (" Provider Ġstate Ġchange Ġcallback Ġfailed ", Ġerror ))), ĊĠĠĠĠĠĠĠ Ġpending Ġ= Ġpending ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġif Ġ(! pending ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Provider Ġstate Ġchange Ġcallback Ġfailed ", Ġe ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġafter Test Execution ( context : ĠExtension Context ) Ġ{ ĊĠĠĠ Ġlogger . debug Ġ{ Ġ" after Each Ġfor Ġinteraction Ġ'${ interaction . description } '" Ġ} ĊĠĠĠ Ġval Ġstore Ġ= Ġcontext . get Store ( Extension Context . Namespace . create (" p act - jvm ")) ĊĠĠĠ Ġval Ġtest Context Ġ= Ġstore . get (" interaction Context ") Ġas ĠP act Verification Context ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġinvoke StateChange Methods ( context , Ġtest Context , Ġinteraction . provider States , ĠState Change Action . TE AR DOWN ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpending Ġ= Ġp act Source Ġis ĠBroker Url Source Ġ&& Ġp act Source . result ?. pending Ġ== Ġtrue ĊĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Provider Ġstate Ġchange Ġcallback Ġfailed " Ġ} ĊĠĠĠĠĠ Ġval Ġerror Ġ= ĠState Change Result ( Err ( e )) ĊĠĠĠĠĠ Ġtest Context . test Execution Result . add ( Verification Result . Failed ( ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Provider Ġstate Ġchange Ġteardown Ġcallback Ġfailed ", ĊĠĠĠĠĠĠĠ Ġfailures Ġ= Ġmap Of ( interaction . interaction Id . or Empty () Ġto ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠ ĠVerification Failure Type . StateChange Failure (" Provider Ġstate Ġchange Ġteardown Ġcallback Ġfailed ", Ġerror ))), ĊĠĠĠĠĠĠĠ Ġpending Ġ= Ġpending ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġif Ġ(! pending ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Provider Ġstate Ġchange Ġcallback Ġfailed ", Ġe ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinvoke StateChange Methods ( ĊĠĠĠ Ġcontext : ĠExtension Context , ĊĠĠĠ Ġtest Context : ĠP act Verification Context , ĊĠĠĠ Ġprovider States : ĠList < Provider State >, ĊĠĠĠ Ġaction : ĠState Change Action ĊĠ Ġ): ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠ Ġval Ġerrors Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġval Ġprovider State Context Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĠĠĠ Ġprovider States . forEach Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠ Ġval Ġstate Change Methods Ġ= Ġfind StateChange Methods ( context . required Test Instance , ĊĠĠĠĠĠĠĠ Ġtest Context . state Change Handlers , Ġstate ) ĊĠĠĠĠĠ Ġif Ġ( state Change Methods . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" Did Ġnot Ġfind Ġa Ġtest Ġclass Ġmethod Ġannotated Ġwith Ġ@ State (\" ${ state . name }\ ") Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" for ĠInteraction Ġ\" ${ test Context . interaction . description }\" Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" with ĠConsumer Ġ\" ${ test Context . consumer . name }\ "" ĊĠĠĠĠĠĠĠ Ġif Ġ( ignore Missing StateChange Method ( context . required TestClass )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġmessage Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerrors . add ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Change Methods . filter Ġ{ Ġit . second . action Ġ== Ġaction Ġ}. forEach Ġ{ Ġ( method , Ġstate Annotation , Ġinstance ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġstate Annotation . value . join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Annotation . comment . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inv oking Ġstate Ġchange Ġmethod Ġ'$ name ': ${ state Annotation . action } Ġ(${ state Annotation . comment })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inv oking Ġstate Ġchange Ġmethod Ġ'$ name ': ${ state Annotation . action }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġstate Change Value Ġ= Ġif Ġ( method . parameter Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReflection Support . invoke Method ( method , Ġinstance , Ġstate . params ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReflection Support . invoke Method ( method , Ġinstance ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Change Value Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider State Context . put All ( state Change Value Ġas ĠMap < String , ĠAny ?> ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( errors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠMissing StateChange Method ( errors . join ToString ("\ n ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġprovider State Context ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind StateChange Methods ( ĊĠĠĠ Ġtest Class : ĠAny , ĊĠĠĠ Ġstate Change Handlers : ĠList < Any >, ĊĠĠĠ Ġstate : ĠProvider State ĊĠ Ġ): ĠList < Triple < Method , ĠState , ĠAny >> Ġ{ ĊĠĠĠ Ġval Ġstate Change Classes Ġ= ĊĠĠĠĠĠ ĠAnnotation Support . find Annotated Methods ( test Class . java Class , ĠState :: class . java , ĠH ierarchy Traversal Mode . TOP _ DOWN ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġtest Class Ġ} ĊĠĠĠĠĠĠĠ Ġ. plus ( state Change Handlers . flatMap Ġ{ Ġhandler Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠAnnotation Support . find Annotated Methods ( handler . java Class , ĠState :: class . java , ĠH ierarchy Traversal Mode . TOP _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġhandler Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġreturn Ġstate Change Classes ĊĠĠĠĠĠ Ġ. map Ġ{ ĠTrip le ( it . first , Ġit . first . getAnnotation ( State :: class . java ), Ġit . second ) Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second . value . any Ġ{ Ġs Ġ-> Ġstate . name Ġ== Ġs Ġ} Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġignore Missing StateChange Method ( test Class : ĠClass < *> ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠProvider Utils . find Annotation ( test Class , ĠIgnore Missing StateChange :: class . java ) Ġ!= Ġnull ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ } Ċ