package Ġcom . ju ul . stro pping Ċ Ċ import Ġdagger . Provides Ċ import Ġdagger . mult ib ind ings . Into Map Ċ import Ġdagger . mult ib ind ings . Into Set Ċ import Ġdagger . mult ib ind ings . String Key Ċ import Ġorg . junit . Test Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjavax . inject . Named Ċ import Ġjavax . inject . Qualifier Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . jvm . java Method Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ Ċ private Ġconst Ġval ĠEX AMPLE _ NAME Ġ= Ġ" example " Ċ private Ġconst Ġval ĠEX AMPLE _ KEY Ġ= Ġ" key " Ċ Ċ @ Qualifier Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ private Ġannotation Ġclass ĠCustom Qualifier Ċ Ċ private Ġclass ĠFunctions Ġ{ ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Custom Qualifier ĊĠĠĠ Ġfun Ġprovide Custom Qualified String (): ĠString Ġ= Ġ" custom - qualified Ġstring " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Named ( EXAMPLE _ NAME ) ĊĠĠĠ Ġ@ Custom Qualifier ĊĠĠĠ Ġfun Ġprovide Custom Qualified Named String (): ĠString Ġ= Ġ" custom - qualified , Ġnamed Ġstring " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide GenericType (): ĠList < String > Ġ= ĠlistOf (" string Ġinside Ġa Ġlist ") ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Named ( EXAMPLE _ NAME ) ĊĠĠĠ Ġfun Ġprovide Named String (): ĠString Ġ= Ġ" named Ġstring " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġfun Ġprovide Into Set (): ĠString Ġ= Ġ" string Ġin Ġset " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Map ĊĠĠĠ Ġ@ String Key ( EXAMPLE _ KEY ) ĊĠĠĠ Ġfun Ġprovide Into Map (): ĠString Ġ= Ġ" string Ġin Ġmap " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide From Parameter ( string : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ" from Ġparam : Ġ$ string " ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide From Generic Parameter ( list : ĠList < String >): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ" from Ġlist Ġparam : Ġ${ list . join ToString () }" ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġfun Ġprovide From Multiple Parameters ( ĊĠĠĠĠĠĠĠ Ġstring : ĠString , ĊĠĠĠĠĠĠĠ Ġnumber : ĠAny ĊĠĠĠ Ġ): ĠString Ġ= Ġ" from Ġparams : Ġ$ string Ġand Ġ$ number " Ċ } Ċ Ċ class ĠTest Provision er Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġget Provision Function ( function : ĠK Function < *> ): ĠMethod Provision er Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjava Method Ġ= ĠassertNotNull ( function . java Method ) ĊĠĠĠĠĠĠĠ Ġval Ġprovision er Ġ= ĠassertNotNull ( Provision er . from Method ( java Method )) ĊĠĠĠĠĠĠĠ Ġreturn Ġassert Is Instance < Method Provision er >( provision er ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` decl aring Class Ġworks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Named String ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Functions :: class . java , Ġprovision Function . decl aring Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` mult ib ind ings Ġworks Ġfor Ġsingle `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Named String ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mult ib ind ings . Single , Ġprovision Function . mult ib ind ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` mult ib ind ings Ġworks Ġfor Ġset `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Into Set ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mult ib ind ings . To Set , Ġprovision Function . mult ib ind ings ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` mult ib ind ings Ġworks Ġfor Ġmap `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Into Map ) ĊĠĠĠĠĠĠĠ Ġassert Is Instance < Mult ib ind ings . ToMap >( provision Function . mult ib ind ings ) ĊĠĠĠĠĠĠĠ Ġval Ġto Map Ġ= Ġprovision Function . mult ib ind ings Ġas ĠMult ib ind ings . ToMap ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġto Map . key Type ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( EXAMPLE _ KEY , Ġto Map . key Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parameters Ġworks Ġwith Ġclass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide From Parameter ) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġprovision Function . parameters ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġparameters . single (). type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parameters Ġworks Ġwith Ġgener ics `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide From Generic Parameter ) ĊĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġprovision Function . parameters . single () ĊĠĠĠĠĠĠĠ Ġassert Is Instance < Parameterized Type >( parameter . type ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġparameter . type Ġas ĠParameter ized Type ĊĠĠĠĠĠĠĠ ĠassertEquals ( List :: class . java , Ġtype . raw Type ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġtype . actual Type Arguments . single ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parameters Ġworks Ġwith Ġmultiple `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide From Multiple Parameters ) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġprovision Function . parameters ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġparameters [ 0 ]. type ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Any :: class . java , Ġparameters [ 1 ]. type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` qual ifiers Ġrecogn izes Ġ@ Named `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Named String ) ĊĠĠĠĠĠĠĠ Ġval Ġnamed Ġ= Ġprovision Function . qual ifiers . single () Ġas ĠNamed ĊĠĠĠĠĠĠĠ ĠassertEquals ( EXAMPLE _ NAME , Ġnamed . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` qual ifiers Ġrecogn izes Ġcustom Ġqual ifiers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Custom Qualified String ) ĊĠĠĠĠĠĠĠ Ġassert Is Instance < Custom Qualifier >( provision Function . qual ifiers . single ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` qual ifiers Ġrecogn izes Ġmultiple Ġqual ifiers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Custom Qualified Named String ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġprovision Function . qual ifiers . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġprovision Function . qual ifiers . count Ġ{ Ġit Ġis ĠNamed Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġprovision Function . qual ifiers . count Ġ{ Ġit Ġis ĠCustom Qualifier Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` returnType Ġworks Ġfor Ġclasses `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide Named String ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġprovision Function . returnType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` returnType Ġworks Ġfor Ġparameter ized Ġtypes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision Function Ġ= Ġget Provision Function ( Functions :: provide GenericType ) ĊĠĠĠĠĠĠĠ Ġassert Is Instance < Parameterized Type >( provision Function . returnType ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġprovision Function . returnType Ġas ĠParameter ized Type ĊĠĠĠĠĠĠĠ ĠassertEquals ( List :: class . java , Ġtype . raw Type ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( String :: class . java , Ġtype . actual Type Arguments . single ()) ĊĠĠĠ Ġ} Ċ } Ċ