[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 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()}" +
|
||||||
|
|||||||
+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.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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-48
@@ -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)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+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