diff --git a/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/IdUtil.kt b/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/IdUtil.kt index 43ce904871..c79d8b98f7 100644 --- a/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/IdUtil.kt +++ b/utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/IdUtil.kt @@ -405,6 +405,9 @@ val ClassId.isEnum: Boolean val ClassId.isData: Boolean get() = kClass.isData +val ClassId.enumConstants: List>? + get() = jClass.enumConstants?.filterIsInstance>() + fun ClassId.findFieldByIdOrNull(fieldId: FieldId): Field? { if (isNotSubtypeOf(fieldId.declaringClass)) { return null diff --git a/utbot-framework-test/src/test/kotlin/org/utbot/examples/enums/ClassWithEnumTest.kt b/utbot-framework-test/src/test/kotlin/org/utbot/examples/enums/ClassWithEnumTest.kt index 21bd1f33bb..8e029877ea 100644 --- a/utbot-framework-test/src/test/kotlin/org/utbot/examples/enums/ClassWithEnumTest.kt +++ b/utbot-framework-test/src/test/kotlin/org/utbot/examples/enums/ClassWithEnumTest.kt @@ -12,6 +12,7 @@ import org.utbot.testcheckers.withPushingStateFromPathSelectorForConcrete import org.utbot.testcheckers.withoutConcrete import org.utbot.testing.DoNotCalculate import org.utbot.testing.UtValueTestCaseChecker +import org.utbot.testing.ignoreExecutionsNumber import org.utbot.testing.isException class ClassWithEnumTest : UtValueTestCaseChecker(testClass = ClassWithEnum::class) { @@ -36,7 +37,7 @@ class ClassWithEnumTest : UtValueTestCaseChecker(testClass = ClassWithEnum::clas fun testDifficultIfBranch() { check( ClassWithEnum::useEnumInDifficultIf, - eq(2), + ignoreExecutionsNumber, { s, r -> s.equals("TRYIF", ignoreCase = true) && r == 1 }, { s, r -> !s.equals("TRYIF", ignoreCase = true) && r == 2 }, ) @@ -168,7 +169,7 @@ class ClassWithEnumTest : UtValueTestCaseChecker(testClass = ClassWithEnum::clas withPushingStateFromPathSelectorForConcrete { check( ClassWithEnum::implementingInterfaceEnumInDifficultBranch, - eq(2), + ignoreExecutionsNumber, { s, r -> s.equals("SUCCESS", ignoreCase = true) && r == 0 }, { s, r -> !s.equals("SUCCESS", ignoreCase = true) && r == 2 }, ) diff --git a/utbot-framework/src/main/kotlin/org/utbot/engine/Extensions.kt b/utbot-framework/src/main/kotlin/org/utbot/engine/Extensions.kt index 298046fa99..5e7040238d 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/engine/Extensions.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/engine/Extensions.kt @@ -68,6 +68,7 @@ import java.util.concurrent.ConcurrentHashMap import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.persistentHashMapOf import org.utbot.engine.types.OBJECT_TYPE +import org.utbot.framework.plugin.api.util.enumConstants val JIdentityStmt.lines: String get() = tags.joinToString { "$it" } @@ -287,6 +288,9 @@ val Type.defaultSymValue: UtExpression val SootField.fieldId: FieldId get() = FieldId(declaringClass.id, name) +val SootField.isEnumConstant: Boolean + get() = name in declaringClass.id.enumConstants.orEmpty().map { enum -> enum.name } + val UtSort.defaultValue: UtExpression get() = when (this) { UtByteSort -> mkByte(0) diff --git a/utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt b/utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt index dd41bbe450..179230cc62 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt @@ -1950,6 +1950,8 @@ class Traverser( !Modifier.isSynthetic(field.modifiers) && // we don't want to set fields that cannot be set via reflection anyway !field.fieldId.isInaccessibleViaReflection && + // we should not manually set enum constants + !(field.declaringClass.isEnum && field.isEnumConstant) && // we don't want to set fields from library classes !workaround(IGNORE_STATICS_FROM_TRUSTED_LIBRARIES) { ignoreStaticsFromTrustedLibraries && field.declaringClass.isFromTrustedLibrary() diff --git a/utbot-sample/src/main/java/org/utbot/examples/enums/ClassWithEnum.java b/utbot-sample/src/main/java/org/utbot/examples/enums/ClassWithEnum.java index 14a0ded3fc..c8d472781d 100644 --- a/utbot-sample/src/main/java/org/utbot/examples/enums/ClassWithEnum.java +++ b/utbot-sample/src/main/java/org/utbot/examples/enums/ClassWithEnum.java @@ -228,7 +228,7 @@ boolean affectSystemStaticAndInitEnumFromItAndGetItFromEnumFun() { enum OuterStaticUsageEnum { A; - int y; + final int y; OuterStaticUsageEnum() { y = staticInt; @@ -237,5 +237,11 @@ enum OuterStaticUsageEnum { int getOuterStatic() { return staticInt; } + + + @Override + public String toString() { + return String.format("%s(y = %d)", name(), y); + } } }