/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . gradle . incremental Ċ Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . io . File Ċ Ċ abstract Ġclass ĠClass path Snapshot Test Common Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠtestData Dir Ġ= ĠFile (" libraries / tools / kotlin - gradle - plugin / src / testData / kotlin . incremental . use Classpath Snapshot ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġtmp Dir Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġabstract Ġclass ĠRelative File ( val Ġbase Dir : ĠFile , Ġval Ġrelative Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġas File () Ġ= ĠFile ( base Dir , Ġrelative Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSource File ( base Dir : ĠFile , Ġrelative Path : ĠString ) Ġ: ĠRelative File ( base Dir , Ġrelative Path ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( relative Path . endsWith (". kt ") Ġ|| Ġrelative Path . endsWith (". java ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠClass File ( base Dir : ĠFile , Ġrelative Path : ĠString ) Ġ: ĠRelative File ( base Dir , Ġrelative Path ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( relative Path . endsWith (". class ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsnapshot () Ġ= ĠClass Snapshot ter . snapshot ( as File (). read Bytes ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠTest SourceFile ( val Ġsource File : ĠSource File , Ġval Ġtmp Dir : ĠTemporary Folder ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġreplace ( oldValue : ĠString , ĠnewValue : ĠString ): ĠTest SourceFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Contents Ġ= Ġsource File . as File (). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( file Contents . contains ( oldValue )) Ġ{ Ġ" String Ġ'$ oldValue ' Ġnot Ġfound Ġin Ġfile Ġ'${ source File . as File (). path } '" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew SourceFile Ġ= ĠSource File ( tmp Dir . new Folder (), Ġsource File . relative Path ). also Ġ{ Ġit . as File (). parent File . mkdir s () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew SourceFile . as File (). write Text ( file Contents . replace ( oldValue , ĠnewValue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTest SourceFile ( new SourceFile , Ġtmp Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcompile (): ĠClass File Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource File . relative Path . endsWith (". kt ") Ġ-> Ġcompile Kotlin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġfile Ġname Ġextension : Ġ'${ source File . as File (). path }' ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompile Kotlin (): ĠClass File Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠCall ĠKotlin Ġcompiler Ġto Ġgenerate Ġclasses Ġ( see Ġhttps :// github . com / Jet Brains / kotlin / pull / 4 5 1 2 # discussion _ r 6 7 9 4 3 2 2 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( source File . base Dir . path . substring Before Last (" src ") Ġ+ Ġ" classes " Ġ+ Ġsource File . base Dir . path . substring After Last (" src ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource File . relative Path . substring Before Last ('.') Ġ+ Ġ". class " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcompile And Snapshot (): ĠClass Snapshot Ġ= Ġcompile (). snapshot () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠChange able Test SourceFile ( source File : ĠSource File , Ġtmp Dir : ĠTemporary Folder ) Ġ: ĠTest SourceFile ( source File , Ġtmp Dir ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġchange Public Method Signature (): ĠTest SourceFile ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġchange Method Implementation (): ĠTest SourceFile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSimple Kotlin Class ( tmp Dir : ĠTemporary Folder ) Ġ: ĠChange able Test SourceFile ( ĊĠĠĠĠĠĠĠ ĠSource File ( File ( testData Dir , Ġ" src / original "), Ġ" com / example / Simple Kotlin Class . kt "), Ġtmp Dir ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchange Public Method Signature (): ĠTest SourceFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTest SourceFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( source File . base Dir . path . replace (" original ", Ġ" changed Public Method Signature ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource File . relative Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġtmp Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchange Method Implementation (): ĠTest SourceFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTest SourceFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( source File . base Dir . path . replace (" original ", Ġ" changed Method Implementation ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource File . relative Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġtmp Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUse ĠGson Ġto Ġcompare Ġobjects ĊĠĠĠ Ġprivate Ġval Ġgson Ġby Ġlazy Ġ{ ĠGson Builder (). set Pretty Print ing (). create () Ġ} ĊĠĠĠ Ġprotected Ġfun ĠAny . to Gson (): ĠString Ġ= Ġgson . toJson ( this ) Ċ } Ċ