Skip to content

Commit e28d3bb

Browse files
Refactor annotated class variables processing (#2484)
* First step * Second step * Next step
1 parent af01b6e commit e28d3bb

20 files changed

+485
-397
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/context/CgContext.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ import org.utbot.framework.codegen.domain.builtin.UtilClassFileMethodProvider
2020
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
2121
import org.utbot.framework.codegen.domain.models.*
2222
import org.utbot.framework.codegen.services.access.Block
23+
import org.utbot.framework.codegen.services.access.CgFieldStateManager
2324
import org.utbot.framework.codegen.tree.EnvironmentFieldStateCache
2425
import org.utbot.framework.codegen.tree.importIfNeeded
2526
import org.utbot.framework.plugin.api.BuiltinClassId
2627
import org.utbot.framework.plugin.api.ClassId
2728
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
29+
import org.utbot.framework.codegen.tree.fieldmanager.CgAbstractClassFieldManager
30+
import org.utbot.framework.codegen.tree.fieldmanager.CgClassFieldManager
2831
import org.utbot.framework.plugin.api.CodegenLanguage
2932
import org.utbot.framework.plugin.api.ExecutableId
3033
import org.utbot.framework.plugin.api.FieldId
@@ -242,6 +245,12 @@ interface CgContextOwner {
242245
*/
243246
var successfulExecutionsModels: List<UtModel>
244247

248+
/**
249+
* Managers to process annotated fields of the class under test
250+
* relevant for the current generation type.
251+
*/
252+
val relevantFieldManagers: MutableList<CgAbstractClassFieldManager>
253+
245254
fun block(init: () -> Unit): Block {
246255
val prevBlock = currentBlock
247256
return try {
@@ -508,6 +517,7 @@ class CgContext(
508517
RuntimeExceptionTestsBehaviour.defaultItem,
509518
override val hangingTestsTimeout: HangingTestsTimeout = HangingTestsTimeout(),
510519
override val enableTestsTimeout: Boolean = true,
520+
override val relevantFieldManagers: MutableList<CgAbstractClassFieldManager> = mutableListOf(),
511521
override var containsReflectiveCall: Boolean = false,
512522
) : CgContextOwner {
513523
override lateinit var statesCache: EnvironmentFieldStateCache

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/TestClassModel.kt

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,3 @@ class SimpleTestClassModel(
2020
nestedClasses: List<SimpleTestClassModel> = listOf(),
2121
): TestClassModel(classUnderTest, methodTestSets, nestedClasses)
2222

23-
/**
24-
* Extended [SimpleTestClassModel] for Spring analysis reasons
25-
*/
26-
class SpringTestClassModel(
27-
classUnderTest: ClassId,
28-
methodTestSets: List<CgMethodTestSet>,
29-
nestedClasses: List<SimpleTestClassModel>,
30-
val springSpecificInformation: SpringSpecificInformation,
31-
): TestClassModel(classUnderTest, methodTestSets, nestedClasses)
32-
33-
class SpringSpecificInformation(
34-
val thisInstanceModels: TypedModelWrappers,
35-
val thisInstanceDependentMocks: TypedModelWrappers,
36-
val thisInstanceDependentSpies: TypedModelWrappers,
37-
val autowiredFromContextModels: TypedModelWrappers,
38-
val entityManagerModels: TypedModelWrappers,
39-
)

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/builders/SimpleTestClassModelBuilder.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.utbot.framework.codegen.domain.models.builders
22

3-
import org.utbot.framework.codegen.domain.context.CgContext
3+
import org.utbot.framework.codegen.domain.UtModelWrapper
44
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
55
import org.utbot.framework.codegen.domain.models.SimpleTestClassModel
66
import org.utbot.framework.plugin.api.ClassId
77
import org.utbot.framework.plugin.api.util.enclosingClass
88

9-
open class SimpleTestClassModelBuilder(context: CgContext): TestClassModelBuilder() {
9+
typealias TypedModelWrappers = Map<ClassId, Set<UtModelWrapper>>
10+
11+
open class SimpleTestClassModelBuilder: TestClassModelBuilder() {
1012
override fun createTestClassModel(
1113
classUnderTest: ClassId,
1214
testSets: List<CgMethodTestSet>,

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/generator/CodeGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ open class CodeGenerator(params: CodeGeneratorParams): AbstractCodeGenerator(par
1010
protected val classUnderTest: ClassId = params.classUnderTest
1111

1212
override fun generate(testSets: List<CgMethodTestSet>): CodeGeneratorResult {
13-
val testClassModel = SimpleTestClassModelBuilder(context).createTestClassModel(classUnderTest, testSets)
13+
val testClassModel = SimpleTestClassModelBuilder().createTestClassModel(classUnderTest, testSets)
1414

1515
logger.info { "Code generation phase started at ${now()}" }
1616
val astConstructor = CgSimpleTestClassConstructor(context)

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/generator/SpringCodeGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.utbot.framework.codegen.generator
22

33
import org.utbot.framework.codegen.domain.context.CgContext
44
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
5-
import org.utbot.framework.codegen.domain.models.builders.SpringTestClassModelBuilder
5+
import org.utbot.framework.codegen.domain.models.builders.SimpleTestClassModelBuilder
66
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
77
import org.utbot.framework.codegen.tree.CgCustomAssertConstructor
88
import org.utbot.framework.codegen.tree.CgSpringIntegrationTestClassConstructor
@@ -39,7 +39,7 @@ class SpringCodeGenerator(
3939
private val classUnderTest: ClassId = params.classUnderTest
4040

4141
override fun generate(testSets: List<CgMethodTestSet>): CodeGeneratorResult {
42-
val testClassModel = SpringTestClassModelBuilder(context).createTestClassModel(classUnderTest, testSets)
42+
val testClassModel = SimpleTestClassModelBuilder().createTestClassModel(classUnderTest, testSets)
4343

4444
logger.info { "Code generation phase started at ${now()}" }
4545
val astConstructor = when (springTestType) {

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgAbstractSpringTestClassConstructor.kt

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ package org.utbot.framework.codegen.tree
22

33
import org.utbot.framework.codegen.domain.builtin.TestClassUtilMethodProvider
44
import org.utbot.framework.codegen.domain.context.CgContext
5-
import org.utbot.framework.codegen.domain.models.AnnotationTarget.*
5+
import org.utbot.framework.codegen.domain.models.AnnotationTarget.Method
66
import org.utbot.framework.codegen.domain.models.CgClassBody
7-
import org.utbot.framework.codegen.domain.models.CgDeclaration
87
import org.utbot.framework.codegen.domain.models.CgFieldDeclaration
98
import org.utbot.framework.codegen.domain.models.CgFrameworkUtilMethod
109
import org.utbot.framework.codegen.domain.models.CgMethod
@@ -13,21 +12,18 @@ import org.utbot.framework.codegen.domain.models.CgMethodsCluster
1312
import org.utbot.framework.codegen.domain.models.CgRegion
1413
import org.utbot.framework.codegen.domain.models.CgStatement
1514
import org.utbot.framework.codegen.domain.models.CgStaticsRegion
16-
import org.utbot.framework.codegen.domain.models.CgVariable
17-
import org.utbot.framework.codegen.domain.models.SpringTestClassModel
18-
import org.utbot.framework.codegen.domain.models.builders.TypedModelWrappers
15+
import org.utbot.framework.codegen.domain.models.SimpleTestClassModel
16+
import org.utbot.framework.codegen.tree.fieldmanager.ClassFieldManagerFacade
1917
import org.utbot.framework.plugin.api.UtExecution
20-
import org.utbot.framework.plugin.api.UtSpringContextModel
2118
import org.utbot.framework.plugin.api.util.id
22-
import java.lang.Exception
2319

2420
abstract class CgAbstractSpringTestClassConstructor(context: CgContext) :
25-
CgAbstractTestClassConstructor<SpringTestClassModel>(context) {
21+
CgAbstractTestClassConstructor<SimpleTestClassModel>(context) {
2622

2723
protected val variableConstructor: CgSpringVariableConstructor =
2824
CgComponents.getVariableConstructorBy(context) as CgSpringVariableConstructor
2925

30-
override fun constructTestClassBody(testClassModel: SpringTestClassModel): CgClassBody {
26+
override fun constructTestClassBody(testClassModel: SimpleTestClassModel): CgClassBody {
3127
return buildClassBody(currentTestClass) {
3228

3329
// TODO: support inner classes here
@@ -80,7 +76,7 @@ abstract class CgAbstractSpringTestClassConstructor(context: CgContext) :
8076
return if (regions.any()) regions else null
8177
}
8278

83-
abstract fun constructClassFields(testClassModel: SpringTestClassModel): List<CgFieldDeclaration>
79+
abstract fun constructClassFields(testClassModel: SimpleTestClassModel): List<CgFieldDeclaration>
8480

8581
/**
8682
* Here "additional" means that these tests are not obtained from
@@ -90,49 +86,6 @@ abstract class CgAbstractSpringTestClassConstructor(context: CgContext) :
9086

9187
open fun constructAdditionalUtilMethods(): CgMethodsCluster? = null
9288

93-
protected fun constructFieldsWithAnnotation(
94-
fieldManager: CgClassFieldManager,
95-
groupedModelsByClassId: TypedModelWrappers,
96-
): List<CgFieldDeclaration> {
97-
val annotationClassId = fieldManager.annotationType
98-
val annotation = addAnnotation(annotationClassId, Field)
99-
100-
val constructedDeclarations = mutableListOf<CgFieldDeclaration>()
101-
for ((classId, modelWrappers) in groupedModelsByClassId) {
102-
103-
val modelWrapper = modelWrappers.firstOrNull() ?: continue
104-
val model = modelWrapper.model
105-
106-
val fieldWithAnnotationIsRequired = fieldManager.fieldWithAnnotationIsRequired(model.classId)
107-
if (!fieldWithAnnotationIsRequired) {
108-
continue
109-
}
110-
111-
val baseVarName = fieldManager.constructBaseVarName(model)
112-
113-
val createdVariable = variableConstructor.getOrCreateVariable(model, baseVarName) as? CgVariable
114-
?: error("`CgVariable` cannot be constructed from a $model model")
115-
116-
val declaration = CgDeclaration(classId, variableName = createdVariable.name, initializer = null)
117-
118-
constructedDeclarations += CgFieldDeclaration(
119-
ownerClassId = currentTestClass,
120-
declaration,
121-
annotation
122-
)
123-
124-
modelWrappers
125-
.forEach { modelWrapper ->
126-
127-
valueByUtModelWrapper[modelWrapper] = createdVariable
128-
129-
variableConstructor.annotatedModelGroups
130-
.getOrPut(annotationClassId) { mutableSetOf() } += modelWrapper
131-
}
132-
}
133-
134-
return constructedDeclarations
135-
}
13689

13790
/**
13891
* Clears the results of variable instantiations that occurred
@@ -145,8 +98,7 @@ abstract class CgAbstractSpringTestClassConstructor(context: CgContext) :
14598
* but it will take very long time to do it now.
14699
*/
147100
private fun clearUnwantedVariableModels() {
148-
val trustedListOfModels =
149-
variableConstructor.annotatedModelGroups.values.flatten() + listOf(UtSpringContextModel.wrap())
101+
val trustedListOfModels = ClassFieldManagerFacade(context).findTrustedModels()
150102

151103
valueByUtModelWrapper
152104
.filterNot { it.key in trustedListOfModels }

0 commit comments

Comments
 (0)