Skip to content

Commit b2d5134

Browse files
[KTLN-276] Run Kotlin Script (.kts) files from within Kotlin (#1126)
* unit tests * code changes * code changes * code changes * code changes * code changes * Added integration testing * Code review cleanup --------- Co-authored-by: Brandon Ward <[email protected]>
1 parent 72afb4a commit b2d5134

File tree

4 files changed

+100
-4
lines changed

4 files changed

+100
-4
lines changed

core-kotlin-modules/core-kotlin-advanced-4/pom.xml

+31-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
<version>1.0.0-SNAPSHOT</version>
1414
</parent>
1515

16+
<properties>
17+
<kotlinx-html-jvm.version>0.7.5</kotlinx-html-jvm.version>
18+
<kotlinx-coroutines.version>1.7.3</kotlinx-coroutines.version>
19+
<kotlin-scripting.version>1.8.0</kotlin-scripting.version>
20+
</properties>
21+
1622
<dependencies>
1723

1824
<dependency>
@@ -29,11 +35,32 @@
2935
<scope>test</scope>
3036
</dependency>
3137

38+
<dependency>
39+
<groupId>org.jetbrains.kotlin</groupId>
40+
<artifactId>kotlin-scripting-jsr223</artifactId>
41+
<version>${kotlin-scripting.version}</version>
42+
</dependency>
43+
3244
</dependencies>
3345

34-
<properties>
35-
<kotlinx-html-jvm.version>0.7.5</kotlinx-html-jvm.version>
36-
<kotlinx-coroutines.version>1.7.3</kotlinx-coroutines.version>
37-
</properties>
46+
<profiles>
47+
<profile>
48+
<id>integration-test</id>
49+
<build>
50+
<plugins>
51+
<plugin>
52+
<groupId>org.apache.maven.plugins</groupId>
53+
<artifactId>maven-surefire-plugin</artifactId>
54+
<version>2.22.2</version>
55+
<configuration>
56+
<includes>
57+
<include>**/*IntegrationTest.kt</include>
58+
</includes>
59+
</configuration>
60+
</plugin>
61+
</plugins>
62+
</build>
63+
</profile>
64+
</profiles>
3865

3966
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.runKotlinScripts
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Test
5+
import java.io.File
6+
7+
// requires `kotlinc` to be installed on the machine.
8+
class RunKotlinScriptsIntegrationTest {
9+
@Test
10+
fun `run Kotlin script with ProcessBuilder`() {
11+
val scriptFile = File.createTempFile("test", ".kts")
12+
scriptFile.writeText("""
13+
println("Hello, ProcessBuilder!")
14+
""".trimIndent())
15+
16+
val output = runScriptUsingProcess(scriptFile.absolutePath).trim()
17+
assertEquals("Hello, ProcessBuilder!", output)
18+
}
19+
}
20+
21+
fun runScriptUsingProcess(scriptPath: String): String {
22+
val processBuilder = ProcessBuilder("kotlinc", "-script", scriptPath)
23+
val process = processBuilder.start()
24+
return process.inputStream.bufferedReader().use { it.readText() }
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.baeldung.runKotlinScripts
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Test
5+
import java.io.ByteArrayOutputStream
6+
import java.io.File
7+
import java.io.PrintStream
8+
import javax.script.ScriptEngineManager
9+
10+
class RunKotlinScriptsUnitTest {
11+
12+
@Test
13+
fun `run Kotlin script using ScriptEngine`() {
14+
val scriptFile = File.createTempFile("test", ".kts")
15+
scriptFile.writeText("""
16+
println("Hello from ScriptEngine!")
17+
""".trimIndent())
18+
19+
val output = runKotlinScriptWithEngine(scriptFile.absolutePath).trim()
20+
21+
assertEquals("Hello from ScriptEngine!", output)
22+
}
23+
24+
25+
}
26+
27+
fun runKotlinScriptWithEngine(scriptPath: String): String {
28+
val engine = ScriptEngineManager().getEngineByExtension("kts")
29+
val script = File(scriptPath).readText()
30+
31+
val outputStream = ByteArrayOutputStream()
32+
val originalOut = System.out
33+
System.setOut(PrintStream(outputStream))
34+
35+
try {
36+
engine.eval(script)
37+
} finally {
38+
System.setOut(originalOut)
39+
}
40+
41+
return outputStream.toString()
42+
}
43+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
println("Hello, KScript!")

0 commit comments

Comments
 (0)