Skip to content

Commit 398edf1

Browse files
EgorkaKulikovvolivan239
authored andcommitted
Enum classes are instantiated correctly if some methods are overriden
1 parent 4d0973c commit 398edf1

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

utbot-framework-test/src/test/kotlin/org/utbot/examples/enums/ComplexEnumExamplesTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.utbot.examples.enums
22

3-
import org.junit.jupiter.api.Disabled
43
import org.junit.jupiter.api.Test
54
import org.utbot.examples.enums.ComplexEnumExamples.Color
65
import org.utbot.examples.enums.ComplexEnumExamples.Color.BLUE
@@ -75,7 +74,6 @@ class ComplexEnumExamplesTest : UtValueTestCaseChecker(
7574
}
7675

7776
@Test
78-
@Disabled("TODO: nested anonymous classes are not supported: https://github.com/UnitTestBot/UTBotJava/issues/617")
7977
fun testFindState() {
8078
check(
8179
ComplexEnumExamples::findState,

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgStatementConstructor.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ import org.utbot.framework.plugin.api.util.fieldClassId
6363
import org.utbot.framework.plugin.api.util.isPrimitive
6464
import org.utbot.framework.plugin.api.util.methodClassId
6565
import org.utbot.framework.plugin.api.util.denotableType
66+
import org.utbot.framework.plugin.api.util.id
67+
import org.utbot.framework.plugin.api.util.isEnum
6668
import org.utbot.framework.plugin.api.util.supertypeOfAnonymousClass
6769
import java.lang.reflect.Constructor
6870
import java.lang.reflect.Method
@@ -500,11 +502,13 @@ internal class CgStatementConstructorImpl(context: CgContext) :
500502
}
501503

502504
private fun guardEnumConstantAccess(access: CgEnumConstantAccess): ExpressionWithType {
503-
val (enumClass, constant) = access
505+
val (enumAccessClass, constant) = access
504506

505-
return if (enumClass.isAccessibleFrom(testClassPackageName)) {
506-
ExpressionWithType(enumClass, access)
507+
return if (enumAccessClass.isAccessibleFrom(testClassPackageName)) {
508+
ExpressionWithType(enumAccessClass, access)
507509
} else {
510+
val enumClass: ClassId =
511+
if (enumAccessClass.isEnum) enumAccessClass else enumAccessClass.outerClass!!.id
508512
val enumClassVariable = newVar(classCgClassId) {
509513
classClassId[forName](enumClass.name)
510514
}

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgVariableConstructor.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import org.utbot.framework.plugin.api.util.findFieldByIdOrNull
5858
import org.utbot.framework.plugin.api.util.id
5959
import org.utbot.framework.plugin.api.util.intClassId
6060
import org.utbot.framework.plugin.api.util.isArray
61+
import org.utbot.framework.plugin.api.util.isEnum
6162
import org.utbot.framework.plugin.api.util.isPrimitiveWrapperOrString
6263
import org.utbot.framework.plugin.api.util.isStatic
6364
import org.utbot.framework.plugin.api.util.stringClassId
@@ -445,8 +446,15 @@ open class CgVariableConstructor(val context: CgContext) :
445446
}
446447

447448
private fun constructEnumConstant(model: UtEnumConstantModel, baseName: String?): CgVariable {
448-
return newVar(model.classId, baseName) {
449-
CgEnumConstantAccess(model.classId, model.value.name)
449+
val classId = model.classId
450+
451+
require(classId.isEnum ||
452+
classId.isAnonymous && classId.outerClass?.isEnum == true) {
453+
"Enum constant model $model should be a enum or an anonymous class that overrides enum methods"
454+
}
455+
456+
return newVar(classId, baseName) {
457+
CgEnumConstantAccess(classId, model.value.name)
450458
}
451459
}
452460

0 commit comments

Comments
 (0)