diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityCompilationTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityCompilationTest.kt new file mode 100644 index 00000000000..03e6b26da44 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityCompilationTest.kt @@ -0,0 +1,35 @@ +/* + * 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 + +import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration +import org.jetbrains.kotlin.buildtools.api.tests.CompatibilityTests +import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertOutputs +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.model.project +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.DisplayName + +@Disabled("Example tests for evaluation purposes of the DSL") +class ExampleCompatibilityCompilationTest : BaseCompilationTest() { + @CompatibilityTests + @DefaultStrategyAgnosticCompilationTest + @DisplayName("Sample compatibility compilation test that is run as part of each test suit") + fun myTest(strategyConfig: CompilerExecutionStrategyConfiguration) { + project { + val module1 = module("jvm-module-1") + val module2 = module("jvm-module-2", listOf(module1)) + + module1.compile(strategyConfig) { + assertOutputs("FooKt.class", "Bar.class", "BazKt.class") + } + module2.compile(strategyConfig) { + assertOutputs("AKt.class", "BKt.class") + } + } + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityTest.kt new file mode 100644 index 00000000000..fb449209631 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleCompatibilityTest.kt @@ -0,0 +1,26 @@ +/* + * 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 + +import org.jetbrains.kotlin.buildtools.api.CompilationService +import org.jetbrains.kotlin.buildtools.api.tests.CompatibilityTests +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +@Disabled("Example tests for evaluation purposes of the DSL") +class ExampleCompatibilityTest { + private val compilationService = CompilationService.loadImplementation(ExampleCompatibilityTest::class.java.classLoader) + + @CompatibilityTests + @Test + @DisplayName("Sample compatibility test that is run as part of each test suit") + fun testDefaultNonIncrementalSettings() { + val config = compilationService.makeJvmCompilationConfiguration() + Assertions.assertEquals(emptySet(), config.kotlinScriptFilenameExtensions) + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalCompilationTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalCompilationTest.kt new file mode 100644 index 00000000000..cb6627e9c5f --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalCompilationTest.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2023 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 + +import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration +import org.jetbrains.kotlin.buildtools.api.SourcesChanges +import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertCompiledSources +import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertLogContainsPatterns +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.model.LogLevel +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.project +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.DisplayName +import kotlin.io.path.readText +import kotlin.io.path.writeText + +@Disabled("Example tests for evaluation purposes of the DSL") +class ExampleIncrementalCompilationTest : BaseCompilationTest() { + @DisplayName("Sample IC test with a single module") + @DefaultStrategyAgnosticCompilationTest + fun singleModuleTest(strategyConfig: CompilerExecutionStrategyConfiguration) { + project { + val module1 = module("jvm-module-1") + + module1.compileIncrementally(strategyConfig, SourcesChanges.Unknown) + + val fooKt = module1.sourcesDirectory.resolve("foo.kt") + fooKt.writeText(fooKt.readText().replace("foo()", "foo(i: Int = 1)")) + + module1.compileIncrementally( + strategyConfig, + SourcesChanges.Known(modifiedFiles = listOf(fooKt.toFile()), removedFiles = emptyList()), + ) { + assertCompiledSources("foo.kt", "bar.kt") + assertLogContainsPatterns(LogLevel.DEBUG, ".*Incremental compilation completed".toRegex()) + } + } + } + + @DisplayName("Sample IC test with 2 modules and custom compilation options") + @DefaultStrategyAgnosticCompilationTest + fun twoModulesTest(strategyConfig: CompilerExecutionStrategyConfiguration) { + project { + val module1 = module("jvm-module-1") + val module2 = module("jvm-module-2", listOf(module1)) + + module1.compileIncrementally(strategyConfig, SourcesChanges.Unknown) + module2.compileIncrementally(strategyConfig, SourcesChanges.Unknown) + + val barKt = module1.sourcesDirectory.resolve("bar.kt") + barKt.writeText(barKt.readText().replace("bar()", "bar(i: Int = 1)")) + + module1.compileIncrementally( + strategyConfig, + SourcesChanges.Known(modifiedFiles = listOf(barKt.toFile()), removedFiles = emptyList()), + incrementalCompilationConfigAction = { + it.keepIncrementalCompilationCachesInMemory(false) + }, + ) + + module2.compileIncrementally( + strategyConfig, + SourcesChanges.Known(modifiedFiles = emptyList(), removedFiles = emptyList()) + ) { + assertCompiledSources("b.kt") + } + } + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalScenarioTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalScenarioTest.kt new file mode 100644 index 00000000000..b2c4ac6b201 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleIncrementalScenarioTest.kt @@ -0,0 +1,102 @@ +/* + * Copyright 2010-2023 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 + +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.scenario.scenario +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.BaseCompilationTest +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.DefaultStrategyAgnosticCompilationTest +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.DisplayName + +@Disabled("Example tests for evaluation purposes of the DSL") +class ExampleIncrementalScenarioTest : BaseCompilationTest() { + @DefaultStrategyAgnosticCompilationTest + @DisplayName("Sample scenario DSL IC test with a single module") + fun scenario1Test(strategyConfig: CompilerExecutionStrategyConfiguration) { + scenario(strategyConfig) { + val module1 = module("jvm-module-1") + + module1.createFile( + "foobar.kt", + addedOutputs = setOf("FoobarKt.class"), + //language=kt + """ + fun foobar() {} + """.trimIndent() + ) + + module1.compile { + assertCompiledSources("foobar.kt") + } + + module1.deleteFile( + "foobar.kt", + removedOutputs = setOf("FoobarKt.class"), + ) + + module1.compile { + assertCompiledSources() + } + } + } + + @DisplayName("Another sample scenario DSL IC test with a single module and custom IC options") + @DefaultStrategyAgnosticCompilationTest + fun scenario2Test(strategyConfig: CompilerExecutionStrategyConfiguration) { + scenario(strategyConfig) { + val module1 = module("jvm-module-1", incrementalCompilationOptionsModifier = { it.keepIncrementalCompilationCachesInMemory(false) }) + + module1.createFile( + "foobar.kt", + addedOutputs = setOf("FoobarKt.class"), + //language=kt + """ + fun foobar() {} + """.trimIndent() + ) + + module1.compile { + assertCompiledSources("foobar.kt") + } + + module1.deleteFile( + "foobar.kt", + removedOutputs = setOf("FoobarKt.class"), + ) + + module1.compile { + assertCompiledSources() + } + } + } + + @DisplayName("Sample scenario DSL IC test with two modules") + @DefaultStrategyAgnosticCompilationTest + fun scenario3Test(strategyConfig: CompilerExecutionStrategyConfiguration) { + scenario(strategyConfig) { + val module1 = module("jvm-module-1") + val module2 = module("jvm-module-2", listOf(module1)) + + module1.changeFile( + "bar.kt", + transform = { + //language=kt + it.replace("fun bar()", "fun bar(someNumber: Int = 50)") + } + ) + + module1.compile { + assertCompiledSources("bar.kt") + } + + module2.compile { + assertCompiledSources("b.kt") + } + } + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleNonIncrementalCompilationTest.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleNonIncrementalCompilationTest.kt new file mode 100644 index 00000000000..177502a4f80 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/kotlin/compilation/ExampleNonIncrementalCompilationTest.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2023 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 + +import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration +import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertLogContainsPatterns +import org.jetbrains.kotlin.buildtools.api.tests.compilation.assertions.assertOutputs +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.model.LogLevel +import org.jetbrains.kotlin.buildtools.api.tests.compilation.model.project +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.DisplayName +import kotlin.io.path.writeText + +@Disabled("Example tests for evaluation purposes of the DSL") +class ExampleNonIncrementalCompilationTest : BaseCompilationTest() { + @DisplayName("Sample non-incremental compilation test with two modules") + @DefaultStrategyAgnosticCompilationTest + fun myTest(strategyConfig: CompilerExecutionStrategyConfiguration) { + project { + val module1 = module("jvm-module-1") + val module2 = module("jvm-module-2", listOf(module1)) + + module1.compile(strategyConfig) { + assertOutputs("FooKt.class", "Bar.class", "BazKt.class") + } + module2.compile(strategyConfig) { + assertOutputs("AKt.class", "BKt.class") + } + } + } + + @DisplayName("Sample non-incremental compilation test with a single module and a compilation error") + @DefaultStrategyAgnosticCompilationTest + fun failedCompilationTest(strategyConfig: CompilerExecutionStrategyConfiguration) { + project { + val module1 = module("jvm-module-1") + + module1.sourcesDirectory.resolve("bar.kt").writeText("aaaa") + + module1.compile(strategyConfig) { + expectFail() + assertLogContainsPatterns(LogLevel.ERROR, ".*bar\\.kt:1:1 Syntax error: Expecting a top level declaration.*".toRegex()) + } + } + } +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/bar.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/bar.kt new file mode 100644 index 00000000000..e32e6b648d1 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/bar.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2023 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. + */ + +class Bar { + fun bar() = foo() +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/baz.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/baz.kt new file mode 100644 index 00000000000..5972509ed0a --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/baz.kt @@ -0,0 +1,6 @@ +/* + * Copyright 2010-2023 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. + */ + +fun baz() = 42 \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/foo.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/foo.kt new file mode 100644 index 00000000000..0ce11a18661 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-1/foo.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2023 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. + */ + +fun foo() { + +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/a.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/a.kt new file mode 100644 index 00000000000..eb1cfd03bb6 --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/a.kt @@ -0,0 +1,6 @@ +/* + * Copyright 2010-2023 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. + */ + +val a = 5 \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/b.kt b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/b.kt new file mode 100644 index 00000000000..c09d2e8bb5e --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api-tests/src/testCommon/resources/modules/jvm-module-2/b.kt @@ -0,0 +1,6 @@ +/* + * Copyright 2010-2023 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. + */ + +val b = Bar().bar() \ No newline at end of file