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