@@ -19,6 +19,7 @@ import com.intellij.psi.PsiClass
1919import  com.intellij.psi.PsiMethod 
2020import  com.intellij.refactoring.util.classMembers.MemberInfo 
2121import  com.intellij.task.ProjectTaskManager 
22+ import  com.intellij.util.concurrency.AppExecutorUtil 
2223import  com.intellij.util.containers.nullize 
2324import  com.intellij.util.io.exists 
2425import  com.jetbrains.rd.util.lifetime.LifetimeDefinition 
@@ -61,8 +62,12 @@ object UtTestsDialogProcessor {
6162
6263    fun  updateIndicator (indicator :  ProgressIndicator , range  :  ProgressRange , text :  String?  = null, fraction :  Double?  = null) {
6364        invokeLater {
65+             if  (indicator.isCanceled) return @invokeLater
6466            text?.let  { indicator.text =  it }
65-             fraction?.let  { indicator.fraction =  indicator.fraction.coerceAtLeast(range.from +  (range.to -  range.from) *  fraction.coerceIn(0.0 , 1.0 )) }
67+             fraction?.let  {
68+                 indicator.fraction = 
69+                     indicator.fraction.coerceAtLeast(range.from +  (range.to -  range.from) *  fraction.coerceIn(0.0 , 1.0 ))
70+             }
6671            logger.debug(" Phase ${indicator.text}  with progress ${String .format(" %.2f"  " 
6772        }
6873    }
@@ -188,14 +193,12 @@ object UtTestsDialogProcessor {
188193                                    continue 
189194                                }
190195
191-                                 if  (totalClasses >  1 ) {
192-                                     updateIndicator(
193-                                         indicator,
194-                                         ProgressRange .SOLVING ,
195-                                         " Generate test cases for class $className " 
196-                                         processedClasses.toDouble() /  totalClasses
197-                                     )
198-                                 }
196+                                 updateIndicator(
197+                                     indicator,
198+                                     ProgressRange .SOLVING ,
199+                                     " Generate test cases for class $className " 
200+                                     processedClasses.toDouble() /  totalClasses
201+                                 )
199202
200203                                //  set timeout for concrete execution and for generated tests
201204                                UtSettings .concreteExecutionTimeoutInChildProcess = 
@@ -216,33 +219,50 @@ object UtTestsDialogProcessor {
216219                                withStaticsSubstitutionRequired(true ) {
217220                                    val  mockFrameworkInstalled =  model.mockFramework?.isInstalled ? :  true 
218221
219-                                     val  rdGenerateResult =  proc.generate(
220-                                         mockFrameworkInstalled,
221-                                         model.staticsMocking.isConfigured,
222-                                         model.conflictTriggers,
223-                                         methods,
224-                                         model.mockStrategy,
225-                                         model.chosenClassesToMockAlways,
226-                                         model.timeout,
227-                                         model.timeout,
228-                                         true ,
229-                                         UtSettings .useFuzzing,
230-                                         project.service<Settings >().fuzzingValue,
231-                                         searchDirectory.pathString
232-                                     )
233- 
234-                                     if  (rdGenerateResult.notEmptyCases ==  0 ) {
235-                                         if  (model.srcClasses.size >  1 ) {
236-                                             logger.error { " Failed to generate any tests cases for class $className " 
237-                                         } else  {
238-                                             showErrorDialogLater(
239-                                                 model.project,
240-                                                 errorMessage(className, secondsTimeout),
241-                                                 title =  " Failed to generate unit tests for class $className " 
222+                                     val  startTime =  System .currentTimeMillis()
223+                                     val  timerHandler = 
224+                                         AppExecutorUtil .getAppScheduledExecutorService().scheduleWithFixedDelay({
225+                                             val  innerTimeoutRatio = 
226+                                                 ((System .currentTimeMillis() -  startTime).toDouble() /  model.timeout)
227+                                                     .coerceIn(0.0 , 1.0 )
228+                                             updateIndicator(
229+                                                 indicator,
230+                                                 ProgressRange .SOLVING ,
231+                                                 " Generate test cases for class $className " 
232+                                                 (processedClasses.toDouble() +  innerTimeoutRatio) /  totalClasses
242233                                            )
234+                                         }, 0 , 500 , TimeUnit .MILLISECONDS )
235+                                     try  {
236+                                         val  rdGenerateResult =  proc.generate(
237+                                             mockFrameworkInstalled,
238+                                             model.staticsMocking.isConfigured,
239+                                             model.conflictTriggers,
240+                                             methods,
241+                                             model.mockStrategy,
242+                                             model.chosenClassesToMockAlways,
243+                                             model.timeout,
244+                                             model.timeout,
245+                                             true ,
246+                                             UtSettings .useFuzzing,
247+                                             project.service<Settings >().fuzzingValue,
248+                                             searchDirectory.pathString
249+                                         )
250+ 
251+                                         if  (rdGenerateResult.notEmptyCases ==  0 ) {
252+                                             if  (model.srcClasses.size >  1 ) {
253+                                                 logger.error { " Failed to generate any tests cases for class $className " 
254+                                             } else  {
255+                                                 showErrorDialogLater(
256+                                                     model.project,
257+                                                     errorMessage(className, secondsTimeout),
258+                                                     title =  " Failed to generate unit tests for class $className " 
259+                                                 )
260+                                             }
261+                                         } else  {
262+                                             testSetsByClass[srcClass] =  rdGenerateResult
243263                                        }
244-                                     } else  {
245-                                         testSetsByClass[srcClass]  =  rdGenerateResult 
264+                                     } finally  {
265+                                         timerHandler.cancel( true ) 
246266                                    }
247267                                }
248268                                processedClasses++ 
0 commit comments