[Tests] Extract shared .knm test utilities

KTIJ-28668
This commit is contained in:
Pavel Kirpichenkov
2024-02-15 19:46:04 +02:00
committed by Space Team
parent 1c1bdae973
commit 5548e854a0
4 changed files with 60 additions and 65 deletions
@@ -8,25 +8,15 @@ package org.jetbrains.kotlin.analysis.decompiler.konan
import com.intellij.util.indexing.FileContentImpl import com.intellij.util.indexing.FileContentImpl
import org.jetbrains.kotlin.analysis.decompiler.stub.files.extractAdditionalStubInfo import org.jetbrains.kotlin.analysis.decompiler.stub.files.extractAdditionalStubInfo
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.directives.model.Directive
import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
import java.nio.file.Path import java.nio.file.Path
import kotlin.io.path.name import kotlin.io.path.name
abstract class AbstractAdditionalStubInfoKnmTest : AbstractDecompiledKnmFileTest() { abstract class AbstractAdditionalStubInfoKnmTest : AbstractDecompiledKnmFileTest() {
private object Directives : SimpleDirectivesContainer() { override val knmTestSupport: KnmTestSupport
val KNM_K2_IGNORE by directive( get() = K2KnmTestSupport
description = "Ignore test for KNM files with K2 K/N Decompiler",
applicability = DirectiveApplicability.Global,
)
}
override val ignoreDirective: Directive
get() = Directives.KNM_K2_IGNORE
override fun doTest(testDirectoryPath: Path) { override fun doTest(testDirectoryPath: Path) {
val stubBuilder = K2KotlinNativeMetadataDecompiler().stubBuilder val stubBuilder = knmTestSupport.createDecompiler().stubBuilder
val knmFiles = compileToKnmFiles(testDirectoryPath) val knmFiles = compileToKnmFiles(testDirectoryPath)
val knmFile = knmFiles.singleOrNull { "root_package" !in it.path } val knmFile = knmFiles.singleOrNull { "root_package" !in it.path }
?: error("Expected a single non-root .knm file, but received:${System.lineSeparator()}" + ?: error("Expected a single non-root .knm file, but received:${System.lineSeparator()}" +
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT
import org.jetbrains.kotlin.test.* import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.directives.model.Directive
import org.jetbrains.kotlin.test.util.KtTestUtil import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import java.io.File import java.io.File
@@ -25,7 +24,7 @@ import kotlin.io.path.absolutePathString
import kotlin.io.path.extension import kotlin.io.path.extension
abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() { abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
abstract val ignoreDirective: Directive abstract val knmTestSupport: KnmTestSupport
protected abstract fun doTest(testDirectoryPath: Path) protected abstract fun doTest(testDirectoryPath: Path)
@@ -90,7 +89,7 @@ abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
private fun isTestIgnored(testDirectory: Path): Boolean { private fun isTestIgnored(testDirectory: Path): Boolean {
val mainKotlinFile = findMainTestKotlinFile(testDirectory).toFile() val mainKotlinFile = findMainTestKotlinFile(testDirectory).toFile()
return InTextDirectivesUtils.isDirectiveDefined(mainKotlinFile.readText(), "// ${ignoreDirective.name}") return InTextDirectivesUtils.isDirectiveDefined(mainKotlinFile.readText(), "// ${knmTestSupport.ignoreDirective.name}")
} }
private fun withKnmIgnoreDirective(testDirectory: Path, block: () -> Unit) { private fun withKnmIgnoreDirective(testDirectory: Path, block: () -> Unit) {
@@ -103,6 +102,6 @@ abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
else throw e else throw e
} }
if (isIgnored) error("The test is passing. Please, remove the `// ${ignoreDirective.name}` directive") if (isIgnored) error("The test is passing. Please, remove the `// ${knmTestSupport.ignoreDirective.name}` directive")
} }
} }
@@ -5,67 +5,25 @@
package org.jetbrains.kotlin.analysis.decompiler.konan package org.jetbrains.kotlin.analysis.decompiler.konan
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.util.indexing.FileContentImpl import com.intellij.util.indexing.FileContentImpl
import org.jetbrains.kotlin.analysis.decompiler.stub.files.findMainTestKotlinFile
import org.jetbrains.kotlin.analysis.decompiler.stub.files.serializeToString import org.jetbrains.kotlin.analysis.decompiler.stub.files.serializeToString
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT
import org.jetbrains.kotlin.psi.stubs.elements.KtFileStubBuilder import org.jetbrains.kotlin.psi.stubs.elements.KtFileStubBuilder
import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.directives.model.Directive
import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability
import org.jetbrains.kotlin.test.directives.model.SimpleDirective
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.addIfNotNull
import org.junit.Assert import org.junit.Assert
import java.io.File
import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths
import java.util.stream.Collectors
import kotlin.io.path.absolutePathString
import kotlin.io.path.extension
abstract class AbstractDecompiledKnmStubConsistencyFe10Test : AbstractDecompiledKnmStubConsistencyTest() { abstract class AbstractDecompiledKnmStubConsistencyFe10Test : AbstractDecompiledKnmStubConsistencyTest() {
private object Directives : SimpleDirectivesContainer() { override val knmTestSupport: KnmTestSupport
val KNM_FE10_IGNORE by directive( get() = Fe10KnmTestSupport
description = "Ignore test for KNM files with FE10 K/N Decompiler",
applicability = DirectiveApplicability.Global,
)
}
override val ignoreDirective: SimpleDirective
get() = Directives.KNM_FE10_IGNORE
override fun createDecompiler(): KlibMetadataDecompiler<*> {
return KotlinNativeMetadataDecompiler()
}
} }
abstract class AbstractDecompiledKnmStubConsistencyK2Test : AbstractDecompiledKnmStubConsistencyTest() { abstract class AbstractDecompiledKnmStubConsistencyK2Test : AbstractDecompiledKnmStubConsistencyTest() {
private object Directives : SimpleDirectivesContainer() { override val knmTestSupport: KnmTestSupport
val KNM_K2_IGNORE by directive( get() = K2KnmTestSupport
description = "Ignore test for KNM files with K2 K/N Decompiler",
applicability = DirectiveApplicability.Global,
)
}
override val ignoreDirective: SimpleDirective
get() = Directives.KNM_K2_IGNORE
override fun createDecompiler(): KlibMetadataDecompiler<*> {
return K2KotlinNativeMetadataDecompiler()
}
} }
abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmFileTest() { abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmFileTest() {
abstract fun createDecompiler(): KlibMetadataDecompiler<*>
override fun doTest(testDirectoryPath: Path) { override fun doTest(testDirectoryPath: Path) {
val files = compileToKnmFiles(testDirectoryPath) val files = compileToKnmFiles(testDirectoryPath)
@@ -76,7 +34,8 @@ abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmF
} }
private fun checkKnmStubConsistency(knmFile: VirtualFile) { private fun checkKnmStubConsistency(knmFile: VirtualFile) {
val stubTreeBinaryFile = createDecompiler().stubBuilder.buildFileStub(FileContentImpl.createByFile(knmFile, environment.project))!! val decompiler = knmTestSupport.createDecompiler()
val stubTreeBinaryFile = decompiler.stubBuilder.buildFileStub(FileContentImpl.createByFile(knmFile, environment.project))!!
val fileViewProviderForDecompiledFile = K2KotlinNativeMetadataDecompiler().createFileViewProvider( val fileViewProviderForDecompiledFile = K2KotlinNativeMetadataDecompiler().createFileViewProvider(
knmFile, PsiManager.getInstance(project), physical = false, knmFile, PsiManager.getInstance(project), physical = false,
@@ -84,7 +43,7 @@ abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmF
val stubTreeForDecompiledFile = KtFileStubBuilder().buildStubTree( val stubTreeForDecompiledFile = KtFileStubBuilder().buildStubTree(
KlibDecompiledFile(fileViewProviderForDecompiledFile) { virtualFile -> KlibDecompiledFile(fileViewProviderForDecompiledFile) { virtualFile ->
createDecompiler().buildDecompiledTextForTests(virtualFile) decompiler.buildDecompiledTextForTests(virtualFile)
} }
) )
@@ -0,0 +1,47 @@
/*
* 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.analysis.decompiler.konan
import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability
import org.jetbrains.kotlin.test.directives.model.SimpleDirective
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
interface KnmTestSupport {
val ignoreDirective: SimpleDirective
fun createDecompiler(): KlibMetadataDecompiler<*>
}
object Fe10KnmTestSupport : KnmTestSupport {
private object Directives : SimpleDirectivesContainer() {
val KNM_FE10_IGNORE by directive(
description = "Ignore test for KNM files with FE10 K/N Decompiler",
applicability = DirectiveApplicability.Global,
)
}
override val ignoreDirective: SimpleDirective
get() = Directives.KNM_FE10_IGNORE
override fun createDecompiler(): KlibMetadataDecompiler<*> {
return KotlinNativeMetadataDecompiler()
}
}
object K2KnmTestSupport : KnmTestSupport {
private object Directives : SimpleDirectivesContainer() {
val KNM_K2_IGNORE by directive(
description = "Ignore test for KNM files with K2 K/N Decompiler",
applicability = DirectiveApplicability.Global,
)
}
override val ignoreDirective: SimpleDirective
get() = Directives.KNM_K2_IGNORE
override fun createDecompiler(): KlibMetadataDecompiler<*> {
return K2KotlinNativeMetadataDecompiler()
}
}