Skip to content

Commit 2a9918c

Browse files
Progress bar shows the progress stepwise and incorrectly #1196
Add inner smooth animation for every class
1 parent 7ca87d0 commit 2a9918c

File tree

1 file changed

+54
-34
lines changed

1 file changed

+54
-34
lines changed

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt

+54-34
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.intellij.psi.PsiClass
1919
import com.intellij.psi.PsiMethod
2020
import com.intellij.refactoring.util.classMembers.MemberInfo
2121
import com.intellij.task.ProjectTaskManager
22+
import com.intellij.util.concurrency.AppExecutorUtil
2223
import com.intellij.util.containers.nullize
2324
import com.intellij.util.io.exists
2425
import 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

Comments
 (0)