From ff6f2cd856f57484507821eee5a9430e9e2460a8 Mon Sep 17 00:00:00 2001 From: Ivan Volkov Date: Tue, 19 Jul 2022 15:19:36 +0300 Subject: [PATCH] Skip test generation for abstract methods #550 --- .../org/utbot/cli/GenerateTestsCommand.kt | 1 + .../plugin/generator/UtTestsDialogProcessor.kt | 17 +++++++++++------ .../plugin/ui/GenerateTestsDialogWindow.kt | 3 +++ .../intellij/plugin/util/MemberInfoUtils.kt | 8 ++++++++ .../main/kotlin/org/utbot/contest/Contest.kt | 1 + 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/MemberInfoUtils.kt diff --git a/utbot-cli/src/main/kotlin/org/utbot/cli/GenerateTestsCommand.kt b/utbot-cli/src/main/kotlin/org/utbot/cli/GenerateTestsCommand.kt index b738f57eae..2d926d674b 100644 --- a/utbot-cli/src/main/kotlin/org/utbot/cli/GenerateTestsCommand.kt +++ b/utbot-cli/src/main/kotlin/org/utbot/cli/GenerateTestsCommand.kt @@ -96,6 +96,7 @@ class GenerateTestsCommand : val classUnderTest: KClass<*> = loadClassBySpecifiedFqn(targetClassFqn) val targetMethods = classUnderTest.targetMethods() .filterWhen(UtSettings.skipTestGenerationForSyntheticMethods) { !isKnownSyntheticMethod(it) } + .filterNot { it.callable.isAbstract } val testCaseGenerator = initializeGenerator(workingDirectory) if (targetMethods.isEmpty()) { diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt index 780056b1b4..ddff6e931a 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt @@ -19,6 +19,7 @@ import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.Computable import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiClass +import com.intellij.psi.PsiModifier import com.intellij.psi.SyntheticElement import com.intellij.refactoring.util.classMembers.MemberInfo import com.intellij.testIntegration.TestIntegrationUtils @@ -54,6 +55,7 @@ import org.utbot.common.filterWhen import org.utbot.engine.util.mockListeners.ForceStaticMockListener import org.utbot.framework.plugin.api.testFlow import org.utbot.intellij.plugin.settings.Settings +import org.utbot.intellij.plugin.util.isAbstract import kotlin.reflect.KClass import kotlin.reflect.full.functions @@ -152,6 +154,7 @@ object UtTestsDialogProcessor { .filterWhen(UtSettings.skipTestGenerationForSyntheticMethods) { it.member !is SyntheticElement } + .filterNot { it.isAbstract } DumbService.getInstance(project).runReadActionInSmartMode(Computable { findMethodsInClassMatchingSelected(clazz, srcMethods) }) @@ -189,9 +192,10 @@ object UtTestsDialogProcessor { ForceStaticMockListener.create(testCaseGenerator, model.conflictTriggers) } - val notEmptyCases = withUtContext(context) { - testCaseGenerator - .generate( + val notEmptyCases = runCatching { + withUtContext(context) { + testCaseGenerator + .generate( methods, model.mockStrategy, model.chosenClassesToMockAlways, @@ -203,9 +207,10 @@ object UtTestsDialogProcessor { fuzzingValue = project.service().fuzzingValue } ) - .map { it.summarize(searchDirectory) } - .filterNot { it.executions.isEmpty() && it.errors.isEmpty() } - } + .map { it.summarize(searchDirectory) } + .filterNot { it.executions.isEmpty() && it.errors.isEmpty() } + } + }.getOrDefault(listOf()) if (notEmptyCases.isEmpty()) { showErrorDialogLater( diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt index 4a5f41709a..c474e9b8ab 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt @@ -40,6 +40,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiManager import com.intellij.psi.PsiMethod import com.intellij.psi.SyntheticElement +import com.intellij.psi.PsiModifier import com.intellij.refactoring.PackageWrapper import com.intellij.refactoring.ui.MemberSelectionTable import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo @@ -129,6 +130,7 @@ import javax.swing.JComponent import javax.swing.JList import javax.swing.JPanel import kotlin.streams.toList +import org.utbot.intellij.plugin.util.isAbstract private const val RECENTS_KEY = "org.utbot.recents" @@ -372,6 +374,7 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m if (srcClasses.size == 1) { items = TestIntegrationUtils.extractClassMethods(srcClasses.single(), false) .filterWhen(UtSettings.skipTestGenerationForSyntheticMethods) { it.member !is SyntheticElement } + .filterNot { it.isAbstract } updateMethodsTable(items) } else { items = srcClasses.map { MemberInfo(it) } diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/MemberInfoUtils.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/MemberInfoUtils.kt new file mode 100644 index 0000000000..912b99f05e --- /dev/null +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/MemberInfoUtils.kt @@ -0,0 +1,8 @@ +package org.utbot.intellij.plugin.util + +import com.intellij.psi.PsiModifier +import com.intellij.psi.PsiModifierListOwner +import com.intellij.refactoring.classMembers.MemberInfoBase + +val MemberInfoBase.isAbstract: Boolean + get() = this.member.modifierList?.hasModifierProperty(PsiModifier.ABSTRACT)?: false \ No newline at end of file diff --git a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt index 0a2d36f670..76cddd1633 100644 --- a/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt +++ b/utbot-junit-contest/src/main/kotlin/org/utbot/contest/Contest.kt @@ -442,6 +442,7 @@ private fun prepareClass(kotlinClass: KClass<*>, methodNameFilter: String?): Lis .filter { methodNameFilter?.equals(it.callable.name) ?: true } .filterNot { it.isConstructor && (it.clazz.isAbstract || it.clazz.java.isEnum) } .filterWhen(UtSettings.skipTestGenerationForSyntheticMethods) { !isKnownSyntheticMethod(it) } + .filterNot { it.callable.isAbstract } .toList() return if (kotlinClass.nestedClasses.isEmpty()) {