[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 org.jetbrains.kotlin.analysis.decompiler.stub.files.extractAdditionalStubInfo
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 kotlin.io.path.name
abstract class AbstractAdditionalStubInfoKnmTest : AbstractDecompiledKnmFileTest() {
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: Directive
get() = Directives.KNM_K2_IGNORE
override val knmTestSupport: KnmTestSupport
get() = K2KnmTestSupport
override fun doTest(testDirectoryPath: Path) {
val stubBuilder = K2KotlinNativeMetadataDecompiler().stubBuilder
val stubBuilder = knmTestSupport.createDecompiler().stubBuilder
val knmFiles = compileToKnmFiles(testDirectoryPath)
val knmFile = knmFiles.singleOrNull { "root_package" !in it.path }
?: 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.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT
import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.directives.model.Directive
import org.jetbrains.kotlin.test.util.KtTestUtil
import org.jetbrains.kotlin.utils.addIfNotNull
import java.io.File
@@ -25,7 +24,7 @@ import kotlin.io.path.absolutePathString
import kotlin.io.path.extension
abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
abstract val ignoreDirective: Directive
abstract val knmTestSupport: KnmTestSupport
protected abstract fun doTest(testDirectoryPath: Path)
@@ -90,7 +89,7 @@ abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
private fun isTestIgnored(testDirectory: Path): Boolean {
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) {
@@ -103,6 +102,6 @@ abstract class AbstractDecompiledKnmFileTest : KotlinTestWithEnvironment() {
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
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem
import com.intellij.psi.PsiManager
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.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.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 java.io.File
import java.nio.file.Files
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() {
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()
}
override val knmTestSupport: KnmTestSupport
get() = Fe10KnmTestSupport
}
abstract class AbstractDecompiledKnmStubConsistencyK2Test : AbstractDecompiledKnmStubConsistencyTest() {
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()
}
override val knmTestSupport: KnmTestSupport
get() = K2KnmTestSupport
}
abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmFileTest() {
abstract fun createDecompiler(): KlibMetadataDecompiler<*>
override fun doTest(testDirectoryPath: Path) {
val files = compileToKnmFiles(testDirectoryPath)
@@ -76,7 +34,8 @@ abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmF
}
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(
knmFile, PsiManager.getInstance(project), physical = false,
@@ -84,7 +43,7 @@ abstract class AbstractDecompiledKnmStubConsistencyTest : AbstractDecompiledKnmF
val stubTreeForDecompiledFile = KtFileStubBuilder().buildStubTree(
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()
}
}