[BTA tests] Use explicit output assertions instead of implicit ones

^KT-61860 In Progress
This commit is contained in:
Alexander.Likhachev
2024-03-05 23:10:00 +01:00
committed by Space Team
parent 4facf5ffbc
commit 68cf1bdc57
5 changed files with 92 additions and 23 deletions
@@ -14,6 +14,14 @@ import kotlin.io.path.isRegularFile
import kotlin.io.path.relativeTo
import kotlin.io.path.walk
/**
* Equivalent to [assertNoCompiledSources] with an empty array/set
*/
context(Module)
fun CompilationOutcome.assertNoCompiledSources() {
assertCompiledSources()
}
context(Module)
fun CompilationOutcome.assertCompiledSources(vararg expectedCompiledSources: String) {
assertCompiledSources(expectedCompiledSources.toSet())
@@ -15,23 +15,21 @@ interface ScenarioModule {
*/
fun changeFile(
fileName: String,
addedOutputs: Set<String> = emptySet(),
removedOutputs: Set<String> = emptySet(),
transform: (String) -> String,
)
/**
* Performs registered file deletion.
*/
fun deleteFile(fileName: String, removedOutputs: Set<String>)
fun deleteFile(fileName: String)
/**
* Performs registered new file creation.
*/
fun createFile(fileName: String, addedOutputs: Set<String>, content: String)
fun createFile(fileName: String, content: String)
fun compile(
forceOutput: LogLevel? = null,
assertions: context(Module) CompilationOutcome.() -> Unit = {},
assertions: context(Module, ScenarioModule) CompilationOutcome.() -> Unit = {},
)
}
@@ -0,0 +1,64 @@
/*
* Copyright 2010-2024 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.buildtools.api.tests.compilation.scenario
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertOutputs
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.CompilationOutcome
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.Module
/**
* This assertion has side effects modifying the expected total outputs list!
* If you decided to start using it, don't mix it with regular [assertOutputs]
*/
context(Module, ScenarioModule)
fun CompilationOutcome.assertAddedOutputs(vararg addedOutputs: String) {
assertAddedOutputs(addedOutputs.toSet())
}
/**
* This assertion has side effects modifying the expected total outputs list!
* If you decided to start using it, don't mix it with regular [assertOutputs]
*/
context(Module, ScenarioModule)
fun CompilationOutcome.assertAddedOutputs(addedOutputs: Set<String>) {
val outputs = requireScenarioModuleImpl().outputs
outputs.addAll(addedOutputs)
assertOutputs(outputs)
}
/**
* This assertion has side effects modifying the expected total outputs list!
* If you decided to start using it, don't mix it with regular [assertOutputs]
*/
context(Module, ScenarioModule)
fun CompilationOutcome.assertRemovedOutputs(vararg removedOutputs: String) {
assertRemovedOutputs(removedOutputs.toSet())
}
/**
* This assertion has side effects modifying the expected total outputs list!
* If you decided to start using it, don't mix it with regular [assertOutputs]
*/
context(Module, ScenarioModule)
fun CompilationOutcome.assertRemovedOutputs(removedOutputs: Set<String>) {
val outputs = requireScenarioModuleImpl().outputs
val notPresentOutputs = removedOutputs - outputs
assert(notPresentOutputs.isEmpty()) {
"The following files were expected to be removed, however they weren't even produced: $notPresentOutputs"
}
outputs.removeAll(removedOutputs)
assertOutputs(outputs)
}
context(Module, ScenarioModule)
fun CompilationOutcome.assertNoOutputSetChanges() {
val outputs = requireScenarioModuleImpl().outputs
assertOutputs(outputs)
}
context(ScenarioModule)
private fun requireScenarioModuleImpl() =
(this@ScenarioModule as? ScenarioModuleImpl ?: error("Expected an instance of ScenarioModuleImpl"))
@@ -18,41 +18,35 @@ import kotlin.io.path.*
internal class ScenarioModuleImpl(
internal val module: Module,
private val outputs: MutableSet<String>,
internal val outputs: MutableSet<String>,
private val strategyConfig: CompilerExecutionStrategyConfiguration,
private val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?,
private val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?,
) : ScenarioModule {
override fun changeFile(
fileName: String,
addedOutputs: Set<String>,
removedOutputs: Set<String>,
transform: (String) -> String,
) {
val file = module.sourcesDirectory.resolve(fileName)
file.writeText(transform(file.readText()))
outputs.addAll(addedOutputs)
outputs.removeAll(removedOutputs)
sourcesChanges = SourcesChanges.Known(
modifiedFiles = sourcesChanges.modifiedFiles + file.toFile(),
removedFiles = sourcesChanges.removedFiles,
)
}
override fun deleteFile(fileName: String, removedOutputs: Set<String>) {
override fun deleteFile(fileName: String) {
val file = module.sourcesDirectory.resolve(fileName)
file.deleteExisting()
outputs.removeAll(removedOutputs)
sourcesChanges = SourcesChanges.Known(
modifiedFiles = sourcesChanges.modifiedFiles,
removedFiles = sourcesChanges.removedFiles + file.toFile(),
)
}
override fun createFile(fileName: String, addedOutputs: Set<String>, content: String) {
override fun createFile(fileName: String, content: String) {
val file = module.sourcesDirectory.resolve(fileName)
file.writeText(content)
outputs.addAll(addedOutputs)
sourcesChanges = SourcesChanges.Known(
modifiedFiles = sourcesChanges.modifiedFiles + file.toFile(),
removedFiles = sourcesChanges.removedFiles,
@@ -63,7 +57,7 @@ internal class ScenarioModuleImpl(
override fun compile(
forceOutput: LogLevel?,
assertions: context(Module) CompilationOutcome.() -> Unit,
assertions: context(Module, ScenarioModule) CompilationOutcome.() -> Unit,
) {
module.compileIncrementally(
sourcesChanges,
@@ -72,8 +66,7 @@ internal class ScenarioModuleImpl(
compilationConfigAction = { compilationOptionsModifier?.invoke(it) },
incrementalCompilationConfigAction = { incrementalCompilationOptionsModifier?.invoke(it) },
assertions = {
assertions(module, this)
assertOutputs(outputs)
assertions(module, this@ScenarioModuleImpl, this)
})
}
}
@@ -7,9 +7,13 @@ package org.jetbrains.kotlin.buildtools.api.tests.compilation
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertCompiledSources
import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertNoCompiledSources
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.scenario
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.BaseCompilationTest
import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DefaultStrategyAgnosticCompilationTest
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.assertAddedOutputs
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.assertNoOutputSetChanges
import org.jetbrains.kotlin.buildtools.api.tests.compilation.scenario.assertRemovedOutputs
import org.jetbrains.kotlin.test.TestMetadata
import org.junit.jupiter.api.DisplayName
@@ -23,7 +27,6 @@ class ExampleIncrementalScenarioTest : BaseCompilationTest() {
module1.createFile(
"foobar.kt",
addedOutputs = setOf("FoobarKt.class"),
//language=kt
"""
fun foobar() {}
@@ -32,15 +35,16 @@ class ExampleIncrementalScenarioTest : BaseCompilationTest() {
module1.compile {
assertCompiledSources("foobar.kt")
assertAddedOutputs("FoobarKt.class")
}
module1.deleteFile(
"foobar.kt",
removedOutputs = setOf("FoobarKt.class"),
)
module1.compile {
assertCompiledSources()
assertNoCompiledSources()
assertRemovedOutputs("FoobarKt.class")
}
}
}
@@ -54,7 +58,6 @@ class ExampleIncrementalScenarioTest : BaseCompilationTest() {
module1.createFile(
"foobar.kt",
addedOutputs = setOf("FoobarKt.class"),
//language=kt
"""
fun foobar() {}
@@ -63,15 +66,16 @@ class ExampleIncrementalScenarioTest : BaseCompilationTest() {
module1.compile {
assertCompiledSources("foobar.kt")
assertAddedOutputs("FoobarKt.class")
}
module1.deleteFile(
"foobar.kt",
removedOutputs = setOf("FoobarKt.class"),
)
module1.compile {
assertCompiledSources()
assertNoCompiledSources()
assertRemovedOutputs("FoobarKt.class")
}
}
}
@@ -94,10 +98,12 @@ class ExampleIncrementalScenarioTest : BaseCompilationTest() {
module1.compile {
assertCompiledSources("bar.kt")
assertNoOutputSetChanges()
}
module2.compile {
assertCompiledSources("b.kt")
assertNoOutputSetChanges()
}
}
}