package Ġ` in `. spec matic . core Ċ Ċ import Ġ` in `. spec matic . core . pattern . Contract Exception Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util . concurrent . Executors Ċ Ċ fun Ġtest Backward Compatibility _ old ( older : ĠFeature , Ġnewer Behaviour : ĠFeature ): ĠResults Ġ{ ĊĠĠĠ Ġreturn Ġolder . generate Backward Compatibility Test Sc enarios (). filter Ġ{ Ġ! it . ignore Failure Ġ}. fold ( Results ()) Ġ{ Ġresults , Ġolder Scenario Ġ-> ĊĠĠĠĠĠĠĠ Ġif ( older Scenario . kafka Message Pattern Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscenario Match Results Ġ= Ġnewer Behaviour . lookup Kafka Scenario ( older Scenario . kafka Message Pattern , Ġolder Scenario . resolver ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠResults ( scenario Match Results . map Ġ{ Ġit . second Ġ}. to Mutable List ()). to Result If Any () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( result ). to Mutable List ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnewer Behaviour . set Server State ( older Scenario . expected Fact s ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġolder Scenario . generate HttpRequest () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnewer Sc enarios Ġ= Ġnewer Behaviour . lookup Scenario ( request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscenario Results Ġ= Ġnewer Sc enarios . map Ġ{ Ġnewer Scenario Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnewer Response Pattern Ġ= Ġnewer Scenario . httpResponse Pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġolder Scenario . httpResponse Pattern . en comp asses ( new er Response Pattern , Ġolder Scenario . resolver , Ġnewer Scenario . resolver ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . scenario Ġ= Ġnewer Scenario ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults ToAdd Ġ= Ġscenario Results . find Ġ{ Ġit Ġis ĠResult . Success Ġ} ?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: Ġscenario Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( results ToAdd ). to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( contract Exception : ĠContract Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( contract Exception . failure ()). to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( stack Over Flow Exception : ĠStack Overflow Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( Result . Failure (" Exception : ĠStack Ġoverflow Ġerror , Ġmost Ġlikely Ġcaused Ġby Ġa Ġrecursive Ġdefinition . ĠPlease Ġreport Ġthis Ġwith Ġa Ġsample Ġcontract Ġas Ġa Ġbug ! ")). to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( Result . Failure (" Exception : Ġ${ throwable . localized Message } ")). to Mutable List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtest Backward Compatibility ( older : ĠFeature , Ġnewer Behaviour : ĠFeature ): ĠResults Ġ{ ĊĠĠĠ Ġreturn Ġolder . generate Backward Compatibility Test Sc enarios (). filter Ġ{ Ġ! it . ignore Failure Ġ}. fold ( Results ()) Ġ{ Ġresults , Ġolder Scenario Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscenario Results : ĠList < Result > Ġ= Ġtest Backward Compatibility ( older Scenario , Ġnewer Behaviour ) ĊĠĠĠĠĠĠĠ Ġresults . copy ( results Ġ= Ġresults . results . plus ( scenario Results )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġtest Backward Compatibility ( ĊĠĠĠ Ġold Scenario : ĠScenario , ĊĠĠĠ Ġnew Feature _: ĠFeature Ċ ): ĠList < Result > Ġ{ ĊĠĠĠ Ġval Ġnew Feature Ġ= Ġnew Feature _. copy () ĊĊĠĠĠ Ġreturn Ġif Ġ( old Scenario . kafka Message Pattern Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscenario Match Results Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Feature . lookup Kafka Scenario ( old Scenario . kafka Message Pattern , Ġold Scenario . resolver ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠResults ( scenario Match Results . map Ġ{ Ġit . second Ġ}. to Mutable List ()). to Result If Any () ĊĊĠĠĠĠĠĠĠ ĠlistOf ( result ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Feature . set Server State ( old Scenario . expected Fact s ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġold Scenario . generate HttpRequest () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnewer Sc enarios Ġ= Ġnew Feature . lookup Scenario ( request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp Scenario Results Ġ= Ġnewer Sc enarios . map Ġ{ Ġnewer Scenario Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnewer Response Pattern Ġ= Ġnewer Scenario . httpResponse Pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Scenario . httpResponse Pattern . en comp asses ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewer Response Pattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Scenario . resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewer Scenario . resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . scenario Ġ= Ġnewer Scenario ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Scenario Results . find Ġ{ Ġit Ġis ĠResult . Success Ġ} ?. let Ġ{ ĠlistOf ( it ) Ġ} Ġ?: Ġhttp Scenario Results ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( contract Exception : ĠContract Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( contract Exception . failure ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( stack Over Flow Exception : ĠStack Overflow Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Result . Failure (" Exception : ĠStack Ġoverflow Ġerror , Ġmost Ġlikely Ġcaused Ġby Ġa Ġrecursive Ġdefinition . ĠPlease Ġreport Ġthis Ġwith Ġa Ġsample Ġcontract Ġas Ġa Ġbug ! ")) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Result . Failure (" Exception : Ġ${ throwable . localized Message } ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ