@@ -27,9 +27,11 @@ import com.intellij.openapi.ui.ComboBox
27
27
import com.intellij.openapi.ui.DialogPanel
28
28
import com.intellij.openapi.ui.DialogWrapper
29
29
import com.intellij.openapi.ui.Messages
30
+ import com.intellij.openapi.ui.OptionAction
30
31
import com.intellij.openapi.ui.ValidationInfo
31
32
import com.intellij.openapi.ui.popup.IconButton
32
33
import com.intellij.openapi.util.Computable
34
+ import com.intellij.openapi.util.text.TextWithMnemonic
33
35
import com.intellij.openapi.vfs.StandardFileSystems
34
36
import com.intellij.openapi.vfs.VfsUtil
35
37
import com.intellij.openapi.vfs.VfsUtilCore.urlToPath
@@ -40,7 +42,6 @@ import com.intellij.psi.PsiClass
40
42
import com.intellij.psi.PsiManager
41
43
import com.intellij.psi.PsiMethod
42
44
import com.intellij.psi.SyntheticElement
43
- import com.intellij.psi.PsiModifier
44
45
import com.intellij.refactoring.PackageWrapper
45
46
import com.intellij.refactoring.ui.MemberSelectionTable
46
47
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo
@@ -75,11 +76,28 @@ import com.intellij.util.ui.JBUI.scale
75
76
import com.intellij.util.ui.JBUI.size
76
77
import com.intellij.util.ui.UIUtil
77
78
import com.intellij.util.ui.components.BorderLayoutPanel
79
+ import java.awt.BorderLayout
80
+ import java.awt.Color
81
+ import java.awt.event.ActionEvent
82
+ import java.nio.file.Files
83
+ import java.nio.file.Path
84
+ import java.nio.file.Paths
85
+ import java.util.Objects
86
+ import java.util.concurrent.TimeUnit
87
+ import javax.swing.AbstractAction
88
+ import javax.swing.Action
89
+ import javax.swing.DefaultComboBoxModel
90
+ import javax.swing.JButton
91
+ import javax.swing.JComboBox
92
+ import javax.swing.JComponent
93
+ import javax.swing.JList
94
+ import javax.swing.JPanel
95
+ import kotlin.streams.toList
78
96
import org.jetbrains.concurrency.Promise
79
97
import org.jetbrains.concurrency.thenRun
80
98
import org.jetbrains.kotlin.asJava.classes.KtUltraLightClass
81
- import org.utbot.common.filterWhen
82
99
import org.utbot.common.PathUtil.toPath
100
+ import org.utbot.common.filterWhen
83
101
import org.utbot.framework.UtSettings
84
102
import org.utbot.framework.codegen.ForceStaticMocking
85
103
import org.utbot.framework.codegen.Junit4
@@ -116,20 +134,7 @@ import org.utbot.intellij.plugin.ui.utils.kotlinTargetPlatform
116
134
import org.utbot.intellij.plugin.ui.utils.parseVersion
117
135
import org.utbot.intellij.plugin.ui.utils.testResourceRootTypes
118
136
import org.utbot.intellij.plugin.ui.utils.testRootType
119
- import org.utbot.intellij.plugin.util.AndroidApiHelper
120
- import java.awt.BorderLayout
121
- import java.awt.Color
122
- import java.nio.file.Files
123
- import java.nio.file.Path
124
- import java.nio.file.Paths
125
- import java.util.*
126
- import java.util.concurrent.TimeUnit
127
- import javax.swing.DefaultComboBoxModel
128
- import javax.swing.JComboBox
129
- import javax.swing.JComponent
130
- import javax.swing.JList
131
- import javax.swing.JPanel
132
- import kotlin.streams.toList
137
+ import org.utbot.intellij.plugin.util.IntelliJApiHelper
133
138
import org.utbot.intellij.plugin.util.isAbstract
134
139
135
140
private const val RECENTS_KEY = " org.utbot.recents"
@@ -140,6 +145,9 @@ private const val WILL_BE_INSTALLED_LABEL = " (will be installed)"
140
145
private const val WILL_BE_CONFIGURED_LABEL = " (will be configured)"
141
146
private const val MINIMUM_TIMEOUT_VALUE_IN_SECONDS = 1
142
147
148
+ private const val ACTION_GENERATE = " Generate Tests"
149
+ private const val ACTION_GENERATE_AND_RUN = " Generate && Run" // Note that ampersand has to be escaped (doubled)
150
+
143
151
class GenerateTestsDialogWindow (val model : GenerateTestsModel ) : DialogWrapper(model.project) {
144
152
companion object {
145
153
const val minSupportedSdkVersion = 8
@@ -213,6 +221,8 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
213
221
twm.getToolWindow(" Event Log" )?.activate(null )
214
222
}
215
223
224
+ model.runGeneratedTestsWithCoverage = model.project.service<Settings >().runGeneratedTestsWithCoverage
225
+
216
226
init ()
217
227
}
218
228
@@ -302,7 +312,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
302
312
override fun createTitlePane (): JComponent ? {
303
313
val sdkVersion = findSdkVersion()
304
314
// TODO:SAT-1571 investigate Android Studio specific sdk issues
305
- if (sdkVersion?.feature in minSupportedSdkVersion.. maxSupportedSdkVersion || AndroidApiHelper .isAndroidStudio()) return null
315
+ if (sdkVersion?.feature in minSupportedSdkVersion.. maxSupportedSdkVersion || IntelliJApiHelper .isAndroidStudio()) return null
306
316
isOKActionEnabled = false
307
317
return SdkNotificationPanel (model, sdkVersion)
308
318
}
@@ -438,6 +448,45 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
438
448
return null
439
449
}
440
450
451
+ class OKOptionAction (val testsModel : GenerateTestsModel , val okAction : Action ) : AbstractAction(testsModel.getActionText()), OptionAction {
452
+ init {
453
+ putValue(DEFAULT_ACTION , java.lang.Boolean .TRUE )
454
+ putValue(FOCUSED_ACTION , java.lang.Boolean .TRUE )
455
+ }
456
+ private val generateAction = object : AbstractAction (ACTION_GENERATE ) {
457
+ override fun actionPerformed (e : ActionEvent ? ) {
458
+ testsModel.runGeneratedTestsWithCoverage = false
459
+ updateButtonText(e)
460
+ }
461
+ }
462
+ private val generateAndRunAction = object : AbstractAction (ACTION_GENERATE_AND_RUN ) {
463
+ override fun actionPerformed (e : ActionEvent ? ) {
464
+ testsModel.runGeneratedTestsWithCoverage = true
465
+ updateButtonText(e)
466
+ }
467
+ }
468
+
469
+ private fun updateButtonText (e : ActionEvent ? ) {
470
+ with (e?.source as JButton ) {
471
+ text = TextWithMnemonic .parse(testsModel.getActionText()).dropMnemonic().text
472
+ testsModel.project.service<Settings >().runGeneratedTestsWithCoverage =
473
+ testsModel.runGeneratedTestsWithCoverage
474
+ repaint()
475
+ }
476
+ }
477
+
478
+ override fun actionPerformed (e : ActionEvent ? ) {
479
+ okAction.actionPerformed(e)
480
+ }
481
+
482
+ override fun getOptions (): Array <Action > {
483
+ if (testsModel.runGeneratedTestsWithCoverage) return arrayOf(generateAndRunAction, generateAction)
484
+ return arrayOf(generateAction, generateAndRunAction)
485
+ }
486
+ }
487
+
488
+ private val okOptionAction: OKOptionAction get() = OKOptionAction (model, super .getOKAction())
489
+ override fun getOKAction () = okOptionAction
441
490
442
491
override fun doOKAction () {
443
492
model.testPackageName =
@@ -964,6 +1013,9 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
964
1013
}
965
1014
}
966
1015
1016
+ fun GenerateTestsModel.getActionText () : String =
1017
+ if (this .runGeneratedTestsWithCoverage) ACTION_GENERATE_AND_RUN else ACTION_GENERATE
1018
+
967
1019
private fun ComboBox<CodeGenerationSettingItem>.setHelpTooltipTextChanger (helpLabel : JBLabel ) {
968
1020
addActionListener { event ->
969
1021
val comboBox = event.source as ComboBox <* >
0 commit comments