1+ package org.utbot.framework.codegen.tree
2+
3+ import org.utbot.framework.codegen.domain.UtModelWrapper
4+ import org.utbot.framework.codegen.domain.builtin.injectMocksClassId
5+ import org.utbot.framework.codegen.domain.builtin.mockClassId
6+ import org.utbot.framework.codegen.domain.context.CgContext
7+ import org.utbot.framework.codegen.domain.context.CgContextOwner
8+ import org.utbot.framework.codegen.domain.models.CgValue
9+ import org.utbot.framework.codegen.domain.models.CgVariable
10+ import org.utbot.framework.plugin.api.ClassId
11+ import org.utbot.framework.plugin.api.UtAssembleModel
12+ import org.utbot.framework.plugin.api.UtCompositeModel
13+ import org.utbot.framework.plugin.api.UtModel
14+ import org.utbot.framework.plugin.api.isMockModel
15+ import org.utbot.framework.plugin.api.util.SpringModelUtils.autowiredClassId
16+ import org.utbot.framework.plugin.api.util.SpringModelUtils.isAutowiredFromContext
17+
18+ sealed interface CgClassFieldManager : CgContextOwner {
19+
20+ val annotationType: ClassId
21+
22+ fun constructVariableForField (model : UtModel , modelVariable : CgValue ): CgValue
23+ }
24+
25+ abstract class CgClassFieldManagerImpl (context : CgContext ) :
26+ CgClassFieldManager ,
27+ CgContextOwner by context {
28+
29+ val variableConstructor: CgSpringVariableConstructor by lazy {
30+ CgComponents .getVariableConstructorBy(context) as CgSpringVariableConstructor
31+ }
32+ }
33+
34+ class CgInjectingMocksFieldsManager (val context : CgContext ) : CgClassFieldManagerImpl(context) {
35+
36+ override val annotationType = injectMocksClassId
37+
38+ override fun constructVariableForField (model : UtModel , modelVariable : CgValue ): CgValue {
39+ val modelFields = when (model) {
40+ is UtCompositeModel -> model.fields
41+ is UtAssembleModel -> model.origin?.fields
42+ else -> null
43+ }
44+
45+ modelFields?.forEach { (fieldId, fieldModel) ->
46+ // creating variables for modelVariable fields
47+ val variableForField = variableConstructor.getOrCreateVariable(fieldModel)
48+
49+ // If field model is a mock, it is set in the connected with instance under test automatically via @InjectMocks;
50+ // Otherwise we need to set this field manually.
51+ if (! fieldModel.isMockModel()) {
52+ variableConstructor.setFieldValue(modelVariable, fieldId, variableForField)
53+ }
54+ }
55+
56+ return modelVariable
57+ }
58+
59+ }
60+
61+ class CgMockedFieldsManager (context : CgContext ) : CgClassFieldManagerImpl(context) {
62+
63+ override val annotationType = mockClassId
64+
65+ override fun constructVariableForField (model : UtModel , modelVariable : CgValue ): CgValue {
66+ if (model.isMockModel()) {
67+ variableConstructor.mockFrameworkManager.createMockForVariable(
68+ model as UtCompositeModel ,
69+ modelVariable as CgVariable ,
70+ )
71+ }
72+ return modelVariable
73+ }
74+
75+ }
76+
77+ class CgAutowiredFieldsManager (context : CgContext ) : CgClassFieldManagerImpl(context) {
78+
79+ override val annotationType = autowiredClassId
80+
81+ override fun constructVariableForField (model : UtModel , modelVariable : CgValue ): CgValue {
82+ return when {
83+ model.isAutowiredFromContext() -> {
84+ variableConstructor.constructAssembleForVariable(model as UtAssembleModel )
85+ }
86+
87+ else -> error(" Trying to autowire model $model but it is not appropriate" )
88+ }
89+ }
90+ }
91+
92+ class ClassFieldManagerFacade (context : CgContext ) : CgContextOwner by context {
93+
94+ private val injectingMocksFieldsManager = CgInjectingMocksFieldsManager (context)
95+ private val mockedFieldsManager = CgMockedFieldsManager (context)
96+ private val autowiredFieldsManager = CgAutowiredFieldsManager (context)
97+
98+ fun constructVariableForField (
99+ model : UtModel ,
100+ annotatedModelGroups : Map <ClassId , Set <UtModelWrapper >>,
101+ ): CgValue ? {
102+ val annotationManagers = listOf (injectingMocksFieldsManager, mockedFieldsManager, autowiredFieldsManager)
103+
104+ annotationManagers.forEach { manager ->
105+ val alreadyCreatedVariable = findCgValueByModel(model, annotatedModelGroups[manager.annotationType])
106+
107+ if (alreadyCreatedVariable != null ) {
108+ return manager.constructVariableForField(model, alreadyCreatedVariable)
109+ }
110+ }
111+
112+ return null
113+ }
114+
115+ private fun findCgValueByModel (model : UtModel , setOfModels : Set <UtModelWrapper >? ): CgValue ? {
116+ val key = setOfModels?.find { it == model.wrap() } ? : return null
117+ return valueByUtModelWrapper[key]
118+ }
119+ }
0 commit comments