[Tests] Extract shared .knm test utilities
KTIJ-28668
This commit is contained in:
committed by
Space Team
parent
1c1bdae973
commit
5548e854a0
+3
-13
@@ -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()}" +
|
||||
|
||||
+3
-4
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
+7
-48
@@ -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)
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
+47
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user