Skip to content

Commit fb0196e

Browse files
authored
Fixed wrong assertions for lambda fields (#1101)
* Fixed UtLambdaModel caching * Fixed NPE in super class name for Object in resolver
1 parent ee4bcd3 commit fb0196e

File tree

3 files changed

+52
-12
lines changed

3 files changed

+52
-12
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ object UtVoidModel : UtModel(voidClassId)
339339
* Model for enum constant
340340
*/
341341
data class UtEnumConstantModel(
342-
override val id: Int?,
342+
override val id: Int,
343343
override val classId: ClassId,
344344
val value: Enum<*>
345345
) : UtReferenceModel(id, classId) {
@@ -351,7 +351,7 @@ data class UtEnumConstantModel(
351351
* Model for class reference
352352
*/
353353
data class UtClassRefModel(
354-
override val id: Int?,
354+
override val id: Int,
355355
override val classId: ClassId,
356356
val value: Class<*>
357357
) : UtReferenceModel(id, classId) {
@@ -455,9 +455,7 @@ data class UtArrayModel(
455455
return true
456456
}
457457

458-
override fun hashCode(): Int {
459-
return id
460-
}
458+
override fun hashCode(): Int = id
461459
}
462460

463461
/**
@@ -524,9 +522,7 @@ data class UtAssembleModel private constructor(
524522
return id == other.id
525523
}
526524

527-
override fun hashCode(): Int {
528-
return id ?: 0
529-
}
525+
override fun hashCode(): Int = id ?: 0
530526
}
531527

532528
/**
@@ -554,7 +550,7 @@ data class UtAssembleModel private constructor(
554550
*/
555551
// TODO: what about support for Kotlin lambdas and function types? See https://github.com/UnitTestBot/UTBotJava/issues/852
556552
class UtLambdaModel(
557-
override val id: Int?,
553+
override val id: Int,
558554
val samType: ClassId,
559555
val declaringClass: ClassId,
560556
val lambdaName: String,
@@ -569,6 +565,19 @@ class UtLambdaModel(
569565
?: error("More than one method with name $lambdaName found in class: ${declaringClass.canonicalName}")
570566

571567
override fun toString(): String = "Anonymous function $lambdaName implementing functional interface $declaringClass"
568+
569+
override fun equals(other: Any?): Boolean {
570+
if (this === other) return true
571+
if (javaClass != other?.javaClass) return false
572+
573+
other as UtLambdaModel
574+
575+
if (id != other.id) return false
576+
577+
return true
578+
}
579+
580+
override fun hashCode(): Int = id
572581
}
573582

574583
/**

utbot-framework-api/src/main/kotlin/org/utbot/framework/process/OpenModulesContainer.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,33 @@ object OpenModulesContainer {
1515
openPackage("java.base", "java.lang")
1616
openPackage("java.base", "java.lang.reflect")
1717
openPackage("java.base", "sun.security.provider")
18+
openPackage("java.base", "jdk.internal.event")
19+
openPackage("java.base", "jdk.internal.jimage")
20+
openPackage("java.base", "jdk.internal.jimage.decompressor")
21+
openPackage("java.base", "jdk.internal.jmod")
22+
openPackage("java.base", "jdk.internal.jtrfs")
23+
openPackage("java.base", "jdk.internal.loader")
24+
openPackage("java.base", "jdk.internal.logger")
25+
openPackage("java.base", "jdk.internal.math")
26+
openPackage("java.base", "jdk.internal.misc")
27+
openPackage("java.base", "jdk.internal.module")
28+
openPackage("java.base", "jdk.internal.org.objectweb.asm.commons")
29+
openPackage("java.base", "jdk.internal.org.objectweb.asm.signature")
30+
openPackage("java.base", "jdk.internal.org.objectweb.asm.tree")
31+
openPackage("java.base", "jdk.internal.org.objectweb.asm.tree.analysis")
32+
openPackage("java.base", "jdk.internal.org.objectweb.asm.util")
33+
openPackage("java.base", "jdk.internal.org.xml.sax")
34+
openPackage("java.base", "jdk.internal.org.xml.sax.helpers")
35+
openPackage("java.base", "jdk.internal.perf")
36+
openPackage("java.base", "jdk.internal.platform")
37+
openPackage("java.base", "jdk.internal.ref")
38+
openPackage("java.base", "jdk.internal.reflect")
39+
openPackage("java.base", "jdk.internal.util")
40+
openPackage("java.base", "jdk.internal.util.jar")
41+
openPackage("java.base", "jdk.internal.util.xml")
42+
openPackage("java.base", "jdk.internal.util.xml.impl")
43+
openPackage("java.base", "jdk.internal.vm")
44+
openPackage("java.base", "jdk.internal.vm.annotation")
1845
add("--illegal-access=warn")
1946
}
2047
}

utbot-framework/src/main/kotlin/org/utbot/engine/Resolver.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -662,12 +662,15 @@ class Resolver(
662662
builder.toString()
663663
}
664664

665-
return UtLambdaModel(
665+
val lambdaModel = UtLambdaModel(
666666
id = addr,
667667
samType = samType,
668668
declaringClass = declaringClass.id,
669669
lambdaName = lambdaName
670670
)
671+
addConstructedModel(addr, lambdaModel)
672+
673+
return lambdaModel
671674
}
672675

673676
private fun constructEnum(addr: Address, type: RefType, clazz: Class<*>): UtEnumConstantModel {
@@ -1136,12 +1139,13 @@ fun Traverser.toMethodResult(value: Any?, sootType: Type): MethodResult {
11361139
else -> {
11371140
workaround(RUN_CONCRETE) {
11381141
val className = value.javaClass.id.name
1139-
val superclassName = value.javaClass.superclass.name
1142+
val superClass = value.javaClass.superclass
11401143

11411144
val refTypeName = when {
11421145
// hardcoded string is used cause class is not public
11431146
className in typesOfObjectsToRecreate -> className
1144-
superclassName == PrintStream::class.qualifiedName -> superclassName
1147+
// superClass is null for Object class
1148+
superClass != null && superClass.name == PrintStream::class.qualifiedName -> superClass.name
11451149
// we want to generate an unbounded symbolic variable for every unknown class as well
11461150
else -> workaround(MAKE_SYMBOLIC) { className }
11471151
}

0 commit comments

Comments
 (0)