diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt new file mode 100644 index 00000000000..83a5133501f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KT46273JvmTargetAndOrphanTestSourceSetTest.kt @@ -0,0 +1,48 @@ +/* + * 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. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle + +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope +import kotlin.test.Test + +class KT46273JvmTargetAndOrphanTestSourceSetTest : MultiplatformExtensionTest() { + + override fun setup() { + enableGranularSourceSetsMetadata() + super.setup() + } + + @Test + fun `test KT-46273`() { + kotlin.jvm() + + val commonTest = kotlin.sourceSets.getByName("commonTest") + commonTest.dependencies { + implementation(kotlin("test")) + } + + val orphanTestSourceSet = kotlin.sourceSets.create("orphanTest") as DefaultKotlinSourceSet + orphanTestSourceSet.dependsOn(commonTest) + + project.evaluate() + + /* + Previously failed with: + Collection is empty. + java.util.NoSuchElementException: Collection is empty. + at kotlin.collections.CollectionsKt___CollectionsKt.single(_Collections.kt:562) + at org.jetbrains.kotlin.gradle.internal.KotlinDependenciesManagementKt.kotlinTestCapabilityForJvmSourceSet(KotlinDependenciesManagement.kt:347) + + The dependencies' transformation will be called by the IDE during import. + */ + KotlinDependencyScope.values().forEach { scope -> + orphanTestSourceSet.getDependenciesTransformation(scope) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index 5aa7a3a1d32..cd2b8d11426 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -11,18 +11,13 @@ import com.android.build.gradle.api.UnitTestVariant import org.gradle.api.InvalidUserDataException import org.gradle.api.Project import org.gradle.api.Task -import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.Dependency -import org.gradle.api.artifacts.DependencySet -import org.gradle.api.artifacts.ExternalDependency -import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.artifacts.* import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.junit.JUnitOptions import org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions import org.gradle.api.tasks.testing.testng.TestNGOptions import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.execution.KotlinAggregateExecutionSource import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider @@ -31,13 +26,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope -import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.plugin.sources.resolveAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope +import org.jetbrains.kotlin.gradle.plugin.sources.withAllDependsOnSourceSets import org.jetbrains.kotlin.gradle.targets.jvm.JvmCompilationsTestRunSource import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.testing.KotlinTaskTestRun -import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName internal const val KOTLIN_MODULE_GROUP = "org.jetbrains.kotlin" @@ -348,10 +342,8 @@ private fun kotlinTestCapabilityForJvmSourceSet(project: Project, kotlinSourceSe KotlinTestJvmFramework.junit } } - return when { - frameworks.size > 1 -> null - else -> "$KOTLIN_MODULE_GROUP:$KOTLIN_TEST_ROOT_MODULE_NAME-framework-${frameworks.single()}" - } + + return "$KOTLIN_MODULE_GROUP:$KOTLIN_TEST_ROOT_MODULE_NAME-framework-${frameworks.singleOrNull() ?: return null}" } internal const val KOTLIN_TEST_ROOT_MODULE_NAME = "kotlin-test" @@ -402,4 +394,4 @@ private fun Project.tryWithDependenciesIfUnresolved(configuration: Configuration private fun Configuration.allNonProjectDependencies() = allDependencies.matching { it !is ProjectDependency } -private fun Configuration.nonProjectDependencies() = dependencies.matching { it !is ProjectDependency } \ No newline at end of file +private fun Configuration.nonProjectDependencies() = dependencies.matching { it !is ProjectDependency }