Skip to content

Commit ab3daed

Browse files
committed
Apply review fixes
1 parent 49814bf commit ab3daed

File tree

13 files changed

+330
-240
lines changed

13 files changed

+330
-240
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,23 +343,23 @@ class AssembleModelGenerator(private val basePackageName: String) {
343343
private fun assembleMockCompositeModel(compositeModel: UtCompositeModel): UtCompositeModel {
344344
// We have to create a model before the construction of the fields to avoid
345345
// infinite recursion when some mock contains itself as a field.
346-
val assembledModel = UtCompositeModel(
346+
val assembledCompositeModel = UtCompositeModel(
347347
compositeModel.id,
348348
compositeModel.classId,
349349
isMock = true,
350350
)
351351

352-
instantiatedModels[compositeModel] = assembledModel
352+
instantiatedModels[compositeModel] = assembledCompositeModel
353353

354354
val fields = compositeModel.fields.mapValues { assembleModel(it.value) }.toMutableMap()
355355
val mockBehaviour = compositeModel.mocks
356356
.mapValues { models -> models.value.map { assembleModel(it) } }
357357
.toMutableMap()
358358

359-
assembledModel.fields += fields
360-
assembledModel.mocks += mockBehaviour
359+
assembledCompositeModel.fields += fields
360+
assembledCompositeModel.mocks += mockBehaviour
361361

362-
return assembledModel
362+
return assembledCompositeModel
363363
}
364364

365365
/**

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

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ import org.utbot.framework.codegen.domain.StaticsMocking
99
import org.utbot.framework.codegen.domain.TestFramework
1010
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
1111
import org.utbot.framework.codegen.domain.context.CgContext
12-
import org.utbot.framework.codegen.domain.models.TestClassModelBuilder
12+
import org.utbot.framework.codegen.domain.models.CgClassFile
13+
import org.utbot.framework.codegen.domain.models.builders.SimpleTestClassModelBuilder
14+
import org.utbot.framework.codegen.domain.models.builders.SpringTestClassModelBuilder
1315
import org.utbot.framework.codegen.renderer.CgAbstractRenderer
1416
import org.utbot.framework.codegen.reports.TestsGenerationReport
1517
import org.utbot.framework.codegen.tree.CgSimpleTestClassConstructor
1618
import org.utbot.framework.codegen.tree.ututils.UtilClassKind
1719
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
20+
import org.utbot.framework.codegen.tree.CgSpringTestClassConstructor
1821
import org.utbot.framework.plugin.api.ClassId
1922
import org.utbot.framework.plugin.api.CodegenLanguage
2023
import org.utbot.framework.plugin.api.ExecutableId
@@ -73,31 +76,60 @@ open class CodeGenerator(
7376
val cgTestSets = testSets.map { CgMethodTestSet(it) }.toList()
7477
return withCustomContext(testClassCustomName) {
7578
context.withTestClassFileScope {
76-
val astConstructor = CgSimpleTestClassConstructor(context)
77-
val renderer = CgAbstractRenderer.makeRenderer(context)
78-
val testClassModelBuilder = TestClassModelBuilder(context.isSpringClass)
79+
if (context.isSpringClass) {
80+
generateForSpringClass(cgTestSets)
81+
} else {
82+
generateForSimpleClass(cgTestSets)
83+
}
84+
}
85+
}
86+
}
7987

80-
val testClassModel = testClassModelBuilder.createClassModel(classUnderTest, cgTestSets)
88+
private fun generateForSimpleClass(testSets: List<CgMethodTestSet>): CodeGeneratorResult {
89+
val astConstructor = CgSimpleTestClassConstructor(context)
90+
val testClassModel = SimpleTestClassModelBuilder().createTestClassModel(classUnderTest, testSets)
8191

82-
fun now() = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss.SSS"))
92+
logger.info { "Code generation phase started at ${now()}" }
93+
val testClassFile = astConstructor.construct(testClassModel)
94+
logger.info { "Code generation phase finished at ${now()}" }
8395

84-
logger.info { "Code generation phase started at ${now()}" }
85-
val testClassFile = astConstructor.construct(testClassModel)
86-
logger.info { "Code generation phase finished at ${now()}" }
96+
val generatedCode = renderToString(testClassFile)
8797

88-
logger.info { "Rendering phase started at ${now()}" }
89-
testClassFile.accept(renderer)
90-
logger.info { "Rendering phase finished at ${now()}" }
98+
return CodeGeneratorResult(
99+
generatedCode = generatedCode,
100+
utilClassKind = UtilClassKind.fromCgContextOrNull(context),
101+
testsGenerationReport = astConstructor.testsGenerationReport
102+
)
103+
}
91104

92-
CodeGeneratorResult(
93-
generatedCode = renderer.toString(),
94-
utilClassKind = UtilClassKind.fromCgContextOrNull(context),
95-
testsGenerationReport = astConstructor.testsGenerationReport
96-
)
97-
}
98-
}
105+
private fun generateForSpringClass(testSets: List<CgMethodTestSet>): CodeGeneratorResult {
106+
val astConstructor = CgSpringTestClassConstructor(context)
107+
val testClassModel = SpringTestClassModelBuilder().createTestClassModel(classUnderTest, testSets)
108+
109+
logger.info { "Code generation phase started at ${now()}" }
110+
val testClassFile = astConstructor.construct(testClassModel)
111+
logger.info { "Code generation phase finished at ${now()}" }
112+
113+
val generatedCode = renderToString(testClassFile)
114+
115+
return CodeGeneratorResult(
116+
generatedCode = generatedCode,
117+
utilClassKind = UtilClassKind.fromCgContextOrNull(context),
118+
testsGenerationReport = TestsGenerationReport()
119+
)
120+
}
121+
122+
private fun renderToString(testClassFile: CgClassFile): String {
123+
logger.info { "Rendering phase started at ${now()}" }
124+
val renderer = CgAbstractRenderer.makeRenderer(context)
125+
testClassFile.accept(renderer)
126+
logger.info { "Rendering phase finished at ${now()}" }
127+
128+
return renderer.toString()
99129
}
100130

131+
private fun now() = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss.SSS"))
132+
101133
/**
102134
* Wrapper function that configures context as needed for utbot-online:
103135
* - turns on imports optimization in code generator

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import org.utbot.framework.codegen.domain.models.CgMethodTestSet
2626
import org.utbot.framework.codegen.domain.builtin.TestClassUtilMethodProvider
2727
import org.utbot.framework.codegen.domain.builtin.UtilClassFileMethodProvider
2828
import org.utbot.framework.codegen.domain.builtin.UtilMethodProvider
29-
import org.utbot.framework.codegen.domain.models.TestClassModel
29+
import org.utbot.framework.codegen.domain.models.SimpleTestClassModel
3030
import org.utbot.framework.codegen.domain.models.CgParameterKind
3131
import org.utbot.framework.codegen.services.access.Block
3232
import org.utbot.framework.codegen.tree.EnvironmentFieldStateCache
@@ -295,7 +295,7 @@ interface CgContextOwner {
295295
* This method does almost all the same as [withTestClassScope], but for nested test classes.
296296
* The difference is that instead of working with [outerMostTestClassContext] it works with [currentTestClassContext].
297297
*/
298-
fun <R> withNestedClassScope(testClassModel: TestClassModel, block: () -> R): R
298+
fun <R> withNestedClassScope(testClassModel: SimpleTestClassModel, block: () -> R): R
299299

300300
/**
301301
* Set [mockFrameworkUsed] flag to true if the block is successfully executed
@@ -434,7 +434,7 @@ interface CgContextOwner {
434434
*/
435435
data class CgContext(
436436
override val classUnderTest: ClassId,
437-
override val isSpringClass: Boolean = false,
437+
override val isSpringClass: Boolean = true,
438438
val generateUtilClassFile: Boolean = false,
439439
override var currentExecutable: ExecutableId? = null,
440440
override val collectedExceptions: MutableSet<ClassId> = mutableSetOf(),
@@ -542,7 +542,7 @@ data class CgContext(
542542
}
543543
}
544544

545-
override fun <R> withNestedClassScope(testClassModel: TestClassModel, block: () -> R): R {
545+
override fun <R> withNestedClassScope(testClassModel: SimpleTestClassModel, block: () -> R): R {
546546
val previousCurrentTestClassInfo = currentTestClassContext
547547
val previousCurrentTestClass = currentTestClass
548548
currentTestClass = createClassIdForNestedClass(testClassModel)
@@ -555,7 +555,7 @@ data class CgContext(
555555
}
556556
}
557557

558-
private fun createClassIdForNestedClass(testClassModel: TestClassModel): ClassId {
558+
private fun createClassIdForNestedClass(testClassModel: SimpleTestClassModel): ClassId {
559559
val simpleName = "${testClassModel.classUnderTest.simpleName}Test"
560560
return BuiltinClassId(
561561
canonicalName = currentTestClass.canonicalName + "." + simpleName,

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,34 @@ package org.utbot.framework.codegen.domain.models
22

33
import org.utbot.framework.plugin.api.ClassId
44

5-
// TODO: seems like this class needs to be renamed
65
/**
76
* Stores method test sets in a structure that replicates structure of their methods in [classUnderTest].
87
* I.e., if some method is declared in nested class of [classUnderTest], its testset will be put
98
* in [TestClassModel] in one of [nestedClasses]
9+
*/
10+
abstract class TestClassModel(
11+
val classUnderTest: ClassId,
12+
val methodTestSets: List<CgMethodTestSet>,
13+
val nestedClasses: List<SimpleTestClassModel>,
14+
)
15+
16+
open class SimpleTestClassModel(
17+
classUnderTest: ClassId,
18+
methodTestSets: List<CgMethodTestSet>,
19+
nestedClasses: List<SimpleTestClassModel> = listOf(),
20+
): TestClassModel(classUnderTest, methodTestSets, nestedClasses)
21+
22+
/**
23+
* Extended [SimpleTestClassModel] for Spring analysis reasons
1024
*
1125
* @param injectingMocksClass a class to inject other mocks into
1226
* @param mockedClasses variables of test class to represent mocked instances
1327
*/
14-
class TestClassModel(
15-
val classUnderTest: ClassId,
16-
val methodTestSets: List<CgMethodTestSet>,
17-
val nestedClasses: List<TestClassModel> = listOf(),
28+
class SpringTestClassModel(
29+
classUnderTest: ClassId,
30+
methodTestSets: List<CgMethodTestSet>,
31+
nestedClasses: List<SimpleTestClassModel>,
1832
val injectingMocksClass: ClassId? = null,
1933
val mockedClasses: Set<ClassId> = setOf(),
20-
)
34+
): TestClassModel(classUnderTest, methodTestSets, nestedClasses)
35+

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

Lines changed: 0 additions & 151 deletions
This file was deleted.

0 commit comments

Comments
 (0)