blob: 35351331c409f0a20adf4416db809faad5917bb4 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
*
* 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 com.google.devtools.ksp.gradle
import com.google.common.truth.Truth.assertThat
import com.google.devtools.ksp.gradle.processor.TestSymbolProcessorProvider
import com.google.devtools.ksp.gradle.testing.DependencyDeclaration.Companion.module
import com.google.devtools.ksp.gradle.testing.KspIntegrationTestRule
import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.Dependencies
import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.processing.SymbolProcessor
import com.google.devtools.ksp.symbol.KSAnnotated
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
class GradleCompilationTest {
@Rule
@JvmField
val tmpDir = TemporaryFolder()
@Rule
@JvmField
val testRule = KspIntegrationTestRule(tmpDir)
@Test
fun errorMessageFailsCompilation() {
testRule.setupAppAsJvmApp()
testRule.appModule.dependencies.add(
module(configuration = "ksp", testRule.processorModule)
)
testRule.appModule.addSource(
"Foo.kt",
"""
class Foo {
}
""".trimIndent()
)
class ErrorReporting(private val logger: KSPLogger) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
logger.error("my processor failure")
return emptyList()
}
}
class Provider : TestSymbolProcessorProvider({ env -> ErrorReporting(env.logger) })
testRule.addProvider(Provider::class)
val failure = testRule.runner()
.withArguments("app:assemble")
.buildAndFail()
assertThat(failure.output).contains("my processor failure")
}
@Test
fun applicationCanAccessGeneratedCode() {
testRule.setupAppAsJvmApp()
testRule.appModule.dependencies.add(
module(configuration = "ksp", testRule.processorModule)
)
testRule.appModule.addSource(
"Foo.kt",
"""
class Foo {
val x = ToBeGenerated()
}
""".trimIndent()
)
testRule.appModule.addSource(
"JavaSrc.java",
"""
class JavaSrc {
ToBeGenerated x;
}
""".trimIndent()
)
class MyProcessor(private val codeGenerator: CodeGenerator) : SymbolProcessor {
var count = 0
override fun process(resolver: Resolver): List<KSAnnotated> {
if (count == 0) {
codeGenerator.createNewFile(Dependencies.ALL_FILES, "", "Generated").use {
it.writer(Charsets.UTF_8).use {
it.write("class ToBeGenerated")
}
}
count += 1
}
return emptyList()
}
}
class Provider : TestSymbolProcessorProvider({ env -> MyProcessor(env.codeGenerator) })
testRule.addProvider(Provider::class)
testRule.runner()
.withDebug(true)
.withArguments("app:assemble", "--stacktrace")
.forwardOutput()
.build()
}
}