Skip to content

Commit 23c62ab

Browse files
committed
Improve tests, make Result class easier to use
1 parent 81c138e commit 23c62ab

File tree

6 files changed

+70
-39
lines changed

6 files changed

+70
-39
lines changed

.idea/codeStyles/codeStyleConfig.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ dependencies {
5656

5757
// the Kotlin compiler should be near the end of the list because its .jar file includes
5858
// an obsolete version of Guava
59-
compile "org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.11"
60-
compile "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable:1.3.11"
59+
compile "org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.21"
60+
compile "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable:1.3.21"
6161
}
6262

6363
compileKotlin {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
#Wed Mar 27 14:49:30 CET 2019
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip

src/main/kotlin/com/tschuchort/compiletesting/KotlinCompilation.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.config.Services
3030
import org.jetbrains.kotlin.incremental.isJavaFile
3131
import java.io.*
3232
import java.lang.RuntimeException
33+
import java.net.URLClassLoader
3334
import java.util.zip.ZipEntry
3435
import java.util.zip.ZipOutputStream
3536
import javax.tools.Diagnostic
@@ -219,8 +220,15 @@ data class KotlinCompilation(
219220
}
220221

221222
/** Result of the compilation */
222-
data class Result(val exitCode: ExitCode, val outputDirectory: File) {
223+
data class Result(val exitCode: ExitCode, val outputDirectory: File,
224+
/** Messages that were printed by the compilation */
225+
val messages: String) {
226+
/** All output files that were created by the compilation */
223227
val generatedFiles: Collection<File> = outputDirectory.listFilesRecursively()
228+
229+
/** class loader to load the compile classes */
230+
val classLoader = URLClassLoader(arrayOf(outputDirectory.toURI().toURL()),
231+
this::class.java.classLoader)
224232
}
225233

226234
/** A service that will be passed to kapt */
@@ -509,8 +517,9 @@ data class KotlinCompilation(
509517
if(services.isNotEmpty()) {
510518
val exitCode = stubsAndApt(compilerMessageCollector)
511519
if(exitCode != ExitCode.OK) {
512-
searchSystemOutForKnownErrors(compilerSystemOutBuffer.readUtf8())
513-
return Result(exitCode, classesDir)
520+
val messages = compilerSystemOutBuffer.readUtf8()
521+
searchSystemOutForKnownErrors(messages)
522+
return Result(exitCode, classesDir, messages)
514523
}
515524
}
516525
else if(verbose) {
@@ -520,17 +529,20 @@ data class KotlinCompilation(
520529
// step 3: compile Kotlin files
521530
compileKotlin(compilerMessageCollector).let { exitCode ->
522531
if(exitCode != ExitCode.OK) {
523-
searchSystemOutForKnownErrors(compilerSystemOutBuffer.readUtf8())
524-
return Result(exitCode, classesDir)
532+
val messages = compilerSystemOutBuffer.readUtf8()
533+
searchSystemOutForKnownErrors(messages)
534+
return Result(exitCode, classesDir, messages)
525535
}
526536
}
527537

528538
// step 4: compile Java files
529539
compileJava().let { exitCode ->
540+
val messages = compilerSystemOutBuffer.readUtf8()
541+
530542
if(exitCode != ExitCode.OK)
531-
searchSystemOutForKnownErrors(compilerSystemOutBuffer.readUtf8())
543+
searchSystemOutForKnownErrors(messages)
532544

533-
return Result(exitCode, classesDir)
545+
return Result(exitCode, classesDir, messages)
534546
}
535547
}
536548

src/test/kotlin/com/tschuchort/compiletesting/KotlinCompilationTests.kt

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.tschuchort.compiletesting
33
import okio.Buffer
44
import org.assertj.core.api.Assertions.assertThat
55
import com.tschuchort.compiletesting.KotlinCompilation.ExitCode
6+
import org.assertj.core.api.Assertions.fail
67
import org.junit.Rule
78
import org.junit.Test
89
import org.junit.rules.TemporaryFolder
@@ -21,10 +22,11 @@ class KotlinCompilationTests {
2122
@Test
2223
fun `runs with only kotlin sources`() {
2324
val result = compilationPreset().copy(
24-
sources = listOf(KotlinCompilation.SourceFile("kSource.kt", ""))
25+
sources = listOf(KotlinCompilation.SourceFile("kSource.kt", "class KSource"))
2526
).compile_()
2627

2728
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
29+
assertClassLoadable(result, "KSource")
2830
}
2931

3032
@Test
@@ -34,6 +36,7 @@ class KotlinCompilationTests {
3436
).compile_()
3537

3638
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
39+
assertClassLoadable(result, "JSource")
3740
}
3841

3942
@Test
@@ -62,6 +65,7 @@ class KotlinCompilationTests {
6265
).compile_()
6366

6467
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
68+
assertClassLoadable(result, "KSourceKt")
6569
}
6670

6771
@Test
@@ -85,17 +89,15 @@ class KotlinCompilationTests {
8589

8690
@Test
8791
fun `can compile Kotlin without JDK`() {
88-
val source = KotlinCompilation.SourceFile("kSource.kt", """
89-
|fun foo() {
90-
|}
91-
""".trimMargin())
92+
val source = KotlinCompilation.SourceFile("kSource.kt", "class KClass")
9293

9394
val result = compilationPreset().copy(
9495
sources = listOf(source),
9596
jdkHome = null
9697
).compile_()
9798

9899
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
100+
assertClassLoadable(result, "KClass")
99101
}
100102

101103
@Test
@@ -116,6 +118,7 @@ class KotlinCompilationTests {
116118
).compile_()
117119

118120
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
121+
assertClassLoadable(result, "JSource")
119122
}
120123

121124
@Test
@@ -141,10 +144,10 @@ class KotlinCompilationTests {
141144

142145
@Test
143146
fun `Java inherits classpath`() {
144-
val source = KotlinCompilation.SourceFile("Source.java", """
147+
val source = KotlinCompilation.SourceFile("JSource.java", """
145148
package com.tschuchort.compiletesting;
146149
147-
class Source {
150+
class JSource {
148151
void foo() {
149152
String s = KotlinCompilationTests.InheritedClass.class.getName();
150153
}
@@ -157,14 +160,15 @@ class KotlinCompilationTests {
157160
).compile_()
158161

159162
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
163+
assertClassLoadable(result, "com.tschuchort.compiletesting.JSource")
160164
}
161165

162166
@Test
163167
fun `Kotlin inherits classpath`() {
164-
val source = KotlinCompilation.SourceFile("Source.kt", """
168+
val source = KotlinCompilation.SourceFile("KSource.kt", """
165169
package com.tschuchort.compiletesting
166170
167-
class Source {
171+
class KSource {
168172
fun foo() {
169173
val s = KotlinCompilationTests.InheritedClass::class.java.name
170174
}
@@ -178,6 +182,7 @@ class KotlinCompilationTests {
178182
).compile_()
179183

180184
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
185+
assertClassLoadable(result, "com.tschuchort.compiletesting.KSource")
181186
}
182187

183188
@Test
@@ -263,6 +268,8 @@ class KotlinCompilationTests {
263268
).compile_()
264269

265270
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
271+
assertClassLoadable(result, "com.tschuchort.compiletesting.KSource")
272+
assertClassLoadable(result, "com.tschuchort.compiletesting.JSource")
266273
}
267274

268275
@Test
@@ -290,6 +297,8 @@ class KotlinCompilationTests {
290297
).compile_()
291298

292299
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
300+
assertClassLoadable(result, "com.tschuchort.compiletesting.KSource")
301+
assertClassLoadable(result, "com.tschuchort.compiletesting.JSource")
293302
}
294303

295304
@Test
@@ -310,9 +319,9 @@ class KotlinCompilationTests {
310319
).compile_()
311320

312321
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
313-
assertThat(result.systemOut).contains(JavaTestProcessor.ON_INIT_MSG)
322+
assertThat(result.messages).contains(JavaTestProcessor.ON_INIT_MSG)
314323

315-
assertThat(ProcessedElemMessage.parseAllIn(result.systemOut)).anyMatch {
324+
assertThat(ProcessedElemMessage.parseAllIn(result.messages)).anyMatch {
316325
it.elementSimpleName == "KSource"
317326
}
318327
}
@@ -335,9 +344,9 @@ class KotlinCompilationTests {
335344
).compile_()
336345

337346
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
338-
assertThat(result.systemOut).contains(JavaTestProcessor.ON_INIT_MSG)
347+
assertThat(result.messages).contains(JavaTestProcessor.ON_INIT_MSG)
339348

340-
assertThat(ProcessedElemMessage.parseAllIn(result.systemOut)).anyMatch {
349+
assertThat(ProcessedElemMessage.parseAllIn(result.messages)).anyMatch {
341350
it.elementSimpleName == "JSource"
342351
}
343352
}
@@ -361,9 +370,9 @@ class KotlinCompilationTests {
361370
).compile_()
362371

363372
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
364-
assertThat(result.systemOut).contains(KotlinTestProcessor.ON_INIT_MSG)
373+
assertThat(result.messages).contains(KotlinTestProcessor.ON_INIT_MSG)
365374

366-
assertThat(ProcessedElemMessage.parseAllIn(result.systemOut)).anyMatch {
375+
assertThat(ProcessedElemMessage.parseAllIn(result.messages)).anyMatch {
367376
it.elementSimpleName == "KSource"
368377
}
369378
}
@@ -388,9 +397,9 @@ class KotlinCompilationTests {
388397
).compile_()
389398

390399
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
391-
assertThat(result.systemOut).contains(KotlinTestProcessor.ON_INIT_MSG)
400+
assertThat(result.messages).contains(KotlinTestProcessor.ON_INIT_MSG)
392401

393-
assertThat(ProcessedElemMessage.parseAllIn(result.systemOut)).anyMatch {
402+
assertThat(ProcessedElemMessage.parseAllIn(result.messages)).anyMatch {
394403
it.elementSimpleName == "JSource"
395404
}
396405
}
@@ -414,7 +423,7 @@ class KotlinCompilationTests {
414423
).compile_()
415424

416425
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
417-
assertThat(result.systemOut).contains(KotlinTestProcessor.ON_INIT_MSG)
426+
assertThat(result.messages).contains(KotlinTestProcessor.ON_INIT_MSG)
418427

419428
val clazz = result.classLoader.loadClass(KotlinTestProcessor.GENERATED_PACKAGE +
420429
"." + KotlinTestProcessor.GENERATED_KOTLIN_CLASS_NAME)
@@ -444,6 +453,8 @@ class KotlinCompilationTests {
444453
).compile_()
445454

446455
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
456+
assertClassLoadable(result, "com.tschuchort.compiletesting.JSource")
457+
assertClassLoadable(result, "${KotlinTestProcessor.GENERATED_PACKAGE}.${KotlinTestProcessor.GENERATED_KOTLIN_CLASS_NAME}")
447458
}
448459

449460
@Test
@@ -469,6 +480,8 @@ class KotlinCompilationTests {
469480
).compile_()
470481

471482
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
483+
assertClassLoadable(result, "com.tschuchort.compiletesting.JSource")
484+
assertClassLoadable(result, "${KotlinTestProcessor.GENERATED_PACKAGE}.${KotlinTestProcessor.GENERATED_JAVA_CLASS_NAME}")
472485
}
473486

474487
@Test
@@ -494,6 +507,8 @@ class KotlinCompilationTests {
494507
).compile_()
495508

496509
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
510+
assertClassLoadable(result, "com.tschuchort.compiletesting.KSource")
511+
assertClassLoadable(result, "${KotlinTestProcessor.GENERATED_PACKAGE}.${KotlinTestProcessor.GENERATED_KOTLIN_CLASS_NAME}")
497512
}
498513

499514
@Test
@@ -519,6 +534,8 @@ class KotlinCompilationTests {
519534
).compile_()
520535

521536
assertThat(result.exitCode).isEqualTo(ExitCode.OK)
537+
assertClassLoadable(result, "com.tschuchort.compiletesting.KSource")
538+
assertClassLoadable(result, "${KotlinTestProcessor.GENERATED_PACKAGE}.${KotlinTestProcessor.GENERATED_JAVA_CLASS_NAME}")
522539
}
523540

524541

@@ -541,18 +558,18 @@ class KotlinCompilationTests {
541558
)
542559
}
543560

544-
private fun KotlinCompilation.compile_() = run {
545-
val systemOutBuffer = Buffer()
546-
val result = copy(systemOut = PrintStream(TeeOutputStream(System.out, systemOutBuffer.outputStream())))
547-
.compile()
561+
private fun KotlinCompilation.compile_() = copy(systemOut = System.out).compile()
548562

549-
return@run object {
550-
val exitCode = result.exitCode
551-
val classLoader = URLClassLoader(arrayOf(result.outputDirectory.toURI().toURL()),
552-
this::class.java.classLoader)
553-
val systemOut = systemOutBuffer.readUtf8()
563+
private fun assertClassLoadable(compileResult: KotlinCompilation.Result, className: String): Class<*> {
564+
try {
565+
val clazz = compileResult.classLoader.loadClass(className)
566+
assertThat(clazz).isNotNull
567+
return clazz
568+
}
569+
catch(e: ClassNotFoundException) {
570+
return fail<Nothing>("Class $className could not be loaded")
554571
}
555572
}
556-
573+
557574
class InheritedClass {}
558575
}

0 commit comments

Comments
 (0)