@@ -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