@@ -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" ,indicator.fraction)} " )
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