/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . jetbrains . kotlin . k apt 3 . test Ċ Ċ import Ġorg . jetbrains . kotlin . k apt 3 . javac . K apt Java FileObject Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . extensions . Analysis Handler Extension Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . JUnit Core Ċ import Ġorg . junit . runner . Request Ċ import Ġjava . io . File Ċ import Ġjavax . annotation . processing . Processing Environment Ċ import Ġjavax . annotation . processing . Round Environment Ċ import Ġjavax . lang . model . element . Element Kind Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ Ċ class ĠKotlin K apt 3 Integration Tests Ġ: ĠAbstract Kotlin K apt 3 IntegrationTest (), ĠJava 9 Test Launcher Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġtest ( ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġvar arg Ġsupported Annotations : ĠString , ĊĠĠĠĠĠĠĠ Ġoptions : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġprocess : Ġ( Set < Type Element >, ĠRound Environment , ĠProcessing Environment ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . test ( name , Ġ* supported Annotations , Ġoptions Ġ= Ġoptions , Ġprocess Ġ= Ġprocess ) ĊĊĠĠĠĠĠĠĠ Ġdo Test With J dk 9 ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle J UnitTest Runner :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin K apt 3 Integration Tests :: class . java . name Ġ+ Ġ"# test " Ġ+ Ġget Test Name ( false ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Simple () Ġ= Ġtest (" Simple ", Ġ" test . My Annotation ") Ġ{ Ġset , Ġround Env , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġset . size ) ĊĠĠĠĠĠĠĠ Ġval Ġannotated Elements Ġ= Ġround Env . getElement s Annotated With ( set . single ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġannotated Elements . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" my Method ", Ġannotated Elements . single (). simple Name . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Comments () Ġ= Ġtest (" Simple ", Ġ" test . My Annotation ") Ġ{ Ġ_, Ġ_, Ġenv Ġ-> ĊĠĠĠĠĠĠĠ Ġfun Ġcomment Of ( className : ĠString ) Ġ= Ġenv . element Utils . get Doc Comment ( env . element Utils . getType Element ( className )) ĊĊĠĠĠĠĠĠĠ Ġassert ( comment Of (" test . Simple ") Ġ== Ġ" Ġ* ĠK Doc Ġcomment .\ n ") ĊĠĠĠĠĠĠĠ Ġassert ( comment Of (" test . Enum Class ") Ġ== Ġnull ) Ġ// Ġsimple Ġcomment Ġ- Ġnot Ġsaved ĊĠĠĠĠĠĠĠ Ġassert ( comment Of (" test . My Annotation ") Ġ== Ġnull ) Ġ// Ġmultiline Ġcomment Ġ- Ġnot Ġsaved ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Simple Stub s And Incremental Data () Ġ= Ġbindings Test (" Simple ") Ġ{ Ġstub s Output Dir , Ġincremental Data Output Dir , Ġbindings Ġ-> ĊĠĠĠĠĠĠĠ Ġassert ( File ( stubs Output Dir , Ġ" error / Non Ex istent Class . java "). exists ()) ĊĠĠĠĠĠĠĠ Ġassert ( File ( stubs Output Dir , Ġ" test / Simple . java "). exists ()) ĊĠĠĠĠĠĠĠ Ġassert ( File ( stubs Output Dir , Ġ" test / Enum Class . java "). exists ()) ĊĊĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple . class "). exists ()) ĊĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Enum Class . class "). exists ()) ĊĊĠĠĠĠĠĠĠ Ġassert ( bindings . any Ġ{ Ġit . key Ġ== Ġ" test / Simple " Ġ&& Ġit . value . name Ġ== Ġ" test / Simple . java " Ġ}) ĊĠĠĠĠĠĠĠ Ġassert ( bindings . any Ġ{ Ġit . key Ġ== Ġ" test / Enum Class " Ġ&& Ġit . value . name Ġ== Ġ" test / Enum Class . java " Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Stub s And Incremental Data For Nested Classes () Ġ{ ĊĠĠĠĠĠĠĠ Ġbindings Test (" Nested Classes ") Ġ{ Ġstub s Output Dir , Ġincremental Data Output Dir , Ġbindings Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( stubs Output Dir , Ġ" test / Simple . java "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! File ( stubs Output Dir , Ġ" test / Simple / Inner Class . java "). exists ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple . class "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple \$ Companion . class "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple \$ Inner Class . class "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple \$ Nested Class . class "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( File ( incremental Data Output Dir , Ġ" test / Simple \$ Nested Class \$ Nested Nested Class . class "). exists ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( bindings . any Ġ{ Ġit . key Ġ== Ġ" test / Simple " Ġ&& Ġit . value . name Ġ== Ġ" test / Simple . java " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( bindings . none Ġ{ Ġit . key . contains (" Companion ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( bindings . none Ġ{ Ġit . key . contains (" Inner Class ") Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbindings Test ( name : ĠString , Ġtest : Ġ( File , ĠFile , ĠMap < String , ĠK apt Java FileObject >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest ( name , Ġ" test . My Annotation ") Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk apt Extension Ġ= ĠAnalysis Handler Extension . get Instances ( my Environment . project ). first Is Instance < K apt 3 Extension For Tests >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub s Output Dir Ġ= Ġk apt Extension . paths . stubs Output Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincremental Data Output Dir Ġ= Ġk apt Extension . paths . incremental Data Output Dir ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbindings Ġ= Ġk apt Extension . saved Bindings !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( stubs Output Dir , Ġincremental Data Output Dir !! , Ġbindings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Options () Ġ= Ġtest ( ĊĠĠĠĠĠĠĠ Ġ" Simple ", Ġ" test . My Annotation ", ĊĠĠĠĠĠĠĠ Ġoptions Ġ= Ġmap Of (" first Key " Ġto Ġ" first Value ", Ġ" second Key " Ġto Ġ"") ĊĠĠĠ Ġ) Ġ{ Ġ_, Ġ_, Ġenv Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġenv . options ĊĠĠĠĠĠĠĠ ĠassertEquals (" first Value ", Ġoptions [" first Key "]) ĊĠĠĠĠĠĠĠ ĠassertTrue (" second Key " Ġin Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Over loads () Ġ= Ġtest (" Over loads ", Ġ" test . My Annotation ") Ġ{ Ġset , Ġround Env , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġset . size ) ĊĠĠĠĠĠĠĠ Ġval Ġannotated Elements Ġ= Ġround Env . getElement s Annotated With ( set . single ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġannotated Elements . size ) ĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġannotated Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enc losed Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠElement Kind . CON STRUCTOR Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠExec utable Element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . parameters . size Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġconstructors . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġconstructors [ 0 ]. parameters . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġconstructors [ 1 ]. parameters . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" int ", Ġconstructors [ 0 ]. parameters [ 0 ]. as Type (). toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" long ", Ġconstructors [ 0 ]. parameters [ 1 ]. as Type (). toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" int ", Ġconstructors [ 1 ]. parameters [ 0 ]. as Type (). toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" long ", Ġconstructors [ 1 ]. parameters [ 1 ]. as Type (). toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" java . lang . String ", Ġconstructors [ 1 ]. parameters [ 2 ]. as Type (). toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" some Int ", Ġconstructors [ 0 ]. parameters [ 0 ]. simple Name . toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" some Long ", Ġconstructors [ 0 ]. parameters [ 1 ]. simple Name . toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" some Int ", Ġconstructors [ 1 ]. parameters [ 0 ]. simple Name . toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" some Long ", Ġconstructors [ 1 ]. parameters [ 1 ]. simple Name . toString ()) ĊĠĠĠĠĠĠĠ ĠassertEquals (" some String ", Ġconstructors [ 1 ]. parameters [ 2 ]. simple Name . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠSingle J UnitTest Runner Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( className , ĠmethodName ) Ġ= Ġargs . single (). split ('# ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . method ( Class . forName ( className ), ĠmethodName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠJ Unit Core (). run ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( if Ġ( result . was Successful ()) Ġ 0 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }