From 3c47880ebabafe3dd999f3f3b8c6e66580f36573 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 24 Nov 2021 16:51:25 +0300 Subject: [PATCH] [Native][tests] Refactoring: Rework @TestCaseGroupProviding --- .../tests/GenerateNativeBlackboxTests.kt | 5 +-- .../support/NativeBlackBoxTestSupport.kt | 40 +++++++++++++++---- .../support/group/TestCaseGroupProviding.kt | 11 +++++ ...ider.kt => UseExtTestCaseGroupProvider.kt} | 5 +-- 4 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/TestCaseGroupProviding.kt rename native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/{NativeBlackBoxTestCaseGroupProvider.kt => UseExtTestCaseGroupProvider.kt} (74%) diff --git a/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeBlackboxTests.kt b/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeBlackboxTests.kt index 8dabf2420be..d476e5bda70 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeBlackboxTests.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeBlackboxTests.kt @@ -8,8 +8,7 @@ package org.jetbrains.kotlin.generators.tests import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 import org.jetbrains.kotlin.generators.model.annotation import org.jetbrains.kotlin.konan.blackboxtest.AbstractNativeBlackBoxTest -import org.jetbrains.kotlin.konan.blackboxtest.support.group.NativeBlackBoxTestCaseGroupProvider -import org.jetbrains.kotlin.konan.blackboxtest.support.group.ExtTestCaseGroupProvider +import org.jetbrains.kotlin.konan.blackboxtest.support.group.UseExtTestCaseGroupProvider import org.jetbrains.kotlin.test.TargetBackend fun main() { @@ -20,7 +19,7 @@ fun main() { testGroup("native/native.tests/tests-gen", "compiler/testData") { testClass( suiteTestClassName = "NativeExtBlackBoxTestGenerated", - annotations = listOf(annotation(NativeBlackBoxTestCaseGroupProvider::class.java, ExtTestCaseGroupProvider::class.java)) + annotations = listOf(annotation(UseExtTestCaseGroupProvider::class.java)) ) { model("codegen/box", targetBackend = TargetBackend.NATIVE) model("codegen/boxInline", targetBackend = TargetBackend.NATIVE) diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt index 4b69e2bfe12..4c347fdabbc 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.konan.blackboxtest.support import org.jetbrains.kotlin.konan.blackboxtest.AbstractNativeBlackBoxTest -import org.jetbrains.kotlin.konan.blackboxtest.support.group.NativeBlackBoxTestCaseGroupProvider import org.jetbrains.kotlin.konan.blackboxtest.support.group.StandardTestCaseGroupProvider import org.jetbrains.kotlin.konan.blackboxtest.support.group.TestCaseGroupProvider +import org.jetbrains.kotlin.konan.blackboxtest.support.group.TestCaseGroupProviding import org.jetbrains.kotlin.konan.blackboxtest.support.util.* import org.jetbrains.kotlin.test.TestMetadata import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals @@ -20,6 +20,8 @@ import org.junit.jupiter.api.extension.ExtensionContext import org.junit.jupiter.api.extension.TestInstancePostProcessor import java.io.File import kotlin.reflect.KClass +import kotlin.reflect.KParameter +import kotlin.reflect.full.findAnnotation class NativeBlackBoxTestSupport : BeforeEachCallback { /** @@ -124,17 +126,39 @@ class NativeBlackBoxTestSupport : BeforeEachCallback { } private fun Class<*>.createTestCaseGroupProvider(environment: TestEnvironment): TestCaseGroupProvider { - val providerClass = getAnnotation(NativeBlackBoxTestCaseGroupProvider::class.java)?.value - ?: return StandardTestCaseGroupProvider(environment) + val (providerAnnotation, providerAnnotationClass, providerClass) = annotations.asSequence() + .mapNotNull { annotation -> + val annotationClass = annotation.annotationClass + val providerClass = annotationClass.findAnnotation()?.providerClass ?: return@mapNotNull null + Triple(annotation, annotationClass, providerClass) + }.firstOrNull() + ?: return StandardTestCaseGroupProvider(environment) // Fallback if there is no annotation. - val constructor = providerClass.constructors.firstOrNull { constructor -> - val singleParameter = constructor.parameters.singleOrNull() ?: return@firstOrNull false - (singleParameter.type.classifier as? KClass<*>)?.qualifiedName == TestEnvironment::class.qualifiedName - } ?: fail { "No suitable constructor for $providerClass" } + // First, try to find two-argument constructor. + providerClass.constructors.asSequence() + .forEach { c -> + val (p1, p2) = c.parameters.takeIf { it.size == 2 } ?: return@forEach + val provider = when { + p1.hasTypeOf() && p2.hasTypeOf(providerAnnotationClass) -> c.call(environment, providerAnnotation) + p1.hasTypeOf(providerAnnotationClass) && p2.hasTypeOf() -> c.call(providerAnnotation, environment) + else -> return@forEach + } + return provider.cast() + } - return constructor.call(environment).cast() + // Next, try to find a single-argument constructor. + providerClass.constructors.asSequence() + .forEach { c -> + val p = c.parameters.singleOrNull() ?: return@forEach + if (p.hasTypeOf()) return c.call(environment).cast() + } + + fail { "No suitable constructor for $providerClass" } } + private inline fun KParameter.hasTypeOf(): Boolean = hasTypeOf(T::class) + private fun KParameter.hasTypeOf(clazz: KClass<*>): Boolean = (type.classifier as? KClass<*>)?.qualifiedName == clazz.qualifiedName + private val TestMetadata.testRoot: File get() = getAbsoluteFile(localPath = value) } } diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/TestCaseGroupProviding.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/TestCaseGroupProviding.kt new file mode 100644 index 00000000000..a009ecfb03e --- /dev/null +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/TestCaseGroupProviding.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2021 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.konan.blackboxtest.support.group + +import kotlin.reflect.KClass + +@Target(AnnotationTarget.ANNOTATION_CLASS) +internal annotation class TestCaseGroupProviding(val providerClass: KClass) diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/NativeBlackBoxTestCaseGroupProvider.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/UseExtTestCaseGroupProvider.kt similarity index 74% rename from native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/NativeBlackBoxTestCaseGroupProvider.kt rename to native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/UseExtTestCaseGroupProvider.kt index 5ed605b2f83..c06a76d3af0 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/NativeBlackBoxTestCaseGroupProvider.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/UseExtTestCaseGroupProvider.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.konan.blackboxtest.support.group -import kotlin.reflect.KClass - @Target(AnnotationTarget.CLASS) -annotation class NativeBlackBoxTestCaseGroupProvider(val value: KClass<*>) +@TestCaseGroupProviding(ExtTestCaseGroupProvider::class) +annotation class UseExtTestCaseGroupProvider