/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . room . compiler . processing Ċ Ċ import Ġandroidx . room . compiler . processing . util . Source Ċ import Ġandroidx . room . compiler . processing . util . X Test Invocation Ċ import Ġandroidx . room . compiler . processing . util . compile Files Ċ import Ġandroidx . room . compiler . processing . util . getAll Field Names Ċ import Ġandroidx . room . compiler . processing . util . getField Ċ import Ġandroidx . room . compiler . processing . util . getMethod Ċ import Ġandroidx . room . compiler . processing . util . run K sp Test Ċ import Ġandroidx . room . compiler . processing . util . run Processor Test Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . common . truth . Truth . assert With Message Ċ import Ġcom . squareup . jav ap o et . ClassName Ċ import Ġcom . squareup . jav ap o et . Parameterized TypeName Ċ import Ġcom . squareup . jav ap o et . TypeName Ċ import Ġcom . squareup . jav ap o et . Type Variable Name Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠX Type Element Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġqualified Names () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc 1 Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠTop Level ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc 2 Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bar . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġfoo . bar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠIn Foo Bar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc 3 Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" foo . bar . Outer ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġfoo . bar ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġclass ĠO uter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġstatic Ġclass ĠNested Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= ĠlistOf ( src 1 , Ġsrc 2 , Ġsrc 3 ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" TopLevel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" TopLevel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ClassName . get ("", Ġ" TopLevel ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . In Foo Bar "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" foo . bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" In Foo Bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" foo . bar . In Foo Bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ClassName . get (" foo . bar ", Ġ" In Foo Bar ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Outer "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" foo . bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" Outer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" foo . bar . Outer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get (" foo . bar ", Ġ" Outer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Outer . Nested "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" foo . bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" Nested ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" foo . bar . Outer . Nested ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Name . get (" foo . bar ", Ġ" Outer ", Ġ" Nested ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invocation . is K sp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthese Ġare ĠK SP Ġspecific Ġtests , Ġtypename s Ġare Ġtested Ġelsewhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" java . lang . Integer "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalways Ġreturn Ġkotlin Ġtypes , Ġthis Ġis Ġwhat Ġcompiler Ġdoes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" kotlin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" Int ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" kotlin . Int ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" kotlin . Int "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" kotlin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" Int ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . qualified Name ). isEqualTo (" kotlin . Int ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtype And Super Type () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġfoo . bar ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠB az Ġ: ĠMy Interface , ĠAbstract Class () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract Class Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . B az "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . super Type ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type (" foo . bar . Abstract Class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . type ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type (" foo . bar . B az ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Interface ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Kotlin Object ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Abstract Class "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . super Type ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠK SP Ġdoes Ġnot Ġreturn ĠObject Ġ/ ĠAny Ġas Ġsuper Ġclass ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invocation . is K sp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type ( TypeName . OBJECT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Interface ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . type ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type (" foo . bar . Abstract Class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . My Interface "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . super Type ). isNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Interface ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . type ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type (" foo . bar . My Interface ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnested ClassName () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġfoo . bar ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠO uter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠInner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Outer "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ClassName . get (" foo . bar ", Ġ" Outer ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . enc lo sing Type Element ). isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Outer . Inner "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . className ). isEqualTo ( ClassName . get (" foo . bar ", Ġ" Outer ", Ġ" Inner ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . packageName ). isEqualTo (" foo . bar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . name ). isEqualTo (" Inner ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . enc lo sing Type Element ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" foo . bar . Outer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmodifiers () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Src Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠOpen Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠMy Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠFinal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġclass ĠPrivate Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠO uter Kotlin Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġclass ĠInner Kotlin Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠNested Kotlin Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġclass ĠKotlin Annotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠData Class ( val Ġfoo : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġclass ĠInline Class ( val Ġfoo : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġinterface ĠFun Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfoo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġjava Src Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Outer Java Class ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġclass ĠO uter Java Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġclass ĠInner Java Class Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġstatic Ġclass ĠNested Java Class Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġjava Annotation Src Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Java Annotation ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ@ interface ĠJava Annotation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= ĠlistOf ( kotlin Src , Ġjava Src , Ġjava Annotation Src ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Modifiers ( element : ĠX Type Element ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Abstract ()) Ġresult . add (" abstract ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Final ()) Ġresult . add (" final ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Private ()) Ġresult . add (" private ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Protected ()) Ġresult . add (" protected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Public ()) Ġresult . add (" public ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Kotlin Object ()) Ġresult . add (" object ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Companion Object ()) Ġresult . add (" comp anion ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Functional Interface ()) Ġresult . add (" fun ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Class ()) Ġresult . add (" class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Data Class ()) Ġresult . add (" data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Value Class ()) Ġresult . add (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Expect ()) Ġresult . add (" expect ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Interface ()) Ġresult . add (" interface ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Static ()) Ġresult . add (" static ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Annotation Class ()) Ġresult . add (" annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Modifiers ( q Name : ĠString ): ĠSet < String > Ġ= Ġget Modifiers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. require Type Element ( q Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Open Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Abstract Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" abstract ", Ġ" public ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" My Object ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" final ", Ġ" public ", Ġ" object ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" My Interface ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" abstract ", Ġ" interface ", Ġ" public ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Final ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" final ", Ġ" public ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Private Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly Elements In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invocation . is K sp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" private ", Ġ" final ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjava Ġdoes Ġnot Ġsupport Ġtop Ġlevel Ġprivate Ġclasses . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" final ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Outer Kotlin Class . Inner Kotlin Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" final ", Ġ" public ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Outer Kotlin Class . Nested Kotlin Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" final ", Ġ" public ", Ġ" static ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Outer Java Class . Inner Java Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Outer Java Class . Nested Java Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" static ", Ġ" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Java Annotation ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" abstract ", Ġ" public ", Ġ" annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Kotlin Annotation ")). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠK SP Ġvs ĠK AP T Ġmetadata Ġhave Ġa Ġdifference Ġin Ġfinal Ġvs Ġabstract Ġmodifiers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġannotation Ġtypes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invocation . is K sp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Exactly (" final ", Ġ" public ", Ġ" annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Exactly (" abstract ", Ġ" public ", Ġ" annotation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Data Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" final ", Ġ" class ", Ġ" data ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Inline Class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" final ", Ġ" class ", Ġ" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( get Modifiers (" Fun Interface ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" public ", Ġ" abstract ", Ġ" interface ", Ġ" fun ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġkind Name () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠMy Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" My Class "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . kind Name ()). isEqualTo (" class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" My Interface "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . kind Name ()). isEqualTo (" interface ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfield Basic () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBaseClass < T >( val Ġgeneric Prop Ġ: ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbase Method ( input : ĠT ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub Class ( x Ġ: ĠInt ) Ġ: ĠBaseClass < Int >( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Class Prop Ġ: ĠString Ġ= Ġ" abc " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Class Ġ= Ġinvocation . processing Env . require Type Element (" Base Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base Class . getAll Field Names ()). contains Exactly (" generic Prop ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base Class . getDeclared Fields (). map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" generic Prop ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Class Ġ= Ġinvocation . processing Env . require Type Element (" Sub Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub Class . getAll Field Names ()). contains Exactly (" generic Prop ", Ġ" sub Class Prop ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub Class . getDeclared Fields (). map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" sub Class Prop ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Method Ġ= Ġbase Class . getMethod (" base Method ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Method . as Member Of ( sub Class . type ). let Ġ{ Ġmethod Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric Arg Ġ= Ġmethod Type . parameter Types . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( generic Arg . typeName ). isEqualTo ( TypeName . INT . box ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Class . getField (" generic Prop "). let Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invocation . is K sp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġk sp Ġreplaces Ġthese Ġwith ĠAny ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( field . type . typeName ). isEqualTo ( TypeName . OBJECT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( field . type . typeName ). isEqualTo ( Type Variable Name . get (" T ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Class . getField (" generic Prop "). let Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġtricky Ġbecause Ġeven Ġthough Ġit Ġis Ġnon - null Ġit , Ġit Ġshould Ġstill Ġbe Ġbox ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( field . type . typeName ). isEqualTo ( TypeName . INT . box ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfields Override () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBaseClass ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġval Ġvalue Ġ: ĠList < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvalue Ġ: ĠMutable List < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ: ĠBaseClass ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Class Ġ= Ġinvocation . processing Env . require Type Element (" Base Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base Class . getAll Field Names ()). contains Exactly (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Class Ġ= Ġinvocation . processing Env . require Type Element (" Sub Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub Class . getAll Field Names ()). contains Exactly (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Class . getField (" value "). type . typeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( List :: class . java , ĠInteger :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Class . getField (" value "). type . typeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized TypeName . get ( List :: class . java , ĠInteger :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfields In Interfaces () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx : Int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġinvocation . processing Env . require Type Element (" My Interface ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( element . getAll Fields In cluding Private Sup ers ()). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" getX "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" set X "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfields In Abstract Class () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠMy Abstract Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj vm Var : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġvar Ġabstract Var : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnon Abstract Var : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġinvocation . processing Env . require Type Element (" My Abstract Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getAll Field Names () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" non Abstract Var ", Ġ" jvm Var " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getDeclared Methods (). map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Abstract Var ", Ġ" set Abstract Var ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Non Abstract Var ", Ġ" set Non Abstract Var " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" get Abstract Var "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" set Abstract Var "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" get Non Abstract Var "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getMethod (" set Non Abstract Var "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . is Abstract ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġproperty Get ters Set ters () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependency Java Source Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dependency Java Subject . java ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠDependency Java Subject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġmy Field ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġint Ġmutable ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġimmutable ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġget Mutable () Ġ{ return Ġ 3 ;} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġset Mutable ( int Ġx ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġget Immutable () Ġ{ return Ġ 3 ;} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdependency Kotlin Source Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dependency Kotlin Subject . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠDependency Kotlin Subject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Field Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmutable : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimmutable : Int Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= Ġcompile Files ( listOf ( dependency Java Source , Ġdependency Kotlin Source )) ĊĠĠĠĠĠĠĠ Ġval Ġjava Source Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Java Subject . java ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠJava Subject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġmy Field ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġint Ġmutable ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġimmutable ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġget Mutable () Ġ{ return Ġ 3 ;} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġset Mutable ( int Ġx ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġget Immutable () Ġ{ return Ġ 3 ;} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Source Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin Subject . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠKotlin Subject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Field Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmutable : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimmutable : Int Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( java Source , Ġkotlin Source ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= ĠlistOf ( dependency ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Java Subject ", Ġ" Dependency Java Subject ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin Subject ", Ġ" Dependency Kotlin Subject " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġsubject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( subject . qualified Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . getDeclared Methods (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Mutable ", Ġ" set Mutable ", Ġ" get Immutable " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeclared And Instance Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBase ( x : Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġfun Ġbase Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġsuspend Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprivate Base Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstatic Base Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcompanion Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠSub Class Ġ: ĠBase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( y : Int ): Ġsuper ( y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( x : Int , Ġy : Int ): Ġsuper ( y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbase Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġsub Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprivate Sub Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġstatic Fun (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġinvocation . processing Env . require Type Element (" Base ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Method Names Ġ= Ġinvocation . object Method Names () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base Fun ", Ġ" suspend Fun ", Ġ" private Base Fun ", Ġ" static Base Fun " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġinvocation . processing Env . require Type Element (" Sub Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base Fun ", Ġ" sub Fun ", Ġ" private Sub Fun ", Ġ" static Fun " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub . getAll Non Private Instance Methods (). names () Ġ- Ġobject Method Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base Fun ", Ġ" suspend Fun ", Ġ" sub Fun " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġall Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBase ( x : Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( x : Int , Ġy : Int ): Ġthis ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbase Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġfun Ġoverridden Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprivate Base Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprivate Base Companion Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbase Companion Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġinterface Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub Class Ġ: ĠBase , ĠMy Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( x : Int ): Ġsuper ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( x : Int , Ġy : Int ): Ġsuper ( y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġsub Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġprivate Sub Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġoverridden Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinterface Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġdont See This One (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġsub Companion Method (): ĠInt Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Method Names Ġ= Ġinvocation . object Method Names () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġinvocation . processing Env . require Type Element (" Sub Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . getAll Methods (). names () Ġ- Ġobject Method Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base Method ", Ġ" over ridden Method ", Ġ" base Companion Method ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" interface Method ", Ġ" sub Method ", Ġ" private Sub Method ", Ġ" sub Companion Method " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgetters Set ters () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠJust Getter ( val Ġx : Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġinvisible : Int Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinvisible Mutable : Int Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠGetter Setter ( var Ġy : Int ) Ġ: ĠJust Getter ( y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsub In visible : Int Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsub In visible Mutable : Int Ġ= ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject Method Names Ġ= Ġinvocation . object Method Names () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" Just Getter "). let Ġ{ Ġbase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getAll Methods (). names () Ġ- Ġobject Method Names ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase . getAll Non Private Instance Methods (). names () Ġ- Ġobject Method Names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" Getter Setter "). let Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getAll Methods (). names () Ġ- Ġobject Method Names ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX ", Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub . getAll Non Private Instance Methods (). names () Ġ- Ġobject Method Names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX ", Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgetters Set ters _ comp anion () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠComp anion Subject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmutable Static : ĠString Ġ= Ġ" a " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimmutable Static : ĠString Ġ= Ġ" bar " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion Prop : ĠInt Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub Class Ġ: ĠComp anion Subject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠK AP T Ġis Ġa Ġbit Ġag gressive Ġin Ġadding Ġfields , Ġspecifically , Ġit Ġadds Ġcompanion Prop Ġand ĊĠĠĠĠĠĠĠ Ġ// ĠComp anion Ġas Ġstatic Ġfields Ġwhich Ġare Ġnot Ġreally Ġfields Ġfrom Ġroom 's Ġperspective . ĊĠĠĠĠĠĠĠ Ġrun K sp Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= Ġinvocation . processing Env . require Type Element (" Companion Subject ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getAll Field Names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mutable Static ", Ġ" immutable Static " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Mutable Static ", Ġ" set Mutable Static ", Ġ" get Immutable Static " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getAll Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Mutable Static ", Ġ" set Mutable Static ", Ġ" get Immutable Static " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getAll Non Private Instance Methods (). names ()). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Class Ġ= Ġinvocation . processing Env . require Type Element (" Sub Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub Class . getDeclared Methods ()). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub Class . getAll Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Mutable Static ", Ġ" set Mutable Static ", Ġ" get Immutable Static " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgetters Set ters _ interface () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠJust Getter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx : Int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠGetter Setter Ġ: ĠJust Getter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy : Int ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" Just Getter "). let Ġ{ Ġbase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getAll Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( base . getAll Non Private Instance Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" Getter Setter "). let Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getDeclared Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getAll Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX ", Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( sub . getAll Non Private Instance Methods (). names ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" getX ", Ġ" getY ", Ġ" set Y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconstructors () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠNo Explicit Constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBase ( x : Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠExplicit Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( x : Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġclass ĠBase With Secondary ( x : Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( y : String ): this ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub ( x : Int ) Ġ: ĠBase ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub With 3 Construct ors () Ġ: ĠBase With Secondary (" abc ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( list : List < String >): Ġthis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor ( list : List < String >, Ġx : Int ): Ġthis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract No Explicit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract Explicit ( x : Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubjects Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Interface ", Ġ" No Explicit Constructor ", Ġ" Base ", Ġ" Explicit Constructor ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base With Secondary ", Ġ" Sub ", Ġ" Sub With 3 Construct ors ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract No Explicit ", Ġ" Abstract Explicit " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Counts Ġ= Ġsubjects . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġinvocation . processing Env . require Type Element ( it ). get Construct ors (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( constructor Counts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Interface " Ġto Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Explicit Constructor " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Explicit Constructor " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base With Secondary " Ġto Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub With 3 Construct ors " Ġto Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract No Explicit " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract Explicit " Ġto Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Constructor Parameter Names Ġ= Ġsubjects . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġinvocation . processing Env . require Type Element ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Primary Constructor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . parameters ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( primary Constructor Parameter Names ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Interface " Ġto Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Explicit Constructor " Ġto Ġempty List < String >(), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base " Ġto ĠlistOf (" x "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Explicit Constructor " Ġto Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base With Secondary " Ġto ĠlistOf (" x "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub " Ġto ĠlistOf (" x "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub With 3 Construct ors " Ġto Ġempty List < String >(), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract No Explicit " Ġto Ġempty List < String >(), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract Explicit " Ġto ĠlistOf (" x ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġj vm Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġnot Jvm Default () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Jvm Default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġj vm Default () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= Ġinvocation . processing Env . require Type Element (" My Interface ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getMethod (" not Jvm Default "). is Java Default ()). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( subject . getMethod (" jvm Default "). is Java Default ()). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconstructors _ java () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Source ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġjava . util . List ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠMy Interface Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠNo Explicit Constructor {} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠBase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase ( int Ġx ){} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠExplicit Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExplicit Constructor ( int Ġx ){} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠBase With Secondary Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase With Secondary ( int Ġx ){} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase With Secondary ( String Ġy ){} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub Ġextends ĠBase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub ( int Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper ( x ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠSub With 3 Construct ors Ġextends ĠBase With Secondary Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub With 3 Construct ors () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper ( 3 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub With 3 Construct ors ( List < String > Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper ( 3 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub With 3 Construct ors ( List < String > Ġlist , Ġint Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper ( 3 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract No Explicit Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġclass ĠAbstract Explicit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAbstract Explicit ( int Ġx ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubjects Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Interface ", Ġ" No Explicit Constructor ", Ġ" Base ", Ġ" Explicit Constructor ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base With Secondary ", Ġ" Sub ", Ġ" Sub With 3 Construct ors ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract No Explicit ", Ġ" Abstract Explicit " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Counts Ġ= Ġsubjects . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġinvocation . processing Env . require Type Element ( it ). get Construct ors (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( constructor Counts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Interface " Ġto Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Explicit Constructor " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Explicit Constructor " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Base With Secondary " Ġto Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sub With 3 Construct ors " Ġto Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract No Explicit " Ġto Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract Explicit " Ġto Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubjects . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( invocation . processing Env . require Type Element ( it ). find Primary Constructor ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġenum Type Element () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Sources ( packageName : ĠString ) Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ packageName / Kotlin Enum . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġ$ packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Ġclass ĠKotlin Enum ( private Ġval Ġx : Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVAL 1 ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVAL 2 ( 2 ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġenum Method (): Unit Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ packageName . Java Enum ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġ$ packageName ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġenum ĠJava Enum Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVAL 1 ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVAL 2 ( 2 ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġint Ġx ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava Enum ( int Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . x Ġ= Ġx ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġenum Method () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclasspath Ġ= Ġcompile Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Sources (" lib ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġcreate Sources (" app "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= ĠlistOf ( classpath ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lib . Kotlin Enum ", Ġ" lib . Java Enum ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" app . Kotlin Enum ", Ġ" app . Java Enum " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġq Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġinvocation . processing Env . require Type Element ( q Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ("$ q Name Ġis Ġenum ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( type Element . is Enum ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ("$ q Name Ġdoes Ġnot Ġreport Ġenum Ġconstants Ġin Ġmethods ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( type Element . getDeclared Methods (). map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains (" enum Method ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains None Of (" VAL 1 ", Ġ" VAL 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ("$ q Name Ġcan Ġreturn Ġenum Ġconstants ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that (( type Element Ġas ĠX Enum Type Element ). entries . map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly (" VAL 1 ", Ġ" VAL 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert With Message ("$ q Name Ġ Ġdoes Ġnot Ġreport Ġenum Ġconstants Ġin Ġfields ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. that ( type Element . getAll Field Names ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains (" x ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains None Of (" VAL 1 ", Ġ" VAL 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġen closed Types () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foo . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠTop Level Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠNested Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠNested Object ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠNested Interface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Ġclass ĠNested Enum Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA , ĠB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfoo Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Level Class Ġ= Ġinvocation . processing Env . require Type Element (" TopLevel Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġen closed Type Elements Ġ= Ġtop Level Class . get En closed Type Elements () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( enc losed Type Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Class "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Object "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Interface "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Enum "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Companion "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġen closed Types _ java () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠSource . java ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Source ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠTop Level Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠInner Class Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Ġclass ĠNested Class Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterface ĠNested Interface Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum ĠNested Enum Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA , ĠB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Processor Test ( sources Ġ= ĠlistOf ( src )) Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Level Class Ġ= Ġinvocation . processing Env . require Type Element (" TopLevel Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġen closed Type Elements Ġ= Ġtop Level Class . get En closed Type Elements () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( enc losed Type Elements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Inner Class "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Class "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Interface "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . processing Env . require Type Element (" TopLevel Class . Nested Enum "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġit Ġis Ġgood Ġto Ġexclude Ġmethods Ġcoming Ġfrom ĠObject Ġwhen Ġtesting Ġas Ġthey Ġdiffer Ġbetween ĠK SP ĊĠĠĠĠ Ġ* Ġand ĠK AP T Ġbut Ġir relevant Ġfor ĠRoom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠX Test Invocation . object Method Names () Ġ= Ġprocessing Env ĊĠĠĠĠĠĠĠ Ġ. require Type Element (" java . lang . Object ") ĊĠĠĠĠĠĠĠ Ġ. getAll Methods () ĊĠĠĠĠĠĠĠ Ġ. names () ĊĊĠĠĠ Ġprivate Ġfun ĠList < X Method Element >. names () Ġ= Ġmap Ġ{ ĊĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠ Ġ} Ċ } Ċ