@@ -36,33 +36,37 @@ import org.usvm.instrumentation.testcase.api.UTestStringExpression
3636import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
3737import org.utbot.framework.plugin.api.ExecutableId
3838import org.utbot.framework.plugin.api.FieldId
39+ import org.utbot.framework.plugin.api.MethodId
3940import org.utbot.framework.plugin.api.UtArrayModel
4041import org.utbot.framework.plugin.api.UtAssembleModel
4142import org.utbot.framework.plugin.api.UtClassRefModel
4243import org.utbot.framework.plugin.api.UtCompositeModel
4344import org.utbot.framework.plugin.api.UtExecutableCallModel
4445import org.utbot.framework.plugin.api.UtInstrumentation
4546import org.utbot.framework.plugin.api.UtModel
47+ import org.utbot.framework.plugin.api.UtNewInstanceInstrumentation
4648import org.utbot.framework.plugin.api.UtNullModel
4749import org.utbot.framework.plugin.api.UtPrimitiveModel
50+ import org.utbot.framework.plugin.api.UtStaticMethodInstrumentation
4851import org.utbot.framework.plugin.api.util.classClassId
4952import org.utbot.framework.plugin.api.util.objectClassId
53+ import org.utbot.framework.plugin.api.util.voidClassId
5054import org.utbot.fuzzer.IdGenerator
5155
5256class UTestInstToUtModelConverter (
53- private val idGenerator : IdGenerator < Int > ,
57+ private val uTest : UTest ,
5458 private val jcClasspath : JcClasspath ,
59+ private val idGenerator : IdGenerator <Int >,
5560 private val utilMethodProvider : UtilMethodProvider ,
5661) {
5762 private val exprToModelCache = mutableMapOf<UTestExpression , UtModel >()
5863 private val instrumentations = mutableListOf<UtInstrumentation >()
5964
60- fun processUTest (uTest : UTest ) {
61- exprToModelCache.clear()
62- instrumentations.clear()
63-
65+ fun processUTest (): UTestAnalysisResult {
6466 uTest.initStatements.forEach { uInst -> processInst(uInst) }
6567 removeInstantiationCallFromThisInstanceModificationChain(processExpr(uTest.callMethodExpression))
68+
69+ return UTestAnalysisResult (instrumentations)
6670 }
6771
6872 fun findModelByInst (expr : UTestExpression ): UtModel {
@@ -301,7 +305,43 @@ class UTestInstToUtModelConverter(
301305 }
302306
303307 is UTestGlobalMock -> {
304- // TODO usvm-sbft: collect instrumentations here
308+ val methodsToExprs = uTestExpr.methods.entries
309+ val initMethodExprs = methodsToExprs.filter { it.key.isConstructor }
310+ val otherMethodsExprs = methodsToExprs.minus(initMethodExprs.toSet())
311+
312+ otherMethodsExprs
313+ .forEach { (jcMethod, uTestExprs) ->
314+ val methodId = jcMethod.toExecutableId(jcClasspath) as MethodId
315+ val valueModels = uTestExprs.map { expr -> processExpr(expr) }
316+ val methodInstrumentation = UtStaticMethodInstrumentation (
317+ methodId = methodId,
318+ values = valueModels,
319+ )
320+
321+ instrumentations + = methodInstrumentation
322+ }
323+
324+ initMethodExprs
325+ .forEach { (jcMethod, uTestExprs) ->
326+ // TODO usvm-sbft-merge: it can be .map { expr -> processExpr(expr) } here
327+ // However, there's no special treatment for cases when <init> method occurs in a global mock
328+ val valueModels = uTestExprs.map { _ -> UtCompositeModel (
329+ id= idGenerator.createId(),
330+ classId = voidClassId,
331+ isMock = true ,
332+ )
333+ }
334+ val methodInstrumentation = UtNewInstanceInstrumentation (
335+ classId = jcMethod.enclosingClass.classId,
336+ instances = valueModels,
337+ // [UTestGlobalMock] does not have an equivalent of [callSites],
338+ // but it is used only in UtBot instrumentation. We use USVM one, so it is not a problem.
339+ callSites = emptySet(),
340+ )
341+
342+ instrumentations + = methodInstrumentation
343+ }
344+
305345 // UtClassRefModel is returned here for consistency with [Descriptor2ValueConverter]
306346 // which returns Class<*> instance for [UTestGlobalMock] descriptors.
307347 UtClassRefModel (
@@ -320,4 +360,8 @@ class UTestInstToUtModelConverter(
320360 is UTestArrayLengthExpression -> error(" This expression type is not supported" )
321361 }
322362 }
323- }
363+ }
364+
365+ data class UTestAnalysisResult (
366+ val instrumentation : List <UtInstrumentation >,
367+ )
0 commit comments