From 0b49d11e3c91ddc9b2a557ab2c8f5dd98d79254e Mon Sep 17 00:00:00 2001 From: Frederik Haselmeier Date: Thu, 9 Nov 2023 21:05:21 +0100 Subject: [PATCH] [kotlin] Added tests for KTIJ-27111 GitOrigin-RevId: 01afd135f119b1d4f72fc3b8dfee668dfd3eb551 --- .../KotlinGradleSourceSetDataServiceTest.kt | 99 +++++++++++++++++++ .../externalSystem/build.gradle | 7 ++ .../simpleFacetImport/build.gradle | 7 ++ .../singleFacetPerModule/build.gradle | 7 ++ 4 files changed, 120 insertions(+) create mode 100644 plugins/kotlin/gradle/gradle-java/tests/test/org/jetbrains/kotlin/gradle/KotlinGradleSourceSetDataServiceTest.kt create mode 100644 plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/externalSystem/build.gradle create mode 100644 plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/simpleFacetImport/build.gradle create mode 100644 plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/singleFacetPerModule/build.gradle diff --git a/plugins/kotlin/gradle/gradle-java/tests/test/org/jetbrains/kotlin/gradle/KotlinGradleSourceSetDataServiceTest.kt b/plugins/kotlin/gradle/gradle-java/tests/test/org/jetbrains/kotlin/gradle/KotlinGradleSourceSetDataServiceTest.kt new file mode 100644 index 000000000000..9c676a5595b3 --- /dev/null +++ b/plugins/kotlin/gradle/gradle-java/tests/test/org/jetbrains/kotlin/gradle/KotlinGradleSourceSetDataServiceTest.kt @@ -0,0 +1,99 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.gradle + +import com.intellij.openapi.application.runWriteActionAndWait +import com.intellij.openapi.externalSystem.model.ProjectKeys +import com.intellij.openapi.externalSystem.model.ProjectSystemId +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.externalSystem.service.project.ProjectDataManager +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import junit.framework.AssertionFailedError +import org.jetbrains.kotlin.idea.codeInsight.gradle.KotlinGradleImportingTestCase +import org.jetbrains.kotlin.idea.codeInsight.gradle.facetSettings +import org.jetbrains.kotlin.idea.gradle.configuration.KotlinSourceSetData +import org.jetbrains.kotlin.idea.gradleJava.configuration.KotlinGradleProjectDataService +import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions +import org.jetbrains.plugins.gradle.util.GradleConstants +import org.junit.Test +import org.junit.jupiter.api.assertDoesNotThrow + +class KotlinGradleSourceSetDataServiceTest : KotlinGradleImportingTestCase() { + @Test + @TargetVersions("7.6+") + fun testSimpleFacetImport() { + configureByFiles() + importProject() + assertDoesNotThrow { + facetSettings("project.main") + facetSettings("project.test") + } + org.junit.jupiter.api.assertThrows { + facetSettings("project") + } + } + + @Test + @TargetVersions("7.6+") + fun testSingleFacetPerModule() { + configureByFiles() + // This means a single module is imported (project) rather than one per source set + currentExternalProjectSettings.isResolveModulePerSourceSet = false + importProject() + assertDoesNotThrow { + facetSettings("project") + } + org.junit.jupiter.api.assertThrows { + facetSettings("project.main") + } + org.junit.jupiter.api.assertThrows { + facetSettings("project.test") + } + } + + private val testSystemId = ProjectSystemId("TestSystem") + + // See KTIJ-27111 for details + @Test + @TargetVersions("7.6+") + fun testExternalSystem() { + configureByFiles() + currentExternalProjectSettings.isResolveModulePerSourceSet = false + importProject() + assertDoesNotThrow { + facetSettings("project") + } + + val service = KotlinGradleProjectDataService() + val currentSettings = currentExternalProjectSettings + // Fake external system projectData + val projectData = ProjectData(testSystemId, "TestSystem", myProject.projectFilePath!!, currentSettings.externalProjectPath) + + // Find the module nodes + val gradleProjectData = ProjectDataManager.getInstance().getExternalProjectsData(myProject, GradleConstants.SYSTEM_ID).first() + val externalProjectData = gradleProjectData!!.externalProjectStructure!! + val modulesNodes = ExternalSystemApiUtil.findAll(externalProjectData, ProjectKeys.MODULE) + + // main module + val mainModule = modulesNodes.first() + mainModule.clear(false) + // Clear all the Gradle source sets, so that this module appears like from an external system, + // but it has a Kotlin facet + ExternalSystemApiUtil.getChildren(mainModule, KotlinSourceSetData.KEY).forEach { + it.clear(true) + } + val modifiableProvider = ProjectDataManager.getInstance().createModifiableModelsProvider(myProject) + + // We pretend that an external system has imported this project, including the existing Kotlin facet. + // This call should NOT remove facets from other systems + service.postProcess(modulesNodes, projectData, myProject, modifiableProvider) + runWriteActionAndWait { + modifiableProvider.commit() + } + + assertDoesNotThrow { + facetSettings("project") + } + } + + override fun testDataDirName(): String = "gradleSourceSetDataServiceTest" +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/externalSystem/build.gradle b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/externalSystem/build.gradle new file mode 100644 index 000000000000..a773013326a2 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/externalSystem/build.gradle @@ -0,0 +1,7 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.9.20' +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/simpleFacetImport/build.gradle b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/simpleFacetImport/build.gradle new file mode 100644 index 000000000000..a773013326a2 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/simpleFacetImport/build.gradle @@ -0,0 +1,7 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.9.20' +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/singleFacetPerModule/build.gradle b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/singleFacetPerModule/build.gradle new file mode 100644 index 000000000000..a773013326a2 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/gradle/gradleSourceSetDataServiceTest/singleFacetPerModule/build.gradle @@ -0,0 +1,7 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.9.20' +} + +repositories { + mavenCentral() +} \ No newline at end of file