diff options
author | vmadalin <vmadalin@google.com> | 2022-08-12 10:31:07 +0100 |
---|---|---|
committer | Madalin Valceleanu <vmadalin@google.com> | 2022-08-15 16:49:12 +0000 |
commit | 2053fad3a9bae04ae0108a618d826f27c656bfc0 (patch) | |
tree | c98e998fdd6746e7c128ba08cc800cb2dd77533b | |
parent | 4a1ac2ca2897f17a8d21ac6150f95e98170a10a4 (diff) | |
download | idea-2053fad3a9bae04ae0108a618d826f27c656bfc0.tar.gz |
Sort build variants alphabetically
We lost sorting after creating the new BuildVariantTableModel
on the CL: I9fdae24e5fbb946897ba1df0e4365e78cdd72398, in
particular by removing the following sorting:
```
gradleModules.stream().sorted(ModuleTypeComparator.INSTANCE)
```
This change applies again our ModuleTypeComparator but also
adds some test coverage.
Note: The ModuleTypeComparator is sorting numbers
in lexical order as we had before, but potentially
we would like to change this behaviour in the future
Bug: 241699420
Test: Added coverage + manual validation
Change-Id: I635b887b304d7b67e3910e29624d6f3d32e288e3
2 files changed, 88 insertions, 20 deletions
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/variant/view/BuildVariantTableModel.kt b/project-system-gradle/src/com/android/tools/idea/gradle/variant/view/BuildVariantTableModel.kt index 59fede9c667..b5c54c4a6e4 100644 --- a/project-system-gradle/src/com/android/tools/idea/gradle/variant/view/BuildVariantTableModel.kt +++ b/project-system-gradle/src/com/android/tools/idea/gradle/variant/view/BuildVariantTableModel.kt @@ -22,6 +22,7 @@ import com.android.tools.idea.gradle.project.model.NdkModuleModel import com.android.tools.idea.gradle.project.model.NdkModuleModel.Companion.get import com.android.tools.idea.gradle.project.model.VariantAbi import com.android.tools.idea.gradle.project.sync.idea.getVariantAndAbi +import com.android.tools.idea.gradle.util.ModuleTypeComparator import com.android.tools.idea.projectsystem.getAndroidFacets import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project @@ -103,14 +104,16 @@ private constructor( private fun BuildVariantTableRow.toArray(hasAbis: Boolean): Array<Any?> = if (hasAbis) arrayOf(module, variant, abi) else arrayOf(module, variant) -private fun buildVariantTableModelRows(project: Project): List<BuildVariantTableRow> { - return project.getAndroidFacets().map { androidFacet -> - val variantAndAbi = androidFacet.getVariantAndAbi() - val buildVariantItems = getBuildVariantItems(androidFacet) - val abiItems = getAbiItems(androidFacet, variantAndAbi.variant) - BuildVariantTableRow(androidFacet.holderModule, variantAndAbi.variant, variantAndAbi.abi, buildVariantItems, abiItems) - } -} +private fun buildVariantTableModelRows(project: Project) = + project + .getAndroidFacets() + .sortedWith(compareBy(ModuleTypeComparator.INSTANCE) { it.module }) + .map { androidFacet -> + val variantAndAbi = androidFacet.getVariantAndAbi() + val buildVariantItems = getBuildVariantItems(androidFacet) + val abiItems = getAbiItems(androidFacet, variantAndAbi.variant) + BuildVariantTableRow(androidFacet.holderModule, variantAndAbi.variant, variantAndAbi.abi, buildVariantItems, abiItems) + } private fun getBuildVariantItems(facet: AndroidFacet): List<BuildVariantItem> { return GradleAndroidModel.get(facet)?.variantNames.orEmpty().map { BuildVariantItem(it) }.sorted() @@ -137,4 +140,3 @@ private fun getNdkModuleModelIfNotJustDummy(facet: AndroidFacet): NdkModuleModel val ndkFacet = getInstance(facet.holderModule) ?: return null return getNdkModuleModelIfNotJustDummy(ndkFacet) } - diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/variant/view/BuildVariantTableModelTest.kt b/project-system-gradle/testSrc/com/android/tools/idea/gradle/variant/view/BuildVariantTableModelTest.kt index 9d2b37928a9..6c301614fe7 100644 --- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/variant/view/BuildVariantTableModelTest.kt +++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/variant/view/BuildVariantTableModelTest.kt @@ -45,7 +45,7 @@ class BuildVariantTableModelTest { fun withoutAbi() { projectRule.setupProjectFrom( JavaModuleModelBuilder.rootModuleBuilder, - appModuleBuilder(), + appModuleBuilder(dependencyList = listOf(AndroidModuleDependency(":lib", "debug"))), libModuleBuilder() ) val model = BuildVariantTableModel.create(projectRule.project) @@ -79,7 +79,7 @@ class BuildVariantTableModelTest { fun withAbi() { projectRule.setupProjectFrom( JavaModuleModelBuilder.rootModuleBuilder, - appModuleBuilder(), + appModuleBuilder(dependencyList = listOf(AndroidModuleDependency(":lib", "debug"))), ndkLibModuleBuilder() ) val model = BuildVariantTableModel.create(projectRule.project) @@ -108,21 +108,68 @@ class BuildVariantTableModelTest { ) ) } + + @Test + fun `Given project modules with same type When create VariantTableModel Then TableRows is sorted`() { + val projectModules = arrayOf( + appModuleBuilder(":appB"), + appModuleBuilder(":appA"), + appModuleBuilder(":appD"), + appModuleBuilder(":appC") + ) + projectRule.setupProjectFrom(*projectModules) + + val model = BuildVariantTableModel.create(projectRule.project) + + expect.that(model.rows).hasSize(projectModules.size) + // Assert modules with same type are sorted + val expectedSortedModules = arrayOf("appA", "appB", "appC", "appD") + expectedSortedModules.forEachIndexed { index, moduleName -> + expect.that(model.rows[index].module.name).isEqualTo("${projectRule.project.name}.$moduleName") + } + } + + @Test + fun `Given project modules with different type When create VariantTableModel Then TableRows is sorted by IdeAndroidProjectType`() { + val projectModules = arrayOf( + appModuleBuilder(":xappC"), + appModuleBuilder(":appB"), + appModuleBuilder(":appA"), + featureModuleBuilder(), + libModuleBuilder(":libB"), + libModuleBuilder(":alibA"), + testModuleBuilder() + ) + projectRule.setupProjectFrom(*projectModules) + + val model = BuildVariantTableModel.create(projectRule.project) + + expect.that(model.rows).hasSize(projectModules.size) + // Assert modules sorted and grouped by IdeAndroidProjectType order + val expectedSortedModules = arrayOf("appA", "appB", "xappC", "alibA", "libB", "test", "feature") + expectedSortedModules.forEachIndexed { index, moduleName -> + expect.that(model.rows[index].module.name).isEqualTo("${projectRule.project.name}.$moduleName") + } + } } private fun appModuleBuilder( appPath: String = ":app", selectedVariant: String = "debug", - dependOnVariant: String? = "debug" -) = AndroidModuleModelBuilder( - appPath, - selectedVariant, - AndroidProjectBuilder(androidModuleDependencyList = { listOf(AndroidModuleDependency(":lib", dependOnVariant)) }) -) - -private fun libModuleBuilder(selectedVariant: String = "debug") = + dependencyList: List<AndroidModuleDependency> = emptyList() +) = AndroidModuleModelBuilder( - ":lib", + appPath, + selectedVariant, + AndroidProjectBuilder(androidModuleDependencyList = { dependencyList }) + ) + +private fun libModuleBuilder( + libPath: String = ":lib", + selectedVariant: String = "debug" +) = + AndroidModuleModelBuilder( + libPath, selectedVariant, AndroidProjectBuilder(projectType = { IdeAndroidProjectType.PROJECT_TYPE_LIBRARY }) ) @@ -134,3 +181,22 @@ private fun ndkLibModuleBuilder(selectedVariant: String = "debug") = AndroidProjectBuilder(projectType = { IdeAndroidProjectType.PROJECT_TYPE_LIBRARY }, ndkModel = { buildNdkModelStub() }) ) +private fun featureModuleBuilder( + featurePath: String = ":feature", + selectedVariant: String = "debug" +) = + AndroidModuleModelBuilder( + featurePath, + selectedVariant, + AndroidProjectBuilder(projectType = { IdeAndroidProjectType.PROJECT_TYPE_FEATURE }) + ) + +private fun testModuleBuilder( + testPath: String = ":test", + selectedVariant: String = "debug" +) = + AndroidModuleModelBuilder( + testPath, + selectedVariant, + AndroidProjectBuilder(projectType = { IdeAndroidProjectType.PROJECT_TYPE_TEST }) + ) |