@@ -38,13 +38,18 @@ import com.intellij.openapi.application.runWriteAction
3838import com.intellij.openapi.command.WriteCommandAction
3939import com.intellij.openapi.components.service
4040import com.intellij.openapi.editor.colors.EditorColorsManager
41+ import com.intellij.openapi.module.Module
4142import com.intellij.openapi.options.ShowSettingsUtil
4243import com.intellij.openapi.projectRoots.JavaSdkVersion
4344import com.intellij.openapi.roots.ContentEntry
4445import com.intellij.openapi.roots.DependencyScope
4546import com.intellij.openapi.roots.ExternalLibraryDescriptor
4647import com.intellij.openapi.roots.JavaProjectModelModificationService
48+ import com.intellij.openapi.roots.LibraryOrderEntry
49+ import com.intellij.openapi.roots.ModifiableRootModel
4750import com.intellij.openapi.roots.ModuleRootManager
51+ import com.intellij.openapi.roots.ModuleRootModificationUtil
52+ import com.intellij.openapi.roots.ModuleSourceOrderEntry
4853import com.intellij.openapi.roots.ui.configuration.ClasspathEditor
4954import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable
5055import com.intellij.openapi.ui.ComboBox
@@ -111,6 +116,8 @@ import javax.swing.JComponent
111116import javax.swing.JList
112117import javax.swing.JPanel
113118import kotlin.streams.toList
119+ import org.jetbrains.concurrency.thenRun
120+ import org.utbot.intellij.plugin.ui.utils.allLibraries
114121
115122private const val RECENTS_KEY = " org.utbot.recents"
116123
@@ -642,7 +649,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
642649 }
643650
644651 selectedTestFramework.isInstalled = true
645- addDependency(libraryDescriptor)
652+ addDependency(model.testModule, libraryDescriptor)
646653 .onError { selectedTestFramework.isInstalled = false }
647654 }
648655
@@ -663,7 +670,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
663670 val versionInProject = libraryInProject?.libraryName?.parseVersion()
664671
665672 selectedMockFramework.isInstalled = true
666- addDependency(mockitoCoreLibraryDescriptor(versionInProject))
673+ addDependency(model.testModule, mockitoCoreLibraryDescriptor(versionInProject))
667674 .onError { selectedMockFramework.isInstalled = false }
668675 }
669676
@@ -701,11 +708,34 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
701708 * Note that version restrictions will be applied only if they are present on target machine
702709 * Otherwise latest release version will be installed.
703710 */
704- private fun addDependency (libraryDescriptor : ExternalLibraryDescriptor ): Promise <Void > {
705- return JavaProjectModelModificationService
711+ private fun addDependency (module : Module , libraryDescriptor : ExternalLibraryDescriptor ): Promise <Void > {
712+ val promise = JavaProjectModelModificationService
706713 .getInstance(model.project)
707714 // this method returns JetBrains internal Promise that is difficult to deal with, but it is our way
708715 .addDependency(model.testModule, libraryDescriptor, DependencyScope .TEST )
716+ promise.thenRun {
717+ module.allLibraries()
718+ .lastOrNull { library -> library.libraryName == libraryDescriptor.presentableName }?.let {
719+ ModuleRootModificationUtil .updateModel(module) { model -> placeEntryToCorrectPlace(model, it) }
720+ }
721+ }
722+ return promise
723+ }
724+
725+ /* *
726+ * Reorders library list to unsure that just added library with proper version is listed prior to old-versioned one
727+ */
728+ private fun placeEntryToCorrectPlace (model : ModifiableRootModel , addedEntry : LibraryOrderEntry ) {
729+ val order = model.orderEntries
730+ val lastEntry = order.last()
731+ if (lastEntry is LibraryOrderEntry && lastEntry.library == addedEntry.library) {
732+ val insertionPoint = order.indexOfFirst { it is ModuleSourceOrderEntry } + 1
733+ if (insertionPoint > 0 ) {
734+ System .arraycopy(order, insertionPoint, order, insertionPoint + 1 , order.size - 1 - insertionPoint)
735+ order[insertionPoint] = lastEntry
736+ model.rearrangeOrderEntries(order)
737+ }
738+ }
709739 }
710740
711741 private fun createMockFrameworkNotificationDialog () = Messages .showYesNoDialog(
0 commit comments