From e988b9775743e1ca7b4167154026fd8b0a7c6ffb Mon Sep 17 00:00:00 2001 From: Kirill Shishin Date: Tue, 4 Jul 2023 03:00:20 +0300 Subject: [PATCH 1/5] Fix Spring UI --- .../kotlin/org/utbot/framework/plugin/api/Api.kt | 2 ++ .../intellij/plugin/ui/GenerateTestsDialogWindow.kt | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) 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 6509349574..7b8c2decde 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 @@ -1591,9 +1591,11 @@ enum class MockStrategyApi( override val allItems: List = values().toList() // Mock strategy gains more meaning in Spring Projects. + // We use NO_MOCKS strategy in integration tests // We use OTHER_CLASSES strategy as default one in `No configuration` mode // and as unique acceptable in other modes (combined with type replacement). val springDefaultItem = OTHER_CLASSES + val springIntegrationTestItem = NO_MOCKS } } 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 ee29b004b4..11a0c8df05 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 @@ -454,7 +454,9 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m row { cell(parametrizedTestSources) contextHelp("Parametrization is not supported in some configurations, e.g. if mocks are used.") - } + }.enabledIf(ComboBoxPredicate(springConfig) { + model.projectType != ProjectType.Spring + }) row("Test generation timeout:") { cell(BorderLayoutPanel().apply { addToLeft(timeoutSpinner) @@ -852,7 +854,8 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m else -> settings.mockStrategy } staticsMocking.isSelected = settings.staticsMocking == MockitoStaticMocking - parametrizedTestSources.isSelected = settings.parametrizedTestSource == ParametrizedTestSource.PARAMETRIZE + parametrizedTestSources.isSelected = (settings.parametrizedTestSource == ParametrizedTestSource.PARAMETRIZE + && model.projectType != ProjectType.Spring) mockStrategies.isEnabled = true staticsMocking.isEnabled = mockStrategies.item != MockStrategyApi.NO_MOCKS @@ -1197,6 +1200,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m val item = comboBox.item as SpringTestsType updateTestFrameworkList(item) + + if(item == INTEGRATION_TESTS) { + mockStrategies.item = MockStrategyApi.springIntegrationTestItem + updateMockStrategyList() + } } cbSpecifyTestPackage.addActionListener { From 5ae433ae5ae56c11a4df2cee2528f0d57c220bbd Mon Sep 17 00:00:00 2001 From: Kirill Shishin Date: Wed, 5 Jul 2023 03:43:52 +0300 Subject: [PATCH 2/5] Rewrite fields action listeners --- .../plugin/ui/GenerateTestsDialogWindow.kt | 86 +++++++++++-------- 1 file changed, 51 insertions(+), 35 deletions(-) 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 11a0c8df05..fcc1c9f7b5 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 @@ -1116,12 +1116,12 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m val comboBox = event.source as ComboBox<*> val item = comboBox.item as MockStrategyApi - staticsMocking.isEnabled = item != MockStrategyApi.NO_MOCKS - if (!staticsMocking.isEnabled) { + if(item == MockStrategyApi.NO_MOCKS){ staticsMocking.isSelected = false } updateParametrizationEnabled() + updateFieldsStatus() } testFrameworks.addActionListener { event -> @@ -1144,55 +1144,35 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m ParametrizedTestSource.DO_NOT_PARAMETRIZE } - when (parametrizedTestSource) { - ParametrizedTestSource.PARAMETRIZE -> { - mockStrategies.item = MockStrategyApi.NO_MOCKS - staticsMocking.isEnabled = false - staticsMocking.isSelected = false - } - ParametrizedTestSource.DO_NOT_PARAMETRIZE -> { - mockStrategies.isEnabled = true - if (mockStrategies.item != MockStrategyApi.NO_MOCKS) { - staticsMocking.isEnabled = true - staticsMocking.isSelected = true - } - } - } - updateTestFrameworksList(parametrizedTestSource) + updateFieldsStatus() } springConfig.addActionListener { _ -> if (isSpringConfigSelected()) { mockStrategies.item = MockStrategyApi.springDefaultItem - mockStrategies.isEnabled = false + + if(isXmlSpringConfigUsed()) { + springTestsType.item = SpringTestsType.defaultItem + } + updateMockStrategyListForConfigGuidedTypeReplacements() - staticsMocking.isEnabled = false staticsMocking.isSelected = true - - springTestsType.let { - it.isEnabled = !isXmlSpringConfigUsed() - if (!it.isEnabled) springTestsType.item = SpringTestsType.defaultItem - } - profileNames.isEnabled = true } else { mockStrategies.item = when (model.projectType) { ProjectType.Spring -> MockStrategyApi.springDefaultItem else -> MockStrategyApi.defaultItem } - mockStrategies.isEnabled = true - updateMockStrategyList() - - staticsMocking.isEnabled = true - staticsMocking.isSelected = mockStrategies.item != MockStrategyApi.NO_MOCKS - springTestsType.isEnabled = false springTestsType.item = SpringTestsType.defaultItem - profileNames.isEnabled = false + updateMockStrategyList() + + staticsMocking.isSelected = mockStrategies.item != MockStrategyApi.NO_MOCKS profileNames.text = "" } + updateFieldsStatus() } springTestsType.addActionListener { event -> @@ -1201,10 +1181,20 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m updateTestFrameworkList(item) - if(item == INTEGRATION_TESTS) { - mockStrategies.item = MockStrategyApi.springIntegrationTestItem - updateMockStrategyList() + when (item) { + UNIT_TESTS -> { + mockStrategies.item = MockStrategyApi.springDefaultItem + updateMockStrategyListForConfigGuidedTypeReplacements() + staticsMocking.isSelected = true + } + INTEGRATION_TESTS -> { + mockStrategies.item = MockStrategyApi.springIntegrationTestItem + updateMockStrategyList() + staticsMocking.isSelected = false + } } + + updateFieldsStatus() } cbSpecifyTestPackage.addActionListener { @@ -1351,6 +1341,32 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } } + + private fun updateFieldsStatus() { + mockStrategies.isEnabled = true + staticsMocking.isEnabled = mockStrategies.item != MockStrategyApi.NO_MOCKS + parametrizedTestSources.isEnabled = mockStrategies.item == MockStrategyApi.NO_MOCKS + + if (model.projectType == ProjectType.Spring) { + updateSpringFieldsStatus() + } + } + + private fun updateSpringFieldsStatus() { + // Parametrized tests are not supported for Spring + parametrizedTestSources.isEnabled = false + + if(isSpringConfigSelected()){ + mockStrategies.isEnabled = false + staticsMocking.isEnabled = false + profileNames.isEnabled = true + springTestsType.isEnabled = !isXmlSpringConfigUsed() + } + else{ + profileNames.isEnabled = false + springTestsType.isEnabled = false + } + } } fun GenerateTestsModel.getActionText() : String = From 773f437ffa35c5839f38dbed52e304c0ab3a8c33 Mon Sep 17 00:00:00 2001 From: Kirill Shishin Date: Wed, 5 Jul 2023 13:29:40 +0300 Subject: [PATCH 3/5] Add a new structure for updating fields status --- .../plugin/ui/GenerateTestsDialogWindow.kt | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) 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 fcc1c9f7b5..693a2ffee6 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 @@ -1105,22 +1105,13 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m with((event.source as JComboBox<*>).selectedItem) { if (this is VirtualFile) { model.setSourceRootAndFindTestModule(this@with) - } - else { + } else { model.setSourceRootAndFindTestModule(null) } } } - mockStrategies.addActionListener { event -> - val comboBox = event.source as ComboBox<*> - val item = comboBox.item as MockStrategyApi - - if(item == MockStrategyApi.NO_MOCKS){ - staticsMocking.isSelected = false - } - - updateParametrizationEnabled() + mockStrategies.addActionListener { _ -> updateFieldsStatus() } @@ -1130,11 +1121,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m currentFrameworkItem = item - updateParametrizationEnabled() + updateFieldsStatus() } codegenLanguages.addActionListener { _ -> - updateParametrizationEnabled() + updateFieldsStatus() } parametrizedTestSources.addActionListener { _ -> @@ -1150,15 +1141,14 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m springConfig.addActionListener { _ -> if (isSpringConfigSelected()) { - mockStrategies.item = MockStrategyApi.springDefaultItem - - if(isXmlSpringConfigUsed()) { + if (isXmlSpringConfigUsed()) { springTestsType.item = SpringTestsType.defaultItem } - updateMockStrategyListForConfigGuidedTypeReplacements() - - staticsMocking.isSelected = true + if (springTestsType.item == UNIT_TESTS) { + mockStrategies.item = MockStrategyApi.springDefaultItem + updateMockStrategyListForConfigGuidedTypeReplacements() + } } else { mockStrategies.item = when (model.projectType) { ProjectType.Spring -> MockStrategyApi.springDefaultItem @@ -1169,7 +1159,6 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m updateMockStrategyList() - staticsMocking.isSelected = mockStrategies.item != MockStrategyApi.NO_MOCKS profileNames.text = "" } updateFieldsStatus() @@ -1185,12 +1174,10 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m UNIT_TESTS -> { mockStrategies.item = MockStrategyApi.springDefaultItem updateMockStrategyListForConfigGuidedTypeReplacements() - staticsMocking.isSelected = true } INTEGRATION_TESTS -> { mockStrategies.item = MockStrategyApi.springIntegrationTestItem updateMockStrategyList() - staticsMocking.isSelected = false } } @@ -1261,6 +1248,16 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } } + private fun updateStaticMockEnabled() { + val mockStrategyIsSupported = mockStrategies.item != MockStrategyApi.NO_MOCKS + + staticsMocking.isEnabled = mockStrategyIsSupported && !isSpringConfigSelected() + + if (!staticsMocking.isEnabled) { + staticsMocking.isSelected = mockStrategyIsSupported && isSpringConfigSelected() + } + } + private fun updateMockStrategyList() { mockStrategies.renderer = object : ColoredListCellRenderer() { override fun customizeCellRenderer( @@ -1344,8 +1341,9 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m private fun updateFieldsStatus() { mockStrategies.isEnabled = true - staticsMocking.isEnabled = mockStrategies.item != MockStrategyApi.NO_MOCKS - parametrizedTestSources.isEnabled = mockStrategies.item == MockStrategyApi.NO_MOCKS + + updateParametrizationEnabled() + updateStaticMockEnabled() if (model.projectType == ProjectType.Spring) { updateSpringFieldsStatus() @@ -1356,13 +1354,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m // Parametrized tests are not supported for Spring parametrizedTestSources.isEnabled = false - if(isSpringConfigSelected()){ + if (isSpringConfigSelected()) { mockStrategies.isEnabled = false - staticsMocking.isEnabled = false profileNames.isEnabled = true springTestsType.isEnabled = !isXmlSpringConfigUsed() - } - else{ + } else { profileNames.isEnabled = false springTestsType.isEnabled = false } From b5cbaddf8c34eead8ba0a657c56ed2ab6e3d6765 Mon Sep 17 00:00:00 2001 From: Kirill Shishin Date: Thu, 6 Jul 2023 12:46:40 +0300 Subject: [PATCH 4/5] Refactoring --- .../org/utbot/framework/plugin/api/Api.kt | 2 +- .../plugin/ui/GenerateTestsDialogWindow.kt | 54 ++++++++----------- 2 files changed, 23 insertions(+), 33 deletions(-) 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 7b8c2decde..b7a9db87ac 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 @@ -1591,10 +1591,10 @@ enum class MockStrategyApi( override val allItems: List = values().toList() // Mock strategy gains more meaning in Spring Projects. - // We use NO_MOCKS strategy in integration tests // We use OTHER_CLASSES strategy as default one in `No configuration` mode // and as unique acceptable in other modes (combined with type replacement). val springDefaultItem = OTHER_CLASSES + // We use NO_MOCKS strategy in integration tests because they are based on fuzzer that is not compatible with mocks val springIntegrationTestItem = NO_MOCKS } } 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 693a2ffee6..0ff0ff0d8c 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 @@ -448,14 +448,14 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m "Otherwise, mock nothing. Mockito will be installed, if you don't have one." ) }.enabledIf(ComboBoxPredicate(springConfig) { - model.projectType != ProjectType.Spring || !isSpringConfigSelected() + model.projectType == ProjectType.PureJvm || !isSpringConfigSelected() }) row { cell(staticsMocking)} row { cell(parametrizedTestSources) contextHelp("Parametrization is not supported in some configurations, e.g. if mocks are used.") }.enabledIf(ComboBoxPredicate(springConfig) { - model.projectType != ProjectType.Spring + model.projectType == ProjectType.PureJvm }) row("Test generation timeout:") { cell(BorderLayoutPanel().apply { @@ -855,7 +855,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } staticsMocking.isSelected = settings.staticsMocking == MockitoStaticMocking parametrizedTestSources.isSelected = (settings.parametrizedTestSource == ParametrizedTestSource.PARAMETRIZE - && model.projectType != ProjectType.Spring) + && model.projectType == ProjectType.PureJvm) mockStrategies.isEnabled = true staticsMocking.isEnabled = mockStrategies.item != MockStrategyApi.NO_MOCKS @@ -1112,7 +1112,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } mockStrategies.addActionListener { _ -> - updateFieldsStatus() + updateControlsEnabledStatus() } testFrameworks.addActionListener { event -> @@ -1121,11 +1121,11 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m currentFrameworkItem = item - updateFieldsStatus() + updateControlsEnabledStatus() } codegenLanguages.addActionListener { _ -> - updateFieldsStatus() + updateControlsEnabledStatus() } parametrizedTestSources.addActionListener { _ -> @@ -1136,7 +1136,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } updateTestFrameworksList(parametrizedTestSource) - updateFieldsStatus() + updateControlsEnabledStatus() } springConfig.addActionListener { _ -> @@ -1147,7 +1147,6 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m if (springTestsType.item == UNIT_TESTS) { mockStrategies.item = MockStrategyApi.springDefaultItem - updateMockStrategyListForConfigGuidedTypeReplacements() } } else { mockStrategies.item = when (model.projectType) { @@ -1157,11 +1156,10 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m springTestsType.item = SpringTestsType.defaultItem - updateMockStrategyList() - profileNames.text = "" } - updateFieldsStatus() + updateMockStrategyList() + updateControlsEnabledStatus() } springTestsType.addActionListener { event -> @@ -1173,15 +1171,13 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m when (item) { UNIT_TESTS -> { mockStrategies.item = MockStrategyApi.springDefaultItem - updateMockStrategyListForConfigGuidedTypeReplacements() } INTEGRATION_TESTS -> { mockStrategies.item = MockStrategyApi.springIntegrationTestItem - updateMockStrategyList() } } - - updateFieldsStatus() + updateMockStrategyList() + updateControlsEnabledStatus() } cbSpecifyTestPackage.addActionListener { @@ -1264,21 +1260,15 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m list: JList, value: MockStrategyApi, index: Int, selected: Boolean, hasFocus: Boolean ) { - this.append(value.displayName, SimpleTextAttributes.REGULAR_ATTRIBUTES) - if (value != MockStrategyApi.NO_MOCKS && !MOCKITO.isInstalled) { - this.append(WILL_BE_INSTALLED_LABEL, SimpleTextAttributes.ERROR_ATTRIBUTES) + if(mockStrategies.item == MockStrategyApi.springDefaultItem && isSpringConfigSelected()) { + this.append("Mock using Spring configuration", SimpleTextAttributes.REGULAR_ATTRIBUTES) + } + else{ + this.append(value.displayName, SimpleTextAttributes.REGULAR_ATTRIBUTES) + if (value != MockStrategyApi.NO_MOCKS && !MOCKITO.isInstalled) { + this.append(WILL_BE_INSTALLED_LABEL, SimpleTextAttributes.ERROR_ATTRIBUTES) + } } - } - } - } - - private fun updateMockStrategyListForConfigGuidedTypeReplacements() { - mockStrategies.renderer = object : ColoredListCellRenderer() { - override fun customizeCellRenderer( - list: JList, value: MockStrategyApi, - index: Int, selected: Boolean, hasFocus: Boolean - ) { - this.append("Mock using Spring configuration", SimpleTextAttributes.REGULAR_ATTRIBUTES) } } } @@ -1339,18 +1329,18 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m } } - private fun updateFieldsStatus() { + private fun updateControlsEnabledStatus() { mockStrategies.isEnabled = true updateParametrizationEnabled() updateStaticMockEnabled() if (model.projectType == ProjectType.Spring) { - updateSpringFieldsStatus() + updateSpringControlsEnabledStatus() } } - private fun updateSpringFieldsStatus() { + private fun updateSpringControlsEnabledStatus() { // Parametrized tests are not supported for Spring parametrizedTestSources.isEnabled = false From dcd9b9200cb09c87e18f60e5609c8bb222d10e9c Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Thu, 6 Jul 2023 13:51:31 +0300 Subject: [PATCH 5/5] Correct static mocking --- .../utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 693a2ffee6..a452607566 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 @@ -1252,10 +1252,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m val mockStrategyIsSupported = mockStrategies.item != MockStrategyApi.NO_MOCKS staticsMocking.isEnabled = mockStrategyIsSupported && !isSpringConfigSelected() - - if (!staticsMocking.isEnabled) { - staticsMocking.isSelected = mockStrategyIsSupported && isSpringConfigSelected() - } + staticsMocking.isSelected = mockStrategyIsSupported } private fun updateMockStrategyList() {