/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 . cli Ċ Ċ import Ġcom . intellij . openapi . util . System Info Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġorg . jetbrains . kotlin . test . Kotlin TestUtils Ċ import Ġorg . jetbrains . kotlin . test . TestCase With Tmp dir Ċ import Ġorg . jetbrains . kotlin . utils . Path Util Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . cast Ċ import Ġjava . io .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠLaunch er Script Test Ġ: ĠTestCase With Tmp dir () Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġrun Process ( ĊĠĠĠĠĠĠĠ Ġexecutable Name : ĠString , ĊĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠString , ĊĠĠĠĠĠĠĠ Ġexpected Stdout : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġexpected Stderr : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġexpected ExitCode : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġwork Directory : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecutable FileName Ġ= Ġif Ġ( System Info . is Windows ) Ġ"$ executable Name . bat " Ġelse Ġexecutable Name ĊĠĠĠĠĠĠĠ Ġval Ġlauncher File Ġ= ĠFile ( Path Util . kotlin Paths For Dist Directory . home Path , Ġ" bin /$ executable FileName ") ĊĠĠĠĠĠĠĠ ĠassertTrue (" Launcher Ġscript Ġnot Ġfound , Ġrun Ġdist Ġtask : Ġ${ launcher File . absolute Path }", Ġlauncher File . exists ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġsome Ġreason , ĠIntelliJ 's ĠExec Util Ġscre ws Ġquotes Ġup Ġon Ġwindows . ĊĠĠĠĠĠĠĠ Ġ// ĠSo , Ġuse ĠProcess Builder Ġinstead . ĊĠĠĠĠĠĠĠ Ġval Ġpb Ġ= ĠProcess Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher File . absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcmd , Ġ` =` Ġis Ġdeli meter , Ġso Ġwe Ġneed Ġto Ġsur round Ġparameter Ġwith Ġquotes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ* quote IfNeeded ( args ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpb . directory ( work Directory ) ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġpb . start () ĊĠĠĠĠĠĠĠ Ġval Ġstdout Ġ= ĠString Util . convert Line Separ ators ( process . inputStream . buffered Reader (). use Ġ{ Ġit . read Text () Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġstderr Ġ= ĠString Util . convert Line Separ ators ( process . error Stream . buffered Reader (). use Ġ{ Ġit . read Text () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" Pick ed Ġup Ġ[_ A - Z ]+ : .* \ n ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠ Ġprocess . waitFor ( 1 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġprocess . exit Value () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Stdout , Ġstdout ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Stderr , Ġstderr ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected ExitCode , Ġexit Code ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" exit Ġcode Ġ$ exit Code ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" === ĠST DOUT Ġ== =") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( stdout ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" === ĠSTDERR Ġ== =") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( stderr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquote IfNeeded ( args : ĠArray < out ĠString >): ĠArray < String > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( System Info . is Windows ) Ġargs . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . contains (' =') Ġ|| Ġit . contains (" Ġ") Ġ|| Ġit . contains ("; ") Ġ|| Ġit . contains ("," )) Ġ"\" $ it \"" Ġelse Ġit ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġelse Ġargs . cast () ĊĊĠĠĠ Ġprivate Ġval ĠtestData Directory : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠKotlin TestUtils . get TestData Path Base () Ġ+ Ġ"/ launcher " ĊĊĠĠĠ Ġfun Ġtest Kotlin c Simple () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / hello World . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Kotlin c Jvm Simple () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c - jvm ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / hello World . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Kotlin c Jvm Script With Class Path From Sys Prop () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c - jvm ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- script ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / class Path Prop Test . k ts ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ" kotlin - compiler . jar \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Kotlin Jvm Context ClassLoader () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Test Jar Ġ= ĠFile ( Path Util . kotlin Paths For Dist Directory . home Path , Ġ" lib / kotlin - test . jar ") ĊĠĠĠĠĠĠĠ ĠassertTrue (" kotlin - main - k ts . jar Ġnot Ġfound , Ġrun Ġdist Ġtask : Ġ${ kotlin Test Jar . absolute Path }", Ġkotlin Test Jar . exists ()) ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- cp ", Ġkotlin Test Jar . path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / context ClassLoader Tester . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- cp ", ĠlistOf ( tmpdir . path , Ġkotlin Test Jar . path ). join ToString ( File . path Separator ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Context ClassLoader Tester ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ"${ kotlin Test Jar . name }\ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Kotlin c Js Simple () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c - js ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / empty Main . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- output ", ĠFile ( tmpdir , Ġ" out . js "). path ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Kotlin No Reflect () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / reflection Usage . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- cp ", Ġtmp dir . path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- no - reflect ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Reflection Usage Kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ" no Ġreflection " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest DoNot Append Current Dir To Non Empty Classpath () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / hello World . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Process (" kotlin ", Ġ" test . HelloWorld Kt ", Ġexpected Stdout Ġ= Ġ" Hello !\ n ", Ġwork Directory Ġ= Ġtmp dir ) ĊĊĠĠĠĠĠĠĠ Ġval Ġempty Dir Ġ= ĠKotlin TestUtils . tmp Dir For Test ( this ) ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- cp ", Ġempty Dir . path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" test . HelloWorld Kt ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stderr Ġ= Ġ" error : Ġcould Ġnot Ġfind Ġor Ġload Ġmain Ġclass Ġtest . HelloWorld Kt \ n ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ExitCode Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Directory Ġ= Ġtmp dir ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Runner Expression () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- e ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" val Ġx Ġ= Ġ 2 ; Ġ( args Ġ+ ĠlistOf ( 2 , 1 ). map Ġ{ Ġ( it Ġ* Ġx ). toString () Ġ}). join ToString ()", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ" a , Ġb , Ġ 4 , Ġ 2 \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Command line Processing () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- e ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" println ( args . join ToString ()) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- a ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ"- a , Ġb \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- e ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" println ( args . join ToString ()) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- a ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ"- a , Ġb \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / print args . k ts ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- a ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ"- a , Ġb \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / print args . k ts ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- a ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Stdout Ġ= Ġ"- a , Ġb \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Legacy Assert () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / legacy Assert Disabled . kt ", Ġ"- X assertions = legacy ", Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Process (" kotlin ", Ġ" Legacy Assert Disabled Kt ", Ġ"- J - da : kotlin ._ Assertions ", Ġwork Directory Ġ= Ġtmp dir ) ĊĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin c ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ testData Directory / legacy Assert Enabled . kt ", Ġ"- X assertions = legacy ", Ġ"- d ", Ġtmp dir . path ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Process (" kotlin ", Ġ" Legacy Assert Enabled Kt ", Ġ"- J - ea : kotlin ._ Assertions ", Ġwork Directory Ġ= Ġtmp dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Property () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Process (" kotlin c ", Ġ"$ testData Directory / property . kt ", Ġ"- d ", Ġtmp dir . path ) ĊĊĠĠĠĠĠĠĠ Ġrun Process ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" kotlin ", Ġ" Property Kt ", Ġ"- D result = OK ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Directory Ġ= Ġtmp dir , Ġexpected Stdout Ġ= Ġ" OK \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ