/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 1 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . k oin . test . check Ċ Ċ import Ġorg . k oin . core . K oin Ċ import Ġorg . k oin . core . K oin Application Ċ import Ġorg . k oin . core . annotation . K oin Internal Api Ċ import Ġorg . k oin . core . context . start K oin Ċ import Ġorg . k oin . core . error .* Ċ import Ġorg . k oin . core . logger . Level Ċ import Ġorg . k oin . core . qual ifier . Type Qualifier Ċ import Ġorg . k oin . dsl . K oin App Declaration Ċ import Ġorg . k oin . mp . K oin Platform Tools Ċ import Ġorg . k oin . test . mock . Mock Provider Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠCheck Ġall Ġdefinition 's Ġdependencies Ġ- Ġstart Ġall Ġmodules Ġand Ġcheck Ġif Ġdefinitions Ġcan Ġrun Ċ Ġ*/ Ċ fun ĠK oin Application . check Modules ( ĊĠĠĠ Ġdefault Values : ĠMap < K Class <* >, ĠAny > Ġ= Ġhash Map Of (), ĊĠĠĠ Ġallowed Mocks : ĠList < K Class <* >> Ġ= ĠlistOf (), ĊĠĠĠ Ġallowed Exceptions : ĠList < K Class <* >> Ġ= ĠlistOf () Ċ ) Ġ= Ġk oin . check Modules ( default Values , Ġallowed Mocks , Ġallowed Exceptions ) Ċ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ fun Ġcheck Modules ( ĊĠĠĠ Ġlevel : ĠLevel Ġ= ĠLevel . INFO , ĊĠĠĠ Ġdefault Values : ĠMap < K Class <* >, ĠAny > Ġ= Ġhash Map Of (), ĊĠĠĠ Ġallowed Mocks : ĠList < K Class <* >> Ġ= ĠlistOf (), ĊĠĠĠ Ġallowed Exceptions : ĠList < K Class <* >> Ġ= ĠlistOf (), ĊĠĠĠ Ġapp Declaration : ĠK oin App Declaration Ċ ) Ġ{ ĊĠĠĠ Ġstart K oin ( app Declaration ) ĊĠĠĠĠĠĠĠ Ġ. logger ( K oin Platform Tools . default Logger ( level )) ĊĠĠĠĠĠĠĠ Ġ. check Modules ( default Values , Ġallowed Mocks , Ġallowed Exceptions ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCheck Ġall Ġdefinition 's Ġdependencies Ġ- Ġstart Ġall Ġmodules Ġand Ġcheck Ġif Ġdefinitions Ġcan Ġrun Ċ Ġ*/ Ċ @ Opt In ( K oin Internal Api :: class ) Ċ fun ĠK oin . check Modules ( ĊĠĠĠ Ġdefault Values : ĠMap < K Class <* >, ĠAny > Ġ= Ġhash Map Of (), ĊĠĠĠ Ġallowed Mocks : ĠList < K Class <* >> Ġ= ĠlistOf (), ĊĠĠĠ Ġallowed Exceptions : ĠList < K Class <* >> Ġ= ĠlistOf () Ċ ) Ġ{ ĊĠĠĠ Ġlogger . info ("[ Check ] Ġchecking Ġcurrent Ġmodules Ġ... ") ĊĊĠĠĠ Ġ// ĠExtract Ġall Ġdefinitions Ġto Ġcheck ĊĠĠĠ Ġval Ġdefinitions Ġ= Ġinstance Registry . instances . values . map Ġ{ Ġit . bean Definition Ġ}. distinct () ĊĊĠĠĠ Ġ// ĠRe configure Ġwith ĠMock Instance Factory ĊĠĠĠ Ġinstance Registry . instances . forEach Ġ{ Ġ( mapping , Ġfactory ) Ġ-> ĊĠĠĠĠĠĠĠ Ġinstance Registry . save Mapping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Override Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping Ġ= Ġmapping , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory Ġ= ĠMock Instance Factory ( factory . bean Definition ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠExecute Ġresolution ĊĠĠĠ Ġdefinitions . forEach Ġ{ Ġbean Definition Ġ-> ĊĠĠĠĠĠĠĠ Ġlogger . info (" Checking Ġ$ bean Definition Ġ... ") ĊĠĠĠĠĠĠĠ Ġvar Ġsource : ĠPair < K Class <* >, ĠAny >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġif Ġ( bean Definition . scope Qualifier Ġ!= Ġscope Registry . rootScope . scope Qualifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( bean Definition . scope Qualifier Ġas ? ĠType Qualifier )?. let Ġ{ ĠPair ( it . type , ĠMock Provider . make Mock ( it . type )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate Scope ( bean Definition . scope Qualifier . value , Ġbean Definition . scope Qualifier , Ġsource ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġscope Registry . rootScope ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Values Ġ= Ġsource ?. let Ġ{ Ġdefault Values Ġ+ Ġit Ġ} Ġ?: Ġdefault Values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbean Definition . definition . invoke ( scope , ĠMock Parameters Holder ( all Values , Ġallowed Mocks )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Class Ġ= Ġe :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Class Ġin Ġbreaking Exceptions Ġ|| Ġerror Class Ġ! in Ġallowed Exceptions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBroken Definition Exception (" Definition Ġis Ġbroken : Ġ$ bean Definition Ġ\ n - Ġdue Ġto Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġlogger . error (" Intercept ed ĠError : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! scope . is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclose () ĊĠĠĠ Ġlogger . info (" All Ġdefinitions Ġare ĠOK !") Ċ } Ċ Ċ val Ġbreaking Exceptions Ġ= ĠlistOf < K Class < *> >( ĊĠĠĠ ĠNo Bean Def Found Exception :: class , ĊĠĠĠ ĠNo Scope Def Found Exception :: class , ĊĠĠĠ ĠInstance Creation Exception :: class , ĊĠĠĠ ĠDefinition Parameter Exception :: class Ċ ) Ċ