diff --git a/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt b/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt index 6f09839f51..ec289f2b23 100644 --- a/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt +++ b/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt @@ -1525,6 +1525,30 @@ enum class SpringTestType( } } +class SpringProfileNames( + override val defaultItem: String, +) : CodeGenerationSettingTextField { + + override fun toString() = defaultItem + + companion object : CodeGenerationSettingTextField { + override val defaultItem = "default" + } +} + +const val NO_SPRING_CONFIGURATION_OPTION = "No configuration" + +class SpringConfig( + override val defaultItem: String, +) : CodeGenerationSettingTextField { + + override fun toString() = defaultItem + + companion object : CodeGenerationSettingTextField { + override val defaultItem = NO_SPRING_CONFIGURATION_OPTION + } +} + /** * Describes information about beans obtained from Spring analysis process. * @@ -1568,6 +1592,10 @@ interface CodeGenerationSettingBox { fun labels(): Array = allItems.map { it.displayName }.toTypedArray() } +interface CodeGenerationSettingTextField { + val defaultItem: String +} + enum class MockStrategyApi( override val id: String, override val displayName: String, diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt index 3c23f56b51..2ba4bff9bd 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt @@ -87,6 +87,8 @@ class GenerateTestsModel( lateinit var springSettings: SpringSettings lateinit var springTestType: SpringTestType + lateinit var springConfig: String + lateinit var springProfileNames: String val conflictTriggers: ConflictTriggers = ConflictTriggers() val preClasspathCollectionPromises: MutableList> = mutableListOf() diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/Settings.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/Settings.kt index 4de8b70089..b246da7cb8 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/Settings.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/Settings.kt @@ -25,6 +25,8 @@ private fun fromGenerateTestsModel(model: GenerateTestsModel): Settings.State { parametrizedTestSource = model.parametrizedTestSource, classesToMockAlways = model.chosenClassesToMockAlways.mapTo(mutableSetOf()) { it.name }.toTypedArray(), springTestType = model.springTestType, + springConfig = model.springConfig, + springProfileNames = model.springProfileNames, fuzzingValue = model.fuzzingValue, runGeneratedTestsWithCoverage = model.runGeneratedTestsWithCoverage, commentStyle = model.commentStyle, diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt index c5d71d36f0..760046ef60 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt @@ -99,9 +99,11 @@ import org.utbot.framework.plugin.api.CodegenLanguage import org.utbot.framework.plugin.api.CodeGenerationSettingItem import org.utbot.framework.plugin.api.SpringConfiguration import org.utbot.framework.plugin.api.SpringTestType.* +import org.utbot.framework.plugin.api.SpringProfileNames import org.utbot.framework.plugin.api.utils.MOCKITO_EXTENSIONS_FILE_CONTENT import org.utbot.framework.plugin.api.utils.MOCKITO_EXTENSIONS_FOLDER import org.utbot.framework.plugin.api.utils.MOCKITO_MOCKMAKER_FILE_NAME +import org.utbot.framework.plugin.api.NO_SPRING_CONFIGURATION_OPTION import org.utbot.framework.util.Conflict import org.utbot.intellij.plugin.models.GenerateTestsModel import org.utbot.intellij.plugin.models.id @@ -165,9 +167,6 @@ private const val SAME_PACKAGE_LABEL = "same as for sources" private const val WILL_BE_INSTALLED_LABEL = " (will be installed)" -private const val NO_SPRING_CONFIGURATION_OPTION = "No configuration" -private const val DEFAULT_SPRING_PROFILE_NAME = "default" - private const val ACTION_GENERATE = "Generate Tests" private const val ACTION_GENERATE_AND_RUN = "Generate and Run" @@ -202,7 +201,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m private val springTestType = createComboBox(SpringTestType.values()).also { it.setMinimumAndPreferredWidth(300) } private val springConfig = createComboBoxWithSeparatorsForSpringConfigs(shortenConfigurationNames()) - private val profileNames = JBTextField(23).apply { emptyText.text = DEFAULT_SPRING_PROFILE_NAME } + private val springProfileNames = JBTextField(23).apply { emptyText.text = SpringProfileNames.defaultItem } private val timeoutSpinner = JBIntSpinner(TimeUnit.MILLISECONDS.toSeconds(model.timeout).toInt(), 1, Int.MAX_VALUE, 1).also { @@ -245,6 +244,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m ) } + private fun shortenConfigurationNameByFullname(fullname: String): String? { + val allShortenConfigurationNames = shortenConfigurationNames().flatMap { it.second } + return allShortenConfigurationNames.firstOrNull { fullname.endsWith(it) } + } + private fun createComboBox(values: Array) : ComboBox { val comboBox = object:ComboBox(DefaultComboBoxModel(values)) { var maxWidth = 0 @@ -428,7 +432,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m ComboBoxPredicate(springConfig) { isSpringConfigSelected() && !isXmlSpringConfigUsed() } ) row("Active profile(s):") { - cell(profileNames) + cell(springProfileNames) contextHelp( "One or several comma-separated names.
" + "If all names are incorrect, default profile is used" @@ -736,12 +740,14 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m PresentSpringSettings( configuration = config, - profiles = parseProfileExpression(profileNames.text, DEFAULT_SPRING_PROFILE_NAME).toList() + profiles = parseProfileExpression(springProfileNames.text, SpringProfileNames.defaultItem).toList() ) } } model.springTestType = springTestType.item + model.springConfig = springConfig.item.toString() + model.springProfileNames = springProfileNames.text val settings = model.project.service() with(settings) { @@ -883,21 +889,20 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m if (settings.fuzzingValue == 0.0) 0.0 else settings.fuzzingValue.coerceAtLeast(0.3) } + springConfig.item = settings.springConfig } else -> {} } mockStrategies.item = when (model.projectType) { - ProjectType.Spring -> MockStrategyApi.springDefaultItem + ProjectType.Spring -> + if (isSpringConfigSelected()) MockStrategyApi.springDefaultItem else settings.mockStrategy else -> settings.mockStrategy } staticsMocking.isSelected = settings.staticsMocking == MockitoStaticMocking parametrizedTestSources.isSelected = (settings.parametrizedTestSource == ParametrizedTestSource.PARAMETRIZE && model.projectType == ProjectType.PureJvm) - mockStrategies.isEnabled = true - staticsMocking.isEnabled = mockStrategies.item != MockStrategyApi.NO_MOCKS - codegenLanguages.item = model.codegenLanguage val installedTestFramework = TestFramework.allItems.singleOrNull { it.isInstalled } @@ -914,8 +919,10 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m updateParametrizationEnabled() } ProjectType.Spring -> { + springProfileNames.text = settings.springProfileNames springTestType.item = if (isSpringConfigSelected()) settings.springTestType else SpringTestType.defaultItem + updateMockStrategy(springTestType.item) updateSpringSettings() updateTestFrameworksList(springTestType.item) } @@ -923,6 +930,8 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m ProjectType.JavaScript -> { } } + mockStrategies.isEnabled = !isSpringConfigSelected() + updateStaticMockEnabled() updateMockStrategyList() itemsToHelpTooltip.forEach { (box, tooltip) -> @@ -976,7 +985,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } private fun configureSpringTestFrameworkIfRequired() { - if (springConfig.item != NO_SPRING_CONFIGURATION_OPTION) { + if (isSpringConfigSelected()) { SpringModule.installedItems .forEach { configureSpringTestDependency(it) } @@ -1192,7 +1201,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m springTestType.item = SpringTestType.defaultItem - profileNames.text = "" + springProfileNames.text = "" } if (isSpringConfigSelected() && springTestType.item == UNIT_TEST) { @@ -1208,17 +1217,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m val item = comboBox.item as SpringTestType updateTestFrameworksList(item) - - when (item) { - UNIT_TEST -> { - mockStrategies.item = MockStrategyApi.springDefaultItem - staticsMocking.isSelected = true - } - INTEGRATION_TEST -> { - mockStrategies.item = MockStrategyApi.springIntegrationTestItem - staticsMocking.isSelected = false - } - } + updateMockStrategy(item) updateMockStrategyList() updateControlsEnabledStatus() } @@ -1232,6 +1231,21 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } } + private fun updateMockStrategy(springTestType: SpringTestType){ + when (springTestType) { + UNIT_TEST -> { + if(isSpringConfigSelected()){ + mockStrategies.item = MockStrategyApi.springDefaultItem + staticsMocking.isSelected = true + } + } + INTEGRATION_TEST -> { + mockStrategies.item = MockStrategyApi.springIntegrationTestItem + staticsMocking.isSelected = false + } + } + } + private lateinit var currentFrameworkItem: TestFramework private fun updateTestFrameworksList(parametrizedTestSource: ParametrizedTestSource) { @@ -1321,7 +1335,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m index: Int, selected: Boolean, hasFocus: Boolean ) { this.append(value.displayName, SimpleTextAttributes.REGULAR_ATTRIBUTES) - if (springConfig.item != NO_SPRING_CONFIGURATION_OPTION) { + if (isSpringConfigSelected()) { SpringModule.installedItems // only first missing test framework is shown to avoid overflowing ComboBox .firstOrNull { !it.testFrameworkInstalled } @@ -1384,10 +1398,10 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m if (isSpringConfigSelected()) { mockStrategies.isEnabled = false - profileNames.isEnabled = true + springProfileNames.isEnabled = true springTestType.isEnabled = !isXmlSpringConfigUsed() } else { - profileNames.isEnabled = false + springProfileNames.isEnabled = false springTestType.isEnabled = false } } diff --git a/utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/settings/CommonSettings.kt b/utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/settings/CommonSettings.kt index 2fc63f8e77..e75e865f35 100644 --- a/utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/settings/CommonSettings.kt +++ b/utbot-ui-commons/src/main/kotlin/org/utbot/intellij/plugin/settings/CommonSettings.kt @@ -40,6 +40,8 @@ import org.utbot.framework.SummariesGenerationType import org.utbot.framework.codegen.domain.UnknownTestFramework import org.utbot.framework.plugin.api.SpringTestType import org.utbot.framework.plugin.api.isSummarizationCompatible +import org.utbot.framework.plugin.api.SpringProfileNames +import org.utbot.framework.plugin.api.SpringConfig @State( name = "UtBotSettings", @@ -66,6 +68,8 @@ class Settings(val project: Project) : PersistentStateComponent var parametrizedTestSource: ParametrizedTestSource = ParametrizedTestSource.defaultItem, var classesToMockAlways: Array = Mocker.defaultSuperClassesToMockAlwaysNames.toTypedArray(), var springTestType: SpringTestType = SpringTestType.defaultItem, + var springConfig: String = SpringConfig.defaultItem, + var springProfileNames: String = SpringProfileNames.defaultItem, var fuzzingValue: Double = 0.05, var runGeneratedTestsWithCoverage: Boolean = false, var commentStyle: JavaDocCommentStyle = JavaDocCommentStyle.defaultItem, @@ -96,6 +100,8 @@ class Settings(val project: Project) : PersistentStateComponent if (parametrizedTestSource != other.parametrizedTestSource) return false if (!classesToMockAlways.contentEquals(other.classesToMockAlways)) return false if (springTestType != other.springTestType) return false + if (springConfig != other.springConfig) return false + if (springProfileNames != other.springProfileNames) return false if (fuzzingValue != other.fuzzingValue) return false if (runGeneratedTestsWithCoverage != other.runGeneratedTestsWithCoverage) return false if (commentStyle != other.commentStyle) return false @@ -120,6 +126,8 @@ class Settings(val project: Project) : PersistentStateComponent result = 31 * result + parametrizedTestSource.hashCode() result = 31 * result + classesToMockAlways.contentHashCode() result = 31 * result + springTestType.hashCode() + result = 31 * result + springConfig.hashCode() + result = 31 * result + springProfileNames.hashCode() result = 31 * result + fuzzingValue.hashCode() result = 31 * result + if (runGeneratedTestsWithCoverage) 1 else 0 result = 31 * result + summariesGenerationType.hashCode() @@ -170,6 +178,10 @@ class Settings(val project: Project) : PersistentStateComponent val springTestType: SpringTestType get() = state.springTestType + val springConfig: String get() = state.springConfig + + val springProfileNames: String get() = state.springProfileNames + val javaDocCommentStyle: JavaDocCommentStyle get() = state.commentStyle var fuzzingValue: Double