22
33package org.utbot.intellij.plugin.ui
44
5- import org.utbot.common.PathUtil.toPath
6- import org.utbot.framework.UtSettings
7- import org.utbot.framework.codegen.ForceStaticMocking
8- import org.utbot.framework.codegen.Junit4
9- import org.utbot.framework.codegen.Junit5
10- import org.utbot.framework.codegen.NoStaticMocking
11- import org.utbot.framework.codegen.ParametrizedTestSource
12- import org.utbot.framework.codegen.StaticsMocking
13- import org.utbot.framework.codegen.TestFramework
14- import org.utbot.framework.codegen.TestNg
15- import org.utbot.framework.codegen.model.util.MOCKITO_EXTENSIONS_FILE_CONTENT
16- import org.utbot.framework.codegen.model.util.MOCKITO_EXTENSIONS_STORAGE
17- import org.utbot.framework.codegen.model.util.MOCKITO_MOCKMAKER_FILE_NAME
18- import org.utbot.framework.plugin.api.CodeGenerationSettingItem
19- import org.utbot.framework.plugin.api.CodegenLanguage
20- import org.utbot.framework.plugin.api.MockFramework
21- import org.utbot.framework.plugin.api.MockFramework.MOCKITO
22- import org.utbot.framework.plugin.api.MockStrategyApi
23- import org.utbot.framework.plugin.api.TreatOverflowAsError
24- import org.utbot.intellij.plugin.settings.Settings
25- import org.utbot.intellij.plugin.ui.components.TestFolderComboWithBrowseButton
26- import org.utbot.intellij.plugin.ui.utils.LibrarySearchScope
27- import org.utbot.intellij.plugin.ui.utils.findFrameworkLibrary
28- import org.utbot.intellij.plugin.ui.utils.getOrCreateTestResourcesPath
29- import org.utbot.intellij.plugin.ui.utils.kotlinTargetPlatform
30- import org.utbot.intellij.plugin.ui.utils.parseVersion
31- import org.utbot.intellij.plugin.ui.utils.testResourceRootTypes
32- import org.utbot.intellij.plugin.ui.utils.addSourceRootIfAbsent
33- import org.utbot.intellij.plugin.ui.utils.testRootType
5+ import com.intellij.codeInsight.hint.HintUtil
6+ import com.intellij.icons.AllIcons
347import com.intellij.ide.impl.ProjectNewWindowDoNotAskOption
358import com.intellij.openapi.application.runWriteAction
369import com.intellij.openapi.command.WriteCommandAction
3710import com.intellij.openapi.components.service
11+ import com.intellij.openapi.editor.colors.EditorColorsManager
3812import com.intellij.openapi.options.ShowSettingsUtil
13+ import com.intellij.openapi.projectRoots.JavaSdkVersion
3914import com.intellij.openapi.roots.ContentEntry
4015import com.intellij.openapi.roots.ModuleRootManager
16+ import com.intellij.openapi.roots.ui.configuration.ClasspathEditor
4117import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable
4218import com.intellij.openapi.ui.ComboBox
4319import com.intellij.openapi.ui.DialogPanel
4420import com.intellij.openapi.ui.DialogWrapper
4521import com.intellij.openapi.ui.Messages
4622import com.intellij.openapi.ui.ValidationInfo
23+ import com.intellij.openapi.ui.popup.IconButton
4724import com.intellij.openapi.util.Computable
4825import com.intellij.openapi.vfs.StandardFileSystems
4926import com.intellij.openapi.vfs.VfsUtil
@@ -61,11 +38,18 @@ import com.intellij.refactoring.util.classMembers.MemberInfo
6138import com.intellij.testIntegration.TestIntegrationUtils
6239import com.intellij.ui.ColoredListCellRenderer
6340import com.intellij.ui.ContextHelpLabel
41+ import com.intellij.ui.HyperlinkLabel
42+ import com.intellij.ui.IdeBorderFactory.createBorder
43+ import com.intellij.ui.InplaceButton
44+ import com.intellij.ui.JBColor
6445import com.intellij.ui.JBIntSpinner
46+ import com.intellij.ui.SideBorder
6547import com.intellij.ui.SimpleTextAttributes
6648import com.intellij.ui.components.CheckBox
6749import com.intellij.ui.components.JBLabel
6850import com.intellij.ui.components.Panel
51+ import com.intellij.ui.components.panels.HorizontalLayout
52+ import com.intellij.ui.components.panels.NonOpaquePanel
6953import com.intellij.ui.layout.Cell
7054import com.intellij.ui.layout.CellBuilder
7155import com.intellij.ui.layout.Row
@@ -74,9 +58,44 @@ import com.intellij.util.IncorrectOperationException
7458import com.intellij.util.io.exists
7559import com.intellij.util.lang.JavaVersion
7660import com.intellij.util.ui.JBUI
61+ import com.intellij.util.ui.JBUI.Borders.empty
62+ import com.intellij.util.ui.JBUI.Borders.merge
63+ import com.intellij.util.ui.JBUI.scale
7764import com.intellij.util.ui.JBUI.size
7865import com.intellij.util.ui.UIUtil
66+ import com.intellij.util.ui.components.BorderLayoutPanel
67+ import org.utbot.common.PathUtil.toPath
68+ import org.utbot.framework.UtSettings
69+ import org.utbot.framework.codegen.ForceStaticMocking
70+ import org.utbot.framework.codegen.Junit4
71+ import org.utbot.framework.codegen.Junit5
72+ import org.utbot.framework.codegen.NoStaticMocking
73+ import org.utbot.framework.codegen.ParametrizedTestSource
74+ import org.utbot.framework.codegen.StaticsMocking
75+ import org.utbot.framework.codegen.TestFramework
76+ import org.utbot.framework.codegen.TestNg
77+ import org.utbot.framework.codegen.model.util.MOCKITO_EXTENSIONS_FILE_CONTENT
78+ import org.utbot.framework.codegen.model.util.MOCKITO_EXTENSIONS_STORAGE
79+ import org.utbot.framework.codegen.model.util.MOCKITO_MOCKMAKER_FILE_NAME
80+ import org.utbot.framework.plugin.api.CodeGenerationSettingItem
81+ import org.utbot.framework.plugin.api.CodegenLanguage
82+ import org.utbot.framework.plugin.api.MockFramework
83+ import org.utbot.framework.plugin.api.MockFramework.MOCKITO
84+ import org.utbot.framework.plugin.api.MockStrategyApi
85+ import org.utbot.framework.plugin.api.TreatOverflowAsError
86+ import org.utbot.intellij.plugin.settings.Settings
87+ import org.utbot.intellij.plugin.ui.components.TestFolderComboWithBrowseButton
88+ import org.utbot.intellij.plugin.ui.utils.LibrarySearchScope
89+ import org.utbot.intellij.plugin.ui.utils.addSourceRootIfAbsent
90+ import org.utbot.intellij.plugin.ui.utils.findFrameworkLibrary
91+ import org.utbot.intellij.plugin.ui.utils.getOrCreateTestResourcesPath
92+ import org.utbot.intellij.plugin.ui.utils.kotlinTargetPlatform
93+ import org.utbot.intellij.plugin.ui.utils.parseVersion
94+ import org.utbot.intellij.plugin.ui.utils.testResourceRootTypes
95+ import org.utbot.intellij.plugin.ui.utils.testRootType
96+ import org.utbot.intellij.plugin.util.AndroidApiHelper
7997import java.awt.BorderLayout
98+ import java.awt.Color
8099import java.nio.file.Files
81100import java.nio.file.Path
82101import java.nio.file.Paths
@@ -98,6 +117,10 @@ private const val WILL_BE_CONFIGURED_LABEL = " (will be configured)"
98117private const val MINIMUM_TIMEOUT_VALUE_IN_SECONDS = 1
99118
100119class GenerateTestsDialogWindow (val model : GenerateTestsModel ) : DialogWrapper(model.project) {
120+ companion object {
121+ const val minSupportedSdkVersion = 8
122+ const val maxSupportedSdkVersion = 11
123+ }
101124
102125 private val membersTable = MemberSelectionTable (emptyList(), null )
103126
@@ -219,18 +242,76 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
219242 contextHelpLabel?.let { add(it, BorderLayout .LINE_END ) }
220243 })
221244
222- private fun findSdkVersion (): Int {
223- val projectSdk = ModuleRootManager .getInstance(model.testModule).sdk
224- val sdkVersion = JavaVersion .tryParse(projectSdk?.versionString)
225- ? : error(" No sdk found in ${model.testModule} " )
226- return sdkVersion.feature
245+ private fun findSdkVersion (): JavaVersion ? {
246+ val projectSdk = ModuleRootManager .getInstance(model.srcModule).sdk
247+ return JavaVersion .tryParse(projectSdk?.versionString)
248+ }
249+
250+ override fun createTitlePane (): JComponent ? {
251+ val sdkVersion = findSdkVersion()
252+ // TODO:SAT-1571 investigate Android Studio specific sdk issues
253+ if (sdkVersion?.feature in minSupportedSdkVersion.. maxSupportedSdkVersion || AndroidApiHelper .isAndroidStudio()) return null
254+ isOKActionEnabled = false
255+ return SdkNotificationPanel (model, sdkVersion)
227256 }
228257
229258 private fun findTestPackageComboValue (): String {
230259 val packageNames = model.srcClasses.map { it.packageName }.distinct()
231260 return if (packageNames.size == 1 ) packageNames.first() else SAME_PACKAGE_LABEL
232261 }
233262
263+ /* *
264+ * A panel to inform user about incorrect jdk in project.
265+ *
266+ * Note: this implementation was encouraged by NonModalCommitPromoter.
267+ */
268+ private inner class SdkNotificationPanel (
269+ private val model : GenerateTestsModel ,
270+ private val sdkVersion : JavaVersion ? ,
271+ ) : BorderLayoutPanel() {
272+ init {
273+ border = merge(empty(10 ), createBorder(JBColor .border(), SideBorder .BOTTOM ), true )
274+
275+ addToLeft(JBLabel ().apply {
276+ icon = AllIcons .Ide .FatalError
277+ text = if (sdkVersion != null ) {
278+ " SDK version $sdkVersion is not supported, use ${JavaSdkVersion .JDK_1_8 } or ${JavaSdkVersion .JDK_11 } ."
279+ } else {
280+ " SDK is not defined"
281+ }
282+ })
283+
284+ addToRight(NonOpaquePanel (HorizontalLayout (scale(12 ))).apply {
285+ add(createConfigureAction())
286+ add(createCloseAction())
287+ })
288+ }
289+
290+ override fun getBackground (): Color ? =
291+ EditorColorsManager .getInstance().globalScheme.getColor(HintUtil .ERROR_COLOR_KEY ) ? : super .getBackground()
292+
293+ private fun createConfigureAction (): JComponent =
294+ HyperlinkLabel (" Setup SDK" ).apply {
295+ addHyperlinkListener {
296+ val projectStructure = ProjectStructureConfigurable .getInstance(model.project)
297+ val isEdited = ShowSettingsUtil .getInstance().editConfigurable(model.project, projectStructure)
298+ { projectStructure.select(model.srcModule.name, ClasspathEditor .getName(), true ) }
299+
300+ val sdkVersion = findSdkVersion()
301+ val sdkFixed = isEdited && sdkVersion?.feature in minSupportedSdkVersion.. maxSupportedSdkVersion
302+ if (sdkFixed) {
303+ this @SdkNotificationPanel.isVisible = false
304+ isOKActionEnabled = true
305+ }
306+ }
307+ }
308+
309+ private fun createCloseAction (): JComponent =
310+ InplaceButton (IconButton (null , AllIcons .Actions .Close , AllIcons .Actions .CloseHovered )) {
311+ this @SdkNotificationPanel.isVisible = false
312+ }
313+ }
314+
234315 private fun updateMembersTable () {
235316 val srcClasses = model.srcClasses
236317
@@ -724,7 +805,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
724805
725806 // Will be removed after gradle-intelij-plugin version update upper than 2020.2
726807 // TestNg will be reverted after https://github.com/UnitTestBot/UTBotJava/issues/309
727- if (findSdkVersion() < 11 ) {
808+ if (findSdkVersion()?. let { it.feature < 11 } == true ) {
728809 enabledTestFrameworks = enabledTestFrameworks.filterNot { it == TestNg }
729810 }
730811
0 commit comments