package Ġcom . da uge ld auge . kin zh al . processor Ċ Ċ import Ġcom . tsch uch ort . compile testing . Kotlin Compilation Ċ import Ġcom . tsch uch ort . compile testing . SourceFile Ċ import Ġcom . tsch uch ort . compile testing . SourceFile . Companion . kotlin Ċ import Ġcom . tsch uch ort . compile testing . symbol Processor Providers Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġkotlin . test . assertContains Ċ import Ġkotlin . test . assertEquals Ċ Ċ internal Ġclass ĠProcessor Errors Test Ġ{ ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġtemporary Folder Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` duplicate Ġbinding Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" D uplicated Ġbinding ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( modules Ġ= Ġ[ App Module :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠApp Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġprovide Another Repo () Ġ= ĠRepo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo Ġ@ Inject Ġconstructor () ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` missing Ġbinding Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Missing Ġbinding ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo Ġ@ Inject Ġconstructor ( description : ĠString , Ġradix : ĠInt ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` missing Ġbinding Ġwhen Ġonly Ġtype Ġparameters Ġdiffer `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Missing Ġbinding ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( dependencies Ġ= ĠApp Deps :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < List < Int ? >, ĠMap < String , ĠMap < List < Any ? >, ĠList < String >>>> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Deps Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < List < Int ? >, ĠMap < String , ĠMap < List < Any >, ĠList < String >>>> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` component Ġis Ġnot Ġan Ġinterface Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error ("@ Component Ġcan 't Ġbe Ġapplied Ġto ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo Ġ@ Inject Ġconstructor () ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` binding Ġfunction Ġwith Ġmultiple Ġparams Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Binding Ġfunction Ġmust Ġhave Ġexactly Ġone Ġparameter ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( modules Ġ= Ġ[ App Module :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind Repo ( repo : ĠRepo , Ġwhat : ĠAny ): ĠAny ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` binding Ġfunction Ġreturn Ġtype Ġnot Ġassignable Ġfrom Ġparameter Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Binding Ġfunction Ġreturn Ġtype Ġmust Ġbe Ġassignable Ġfrom Ġparameter ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( modules Ġ= Ġ[ App Module :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind Repo ( repo : ĠRepo 2 ): ĠRepo 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo 2 ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` component Ġdependency Ġnot Ġan Ġinterface Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Component Ġdependency Ġmust Ġbe Ġan Ġinterface ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( dependencies Ġ= Ġ[ App Deps :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠApp Deps Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` dependency Ġcycle Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Dependency Ġcycle Ġdetected ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( modules Ġ= Ġ[ App Module :: class , ĠLength Module :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepo : ĠRepo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠApp Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġrepo ( length : ĠInt ) Ġ= Ġ" ĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠLength Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġlength ( repo : ĠRepo ): ĠInt Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠRepo Ġ@ Inject Ġconstructor ( key : ĠString ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġqual ifiers Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Multiple Ġqual ifiers Ġnot Ġpermitted ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Qualifier ĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Qualifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġclass ĠOne ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Qualifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġclass ĠAnother ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ( modules Ġ= Ġ[ App Module :: class ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ One Ġ@ Another ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠApp Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ One Ġ@ Another ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstring () Ġ= Ġ" ĠĠĠ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` un resolved Ġtype Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect Error (" Unable Ġto Ġresolve Ġtype Ġreference : ĠUnknown Type ", Ġkotlin (" source . kt ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġcom . da uge ld auge . kin zh al . annotations . Inject ĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠApp Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġapp (): ĠApp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠApp Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Instance : ĠUnknown Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠĠĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ())) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġexpect Error ( message : ĠString , Ġvar arg Ġsource Files : ĠSource File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile (* source Files ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Kotlin Compilation . ExitCode . COMPI L ATION _ ERROR , Ġresult . exit Code ) ĊĠĠĠĠĠĠĠ Ġassert Contains ( result . messages , Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Compilation ( var arg Ġsource Files : ĠSource File ): ĠKotlin Compilation Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin Compilation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Dir Ġ= Ġtemporary Folder . root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġsource Files . asList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinherit Class Path Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Processor Providers Ġ= ĠlistOf ( Kin zh al Symbol Processor Provider ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompile ( var arg Ġsource Files : ĠSource File ): ĠKotlin Compilation . Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Compilation (* source Files ). compile () ĊĠĠĠ Ġ} Ċ Ċ } Ċ