From e307b966711b10dd499d6bb83a2fe0100b1ae219 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 2 Aug 2022 09:26:25 +0200 Subject: [PATCH] [Gradle][KT-53342] Implement simple SingleTargetAndroidSourceSetLayoutTest --- .../SingleTargetAndroidSourceSetLayoutTest.kt | 73 +++++++++++++++++++ .../android/assertSingleKotlinSourceSet.kt | 33 +++++++++ 2 files changed, 106 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/SingleTargetAndroidSourceSetLayoutTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/assertSingleKotlinSourceSet.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/SingleTargetAndroidSourceSetLayoutTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/SingleTargetAndroidSourceSetLayoutTest.kt new file mode 100644 index 00000000000..f76154ad05c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/SingleTargetAndroidSourceSetLayoutTest.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2022 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.sources.android + +import com.android.build.gradle.BaseExtension +import com.android.build.gradle.LibraryPlugin +import org.gradle.api.internal.project.ProjectInternal +import org.gradle.testfixtures.ProjectBuilder +import org.jetbrains.kotlin.gradle.addBuildEventsListenerRegistryMock +import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.utils.androidExtension +import org.junit.Test +import kotlin.test.BeforeTest +import kotlin.test.assertEquals +import kotlin.test.assertSame + +class SingleTargetAndroidSourceSetLayoutTest { + private val project = ProjectBuilder.builder().build() as ProjectInternal + + private val android: BaseExtension = run { + addBuildEventsListenerRegistryMock(project) + project.plugins.apply(LibraryPlugin::class.java) + project.androidExtension + } + + @BeforeTest + fun setup() { + project.plugins.apply(KotlinAndroidPluginWrapper::class.java) + android.compileSdkVersion(31) + } + + @Test + fun `test - default configuration - AndroidSourceSet has associated KotlinSourceSet`() { + android.sourceSets.all { androidSourceSet -> project.assertSingleKotlinSourceSet(androidSourceSet) } + project.evaluate() + } + + @Test + @Suppress("deprecation") + fun `test - default configuration - AndroidSourceSet has KotlinSourceSet as convention`() { + android.sourceSets.all { androidSourceSet -> + assertSame( + project.assertSingleKotlinSourceSet(androidSourceSet), + (androidSourceSet as org.gradle.api.internal.HasConvention).convention.plugins["kotlin"] as? KotlinSourceSet, + "Expected Convention 'kotlin' on AndroidSourceSet: ${androidSourceSet.name}" + ) + } + project.evaluate() + } + + + @Test + fun `test - with flavors - AndroidSourceSet has associated KotlinSourceSet`() { + android.flavorDimensions("price", "market") + android.productFlavors { + it.create("free").dimension = "price" + it.create("paid").dimension = "price" + it.create("german").dimension = "market" + it.create("usa").dimension = "market" + } + + android.sourceSets.all { androidSourceSet -> + val kotlinSourceSet = project.assertSingleKotlinSourceSet(androidSourceSet) + assertEquals(androidSourceSet.name, kotlinSourceSet.name) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/assertSingleKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/assertSingleKotlinSourceSet.kt new file mode 100644 index 00000000000..b9b85a27e8b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/assertSingleKotlinSourceSet.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 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("DEPRECATION") + +package org.jetbrains.kotlin.gradle.sources.android + +import com.android.build.gradle.api.AndroidSourceSet +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull +import kotlin.test.fail + +fun Project.assertSingleKotlinSourceSet(androidSourceSet: AndroidSourceSet): KotlinSourceSet { + val kotlinSourceSets = kotlinExtension.sourceSets + .filter { kotlinSourceSet -> kotlinSourceSet.androidSourceSetInfoOrNull?.androidSourceSetName == androidSourceSet.name } + + if (kotlinSourceSets.isEmpty()) { + fail("Missing KotlinSourceSet for AndroidSourceSet: ${androidSourceSet.name}") + } + + if (kotlinSourceSets.size > 1) { + fail( + "More than one KotlinSourceSet associated with AndroidSourceSet: ${androidSourceSet.name}. " + + "KotlinSourceSets: ${kotlinSourceSets.map { it.name }}" + ) + } + + return kotlinSourceSets.single() +} \ No newline at end of file