From 4e706ba93ea287b92383110bfc7c48465887979a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 10 Aug 2023 22:17:59 +0200 Subject: [PATCH] K2: add JavaModulesIntegrationTest #KT-60797 --- .../jdkModulesFromNamed/main.fir.txt | 7 ++++ .../releaseFlag/moduleSwing.fir.txt | 4 +++ .../AbstractFirJavaModulesIntegrationTest.kt | 22 +++++++++++++ .../AbstractJavaModulesIntegrationTest.kt | 32 +++++++++++++------ .../jvm/modules/JavaModulesIntegrationTest.kt | 9 ++++-- 5 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/javaModules/jdkModulesFromNamed/main.fir.txt create mode 100644 compiler/testData/javaModules/releaseFlag/moduleSwing.fir.txt create mode 100644 compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractFirJavaModulesIntegrationTest.kt diff --git a/compiler/testData/javaModules/jdkModulesFromNamed/main.fir.txt b/compiler/testData/javaModules/jdkModulesFromNamed/main.fir.txt new file mode 100644 index 00000000000..518b11c4d34 --- /dev/null +++ b/compiler/testData/javaModules/jdkModulesFromNamed/main.fir.txt @@ -0,0 +1,7 @@ +compiler/testData/javaModules/jdkModulesFromNamed/main/test.kt:11:12: error: unresolved reference: javax.swing.JFrame + val s: javax.swing.JFrame? = null + ^ +compiler/testData/javaModules/jdkModulesFromNamed/main/test.kt:12:5: error: overload resolution ambiguity between candidates: [@InlineOnly() fun println(message: Any?): Unit, @InlineOnly() fun println(message: Boolean): Unit, @InlineOnly() fun println(message: Byte): Unit, ...] + println(s) + ^ +COMPILATION_ERROR diff --git a/compiler/testData/javaModules/releaseFlag/moduleSwing.fir.txt b/compiler/testData/javaModules/releaseFlag/moduleSwing.fir.txt new file mode 100644 index 00000000000..1c1b69455c3 --- /dev/null +++ b/compiler/testData/javaModules/releaseFlag/moduleSwing.fir.txt @@ -0,0 +1,4 @@ +compiler/testData/javaModules/releaseFlag/moduleSwing/foo/Foo.kt:5:12: error: unresolved reference: javax.swing.JFrame + val z: javax.swing.JFrame? = null + ^ +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractFirJavaModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractFirJavaModulesIntegrationTest.kt new file mode 100644 index 00000000000..62035776f9a --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractFirJavaModulesIntegrationTest.kt @@ -0,0 +1,22 @@ +/* + * 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.jvm.modules + +import org.jetbrains.kotlin.config.LanguageVersion +import java.io.File + +abstract class AbstractFirJavaModulesIntegrationTest(jdkVersion: Int, jdkHome: File) : AbstractJavaModulesIntegrationTest( + jdkVersion, jdkHome, maxOf(LanguageVersion.KOTLIN_2_0, LanguageVersion.LATEST_STABLE), +) { + override fun muteForK2(test: () -> Unit) { + try { + test() + } catch (e: Throwable) { + return + } + fail("Looks like this test can be unmuted. Remove the call to `muteForK2`.") + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractJavaModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractJavaModulesIntegrationTest.kt index 2b3c4bd3f14..abd9224192d 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractJavaModulesIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/modules/AbstractJavaModulesIntegrationTest.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.cli.AbstractCliTest import org.jetbrains.kotlin.cli.AbstractCliTest.getNormalizedCompilerOutput import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime +import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.jvm.compiler.AbstractKotlinCompilerIntegrationTest import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File @@ -16,11 +17,18 @@ import java.util.concurrent.TimeUnit import java.util.jar.Manifest import kotlin.test.fail -abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, private val jdkHome: File) : - AbstractKotlinCompilerIntegrationTest() { +abstract class AbstractJavaModulesIntegrationTest( + private val jdkVersion: Int, + private val jdkHome: File, + private val languageVersion: LanguageVersion, +) : AbstractKotlinCompilerIntegrationTest() { override val testDataPath: String get() = "compiler/testData/javaModules/" + protected open fun muteForK2(test: () -> Unit) { + test() + } + private fun module( name: String, modulePath: List = emptyList(), @@ -33,7 +41,8 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p val kotlinOptions = mutableListOf( "-jdk-home", jdkHome.path, - "-Xmodule-path=$paths" + "-Xmodule-path=$paths", + "-language-version", languageVersion.versionString, ) if (addModules.isNotEmpty()) { kotlinOptions += "-Xadd-modules=${addModules.joinToString()}" @@ -61,11 +70,10 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p private fun checkKotlinOutput(moduleName: String): (String) -> Unit { - val expectedFile = - File(testDataDirectory, "$moduleName.$jdkVersion.txt").takeIf { it.exists() } ?: File(testDataDirectory, "$moduleName.txt") + val expectedFirFile = File(testDataDirectory, "$moduleName.fir.txt") return { actual -> KotlinTestUtils.assertEqualsToFile( - expectedFile, + if (languageVersion.usesK2 && expectedFirFile.exists()) expectedFirFile else File(testDataDirectory, "$moduleName.txt"), getNormalizedCompilerOutput(actual, null, testDataPath, tmpdir.absolutePath) .replace((System.getenv("JDK_11_0") ?: System.getenv("JDK_11")).replace("\\", "/"), "\$JDK11") .replace((System.getenv("JDK_17_0") ?: System.getenv("JDK_17")).replace("\\", "/"), "\$JDK17") @@ -113,7 +121,8 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p module("moduleB", listOf(a)) } - fun testSimpleUseNonExportedPackage() { + // TODO (KT-60797): missing JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE. + fun testSimpleUseNonExportedPackage() = muteForK2 { val a = module("moduleA") module("moduleB", listOf(a)) } @@ -125,7 +134,8 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p module("moduleD", listOf(a, b, c)) } - fun testUnnamedDependsOnNamed() { + // TODO (KT-60797): missing JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE. + fun testUnnamedDependsOnNamed() = muteForK2 { val a = module("moduleA") module("moduleB", listOf(a), listOf("moduleA")) @@ -155,7 +165,8 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p module("moduleB", listOf(module("moduleA")), addModules = emptyList()) } - fun testReleaseFlagWrongValue() { + // TODO (KT-61156): do not try to run compilation if there were errors during calculation of Java module graph. + fun testReleaseFlagWrongValue() = muteForK2 { module("module5", additionalKotlinArguments = listOf("-Xjdk-release=5"), checkKotlinOutput = { output -> assertTrue(output, "error: unknown JDK release version: 5" in output) assertTrue(output, "error: unknown JVM target version: 5" in output) @@ -165,7 +176,8 @@ abstract class AbstractJavaModulesIntegrationTest(private val jdkVersion: Int, p } } - fun testAutomaticModuleInternalJdkPackageUsage() { + // TODO (KT-60797): missing JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE. + fun testAutomaticModuleInternalJdkPackageUsage() = muteForK2 { module("jvmStatUsage") } diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/modules/JavaModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/modules/JavaModulesIntegrationTest.kt index 5b9ae001033..ff228eec1bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/modules/JavaModulesIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/modules/JavaModulesIntegrationTest.kt @@ -5,8 +5,13 @@ package org.jetbrains.kotlin.jvm.modules +import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.test.util.KtTestUtil -class Java11ModulesIntegrationTest : AbstractJavaModulesIntegrationTest(11, KtTestUtil.getJdk11Home()) +class Java11ModulesIntegrationTest : AbstractJavaModulesIntegrationTest(11, KtTestUtil.getJdk11Home(), LanguageVersion.KOTLIN_1_9) -class Java17ModulesIntegrationTest : AbstractJavaModulesIntegrationTest(17, KtTestUtil.getJdk17Home()) +class Java17ModulesIntegrationTest : AbstractJavaModulesIntegrationTest(17, KtTestUtil.getJdk17Home(), LanguageVersion.KOTLIN_1_9) + +class FirJava11ModulesIntegrationTest : AbstractFirJavaModulesIntegrationTest(11, KtTestUtil.getJdk11Home()) + +class FirJava17ModulesIntegrationTest : AbstractFirJavaModulesIntegrationTest(17, KtTestUtil.getJdk17Home())