@@ -19,6 +19,7 @@ import com.intellij.psi.PsiClass
19
19
import com.intellij.psi.PsiMethod
20
20
import com.intellij.refactoring.util.classMembers.MemberInfo
21
21
import com.intellij.task.ProjectTaskManager
22
+ import com.intellij.util.concurrency.AppExecutorUtil
22
23
import com.intellij.util.containers.nullize
23
24
import com.intellij.util.io.exists
24
25
import com.jetbrains.rd.util.lifetime.LifetimeDefinition
@@ -61,8 +62,12 @@ object UtTestsDialogProcessor {
61
62
62
63
fun updateIndicator (indicator : ProgressIndicator , range : ProgressRange , text : String? = null, fraction : Double? = null) {
63
64
invokeLater {
65
+ if (indicator.isCanceled) return @invokeLater
64
66
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
+ }
66
71
logger.debug(" Phase ${indicator.text} with progress ${String .format(" %.2f" ,indicator.fraction)} " )
67
72
}
68
73
}
@@ -188,14 +193,12 @@ object UtTestsDialogProcessor {
188
193
continue
189
194
}
190
195
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
+ )
199
202
200
203
// set timeout for concrete execution and for generated tests
201
204
UtSettings .concreteExecutionTimeoutInChildProcess =
@@ -216,33 +219,50 @@ object UtTestsDialogProcessor {
216
219
withStaticsSubstitutionRequired(true ) {
217
220
val mockFrameworkInstalled = model.mockFramework?.isInstalled ? : true
218
221
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
242
233
)
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
243
263
}
244
- } else {
245
- testSetsByClass[srcClass] = rdGenerateResult
264
+ } finally {
265
+ timerHandler.cancel( true )
246
266
}
247
267
}
248
268
processedClasses++
0 commit comments