package Ġcom . squareup . an vil . compiler Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . squareup . an vil . annotations . Merge Component Ċ import Ġcom . squareup . an vil . annotations . Merge Sub component Ċ import Ġcom . squareup . an vil . annotations . compat . Merge Modules Ċ import Ġcom . squareup . an vil . compiler . internal . testing . any D agger Component Ċ import Ġcom . squareup . an vil . compiler . internal . testing . d agger Component Ċ import Ġcom . squareup . an vil . compiler . internal . testing . without An vil Module Ċ import Ġorg . junit . Ass ume . assume True Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ import Ġorg . junit . runners . Parameterized . Parameters Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠModule Mer ger Repeat able Test ( ĊĠ Ġprivate Ġval Ġannotation Class : ĠK Class < *> Ċ ) Ġ{ ĊĊĠ Ġprivate Ġval Ġannotation Ġ= Ġ"@ ${ annotation Class . simple Name }" ĊĠ Ġprivate Ġval Ġimport Ġ= Ġ" import Ġ${ annotation Class . java . canonical Name }" ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Parameters ( name Ġ= Ġ"{ 0 }") ĊĠĠĠ Ġ@ Jvm Static Ġfun Ġannotation Classes (): ĠCollection < Any > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( Merge Component :: class ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Full Test Run ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġadd ( Merge Sub component :: class ) ĊĠĠĠĠĠĠĠĠĠ Ġadd ( Merge Modules :: class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` duplicate Ġscopes Ġare Ġan Ġerror `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ$ import ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( exit Code ). isError () ĊĠĠĠĠĠ ĠassertThat ( messages ). contains ( ĊĠĠĠĠĠĠĠ Ġ" com . squareup . test . Component Interface Ġmerge s Ġmultiple Ġtimes Ġto Ġthe Ġsame Ġscope : Ġ[ Any ]. Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Mer ging Ġmultiple Ġtimes Ġto Ġthe Ġsame Ġscope Ġis Ġforbidden Ġand Ġall Ġscopes Ġmust Ġbe Ġdistinct ." ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` different Ġkind Ġof Ġmerge Ġannotations Ġare Ġforbidden `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĠĠĠ Ġassume True ( annotation Class Ġ== ĠMerge Component :: class ) ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Merge Component ĊĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Merge Sub component ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ@ Merge Component ( Any :: class ) ĊĠĠĠĠĠ Ġ@ Merge Sub component ( Unit :: class ) ĊĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( exit Code ). isError () ĊĠĠĠĠĠ ĠassertThat ( messages ). contains ( ĊĠĠĠĠĠĠĠ Ġ" It 's Ġonly Ġallowed Ġto Ġhave Ġone Ġsingle Ġtype Ġof Ġ@ Merge * Ġannotation , Ġhowever Ġmultiple Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" instances Ġof Ġthe Ġsame Ġannotation Ġare Ġallowed . ĠYou Ġmix Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ"[ Merge Component , ĠMerge Sub component ] Ġand Ġthis Ġis Ġforbidden ." ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` modules Ġfrom Ġdifferent Ġscopes Ġare Ġmerged Ġsuccessfully `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġimport Ġdagger . Module ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 2 ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Interface . any D agger Component ( annotation Class ) ĊĠĠĠĠĠ ĠassertThat ( component . modules . without An vil Module ()) ĊĠĠĠĠĠĠĠ Ġ. contains Exactly ( d agger Module 1 . kotlin , Ġdagger Module 2 . kotlin ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` there Ġare Ġno Ġduplicated Ġmodules `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġimport Ġdagger . Module ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 2 ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Interface . any D agger Component ( annotation Class ) ĊĠĠĠĠĠ ĠassertThat ( component . modules . without An vil Module ()) ĊĠĠĠĠĠĠĠ Ġ. contains Exactly ( d agger Module 1 . kotlin , Ġdagger Module 2 . kotlin ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` a Ġmodule Ġreplaced Ġin Ġone Ġscope Ġis Ġnot Ġincluded Ġby Ġanother Ġscope `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġimport Ġdagger . Module ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplaces Ġ= Ġ[ D agger Module 1 :: class ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ@ Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 2 ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Interface . any D agger Component ( annotation Class ) ĊĠĠĠĠĠ ĠassertThat ( component . modules . without An vil Module ()). contains Exactly ( d agger Module 2 . kotlin ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` a Ġcontributed Ġbinding Ġreplaced Ġin Ġone Ġscope Ġis Ġnot Ġincluded Ġby Ġanother Ġscope `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es Binding ĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġinterface ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es Binding ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es Binding ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠContributing Interface Ġ: ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplaces Ġ= Ġ[ Contributing Interface :: class ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ@ d agger . Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠ Ġcomponent Interface . any D agger Component ( annotation Class ). modules . without An vil Module () ĊĠĠĠĠĠ Ġ). contains Exactly ( d agger Module 1 . kotlin ) ĊĊĠĠĠĠĠ ĠassertThat ( component Interface . an vil Module . declared Methods ). isEmpty () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` a Ġcontributed Ġmodule Ġreplaced Ġby Ġa Ġbinding Ġin Ġone Ġscope Ġis Ġnot Ġincluded Ġby Ġanother Ġscope `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es Binding ĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġinterface ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ d agger . Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplaces Ġ= Ġ[ D agger Module 1 :: class ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġinterface ĠContributing Interface Ġ: ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠ Ġcomponent Interface . any D agger Component ( annotation Class ). modules . without An vil Module () ĊĠĠĠĠĠ Ġ). isEmpty () ĊĠĠĠĠĠ ĠassertThat ( component Interface . an vil Module . declared Methods ). has Length ( 1 ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` a Ġcontributed Ġmodule Ġexcluded Ġin Ġone Ġscope Ġis Ġnot Ġincluded Ġby Ġanother Ġscope `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es To ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġ@ d agger . Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es To ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ d agger . Module ĊĠĠĠĠĠĠĠ Ġabstract Ġclass ĠD agger Module 2 ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD agger Module 1 :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Interface . any D agger Component ( annotation Class ) ĊĠĠĠĠĠ ĠassertThat ( component . modules . without An vil Module ()). contains Exactly ( d agger Module 2 . kotlin ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` a Ġcontributed Ġbinding Ġexcluded Ġin Ġone Ġscope Ġis Ġnot Ġincluded Ġby Ġanother Ġscope `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĊĠĠĠĠĠĠĠ Ġimport Ġcom . squareup . an vil . annotations . Contribut es Binding ĊĠĠĠĠĠĠĠ Ġ$ import ĊĊĠĠĠĠĠĠĠ Ġinterface ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ@ Contribut es Binding ( Any :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Contribut es Binding ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠContributing Interface Ġ: ĠParent Interface ĊĊĠĠĠĠĠĠĠ Ġ$ annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContributing Interface :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ$ annotation ( Unit :: class ) ĊĠĠĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠassertThat ( component Interface . an vil Module . declared Methods ). isEmpty () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` modules Ġand Ġdependencies Ġare Ġadded Ġin Ġthe ĠD agger Ġcomponent Ġwith Ġmultiple Ġmerge Ġannotations `() Ġ{ ĊĠĠĠ Ġassume Ir Backend () ĊĠĠĠ Ġassume Merge Component ( annotation Class ) ĊĊĠĠĠ Ġcompile ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠ Ġpackage Ġcom . squareup . test ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ$ import ĊĠĠĠĠĠĠĊĠĠĠĠĠ Ġ$ annotation ( ĊĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠAny :: class , ĊĠĠĠĠĠĠĠĠĠ Ġmodules Ġ= Ġ[ Boolean :: class ], ĊĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġ[ Boolean :: class ] ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ$ annotation ( ĊĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠUnit :: class , ĊĠĠĠĠĠĠĠĠĠ Ġmodules Ġ= Ġ[ Int :: class ], ĊĠĠĠĠĠĠĠĠĠ Ġdependencies Ġ= Ġ[ Int :: class ] ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġinterface ĠComponent Interface ĊĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Interface . d agger Component ĊĠĠĠĠĠ ĠassertThat ( component . modules . without An vil Module ()). contains Exactly ( Boolean :: class , ĠInt :: class ) ĊĠĠĠĠĠ ĠassertThat ( component . dependencies . toList ()). contains Exactly ( Boolean :: class , ĠInt :: class ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ