From 68cf1bdc57a0c8a11c92b3e9ea83721cb74fd485 Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Tue, 5 Mar 2024 23:10:00 +0100 Subject: [PATCH] [BTA tests] Use explicit output assertions instead of implicit ones ^KT-61860 In Progress --- .../compilation/assertions/filesAssertions.kt | 8 +++ .../compilation/scenario/ScenarioModule.kt | 8 +-- .../scenario/filesScenarioAssertions.kt | 64 +++++++++++++++++++ .../compilation/scenario/scenarioDsl.kt | 17 ++--- .../kotlin/ExampleIncrementalScenarioTest.kt | 18 ++++-- 5 files changed, 92 insertions(+), 23 deletions(-) create mode 100644 compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/filesScenarioAssertions.kt diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/assertions/filesAssertions.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/assertions/filesAssertions.kt index 881fd445a4e..88b32474601 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/assertions/filesAssertions.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/assertions/filesAssertions.kt @@ -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()) diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/ScenarioModule.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/ScenarioModule.kt index 94cf7e49a12..e19828471c2 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/ScenarioModule.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/ScenarioModule.kt @@ -15,23 +15,21 @@ interface ScenarioModule { */ fun changeFile( fileName: String, - addedOutputs: Set = emptySet(), - removedOutputs: Set = emptySet(), transform: (String) -> String, ) /** * Performs registered file deletion. */ - fun deleteFile(fileName: String, removedOutputs: Set) + fun deleteFile(fileName: String) /** * Performs registered new file creation. */ - fun createFile(fileName: String, addedOutputs: Set, content: String) + fun createFile(fileName: String, content: String) fun compile( forceOutput: LogLevel? = null, - assertions: context(Module) CompilationOutcome.() -> Unit = {}, + assertions: context(Module, ScenarioModule) CompilationOutcome.() -> Unit = {}, ) } \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/filesScenarioAssertions.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/filesScenarioAssertions.kt new file mode 100644 index 00000000000..4b3ee3b7c79 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/filesScenarioAssertions.kt @@ -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) { + 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) { + 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")) \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt index e35d4f035bb..784d96de7a3 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/main/kotlin/compilation/scenario/scenarioDsl.kt @@ -18,41 +18,35 @@ import kotlin.io.path.* internal class ScenarioModuleImpl( internal val module: Module, - private val outputs: MutableSet, + internal val outputs: MutableSet, private val strategyConfig: CompilerExecutionStrategyConfiguration, private val compilationOptionsModifier: ((JvmCompilationConfiguration) -> Unit)?, private val incrementalCompilationOptionsModifier: ((IncrementalJvmCompilationConfiguration<*>) -> Unit)?, ) : ScenarioModule { override fun changeFile( fileName: String, - addedOutputs: Set, - removedOutputs: Set, 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) { + 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, 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) }) } } diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testExample/kotlin/ExampleIncrementalScenarioTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testExample/kotlin/ExampleIncrementalScenarioTest.kt index e468ae547da..5ccb724903e 100644 --- a/compiler/build-tools/kotlin-build-tools-api-tests/src/testExample/kotlin/ExampleIncrementalScenarioTest.kt +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testExample/kotlin/ExampleIncrementalScenarioTest.kt @@ -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() } } }