Skip to content

Commit a7f0c86

Browse files
committed
Clear content related maps before the processing of new test class
1 parent 8d67c0f commit a7f0c86

File tree

10 files changed

+206
-185
lines changed

10 files changed

+206
-185
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgCallableAccessManager.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import org.utbot.framework.codegen.model.constructor.builtin.setAccessible
1313
import org.utbot.framework.codegen.model.constructor.context.CgContext
1414
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
1515
import org.utbot.framework.codegen.model.constructor.tree.CgCallableAccessManagerImpl.FieldAccessorSuitability.*
16-
import org.utbot.framework.codegen.model.constructor.util.CgComponents
16+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
17+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getVariableConstructorBy
1718
import org.utbot.framework.codegen.model.constructor.util.getAmbiguousOverloadsOf
1819
import org.utbot.framework.codegen.model.constructor.util.importIfNeeded
1920
import org.utbot.framework.codegen.model.constructor.util.isUtil
@@ -85,9 +86,9 @@ interface CgCallableAccessManager {
8586
internal class CgCallableAccessManagerImpl(val context: CgContext) : CgCallableAccessManager,
8687
CgContextOwner by context {
8788

88-
private val statementConstructor by lazy { CgComponents.getStatementConstructorBy(context) }
89+
private val statementConstructor by lazy { getStatementConstructorBy(context) }
8990

90-
private val variableConstructor by lazy { CgComponents.getVariableConstructorBy(context) }
91+
private val variableConstructor by lazy { getVariableConstructorBy(context) }
9192

9293
override operator fun CgExpression?.get(methodId: MethodId): CgIncompleteMethodCall =
9394
CgIncompleteMethodCall(methodId, this)

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgFieldStateManager.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import org.utbot.framework.codegen.model.constructor.builtin.forName
44
import org.utbot.framework.codegen.model.constructor.builtin.getArrayElement
55
import org.utbot.framework.codegen.model.constructor.context.CgContext
66
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
7-
import org.utbot.framework.codegen.model.constructor.util.CgComponents
7+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getCallableAccessManagerBy
8+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
89
import org.utbot.framework.codegen.model.constructor.util.CgFieldState
910
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
1011
import org.utbot.framework.codegen.model.constructor.util.FieldStateCache
@@ -44,8 +45,8 @@ internal interface CgFieldStateManager {
4445
internal class CgFieldStateManagerImpl(val context: CgContext)
4546
: CgContextOwner by context,
4647
CgFieldStateManager,
47-
CgCallableAccessManager by CgComponents.getCallableAccessManagerBy(context),
48-
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
48+
CgCallableAccessManager by getCallableAccessManagerBy(context),
49+
CgStatementConstructor by getStatementConstructorBy(context) {
4950

5051
override fun rememberInitialEnvironmentState(info: StateModificationInfo) {
5152
rememberThisInstanceState(info, FieldState.INITIAL)

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgMethodConstructor.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ import org.utbot.framework.codegen.model.constructor.builtin.invoke
1515
import org.utbot.framework.codegen.model.constructor.builtin.newInstance
1616
import org.utbot.framework.codegen.model.constructor.context.CgContext
1717
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
18-
import org.utbot.framework.codegen.model.constructor.util.CgComponents
18+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getCallableAccessManagerBy
19+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getMockFrameworkManagerBy
20+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getNameGeneratorBy
21+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
22+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getTestFrameworkManagerBy
23+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getVariableConstructorBy
1924
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
2025
import org.utbot.framework.codegen.model.constructor.util.EnvironmentFieldStateCache
2126
import org.utbot.framework.codegen.model.constructor.util.FieldStateCache
@@ -148,14 +153,14 @@ import java.lang.reflect.ParameterizedType
148153
private const val DEEP_EQUALS_MAX_DEPTH = 5 // TODO move it to plugin settings?
149154

150155
internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by context,
151-
CgCallableAccessManager by CgComponents.getCallableAccessManagerBy(context),
152-
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
156+
CgCallableAccessManager by getCallableAccessManagerBy(context),
157+
CgStatementConstructor by getStatementConstructorBy(context) {
153158

154-
private val nameGenerator = CgComponents.getNameGeneratorBy(context)
155-
private val testFrameworkManager = CgComponents.getTestFrameworkManagerBy(context)
159+
private val nameGenerator = getNameGeneratorBy(context)
160+
private val testFrameworkManager = getTestFrameworkManagerBy(context)
156161

157-
private val variableConstructor = CgComponents.getVariableConstructorBy(context)
158-
private val mockFrameworkManager = CgComponents.getMockFrameworkManagerBy(context)
162+
private val variableConstructor = getVariableConstructorBy(context)
163+
private val mockFrameworkManager = getMockFrameworkManagerBy(context)
159164

160165
private val floatDelta: Float = 1e-6f
161166
private val doubleDelta = 1e-6

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgTestClassConstructor.kt

Lines changed: 57 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
package org.utbot.framework.codegen.model.constructor.tree
22

3-
import org.utbot.common.appendHtmlLine
3+
import org.utbot.framework.codegen.Junit4
4+
import org.utbot.framework.codegen.Junit5
45
import org.utbot.framework.codegen.ParametrizedTestSource
6+
import org.utbot.framework.codegen.TestNg
57
import org.utbot.framework.codegen.model.constructor.CgMethodTestSet
8+
import org.utbot.framework.codegen.model.constructor.TestClassModel
69
import org.utbot.framework.codegen.model.constructor.builtin.TestClassUtilMethodProvider
710
import org.utbot.framework.codegen.model.constructor.context.CgContext
811
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
9-
import org.utbot.framework.codegen.model.constructor.util.CgComponents
12+
import org.utbot.framework.codegen.model.constructor.name.CgNameGenerator
13+
import org.utbot.framework.codegen.model.constructor.name.CgNameGeneratorImpl
14+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.clearContextRelatedStorage
15+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getMethodConstructorBy
16+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getNameGeneratorBy
17+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
18+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getTestFrameworkManagerBy
1019
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
11-
import org.utbot.framework.codegen.model.tree.CgMethod
20+
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructorImpl
21+
import org.utbot.framework.codegen.model.tree.CgAuxiliaryClass
1222
import org.utbot.framework.codegen.model.tree.CgExecutableUnderTestCluster
23+
import org.utbot.framework.codegen.model.tree.CgMethod
1324
import org.utbot.framework.codegen.model.tree.CgParameterDeclaration
1425
import org.utbot.framework.codegen.model.tree.CgRegion
1526
import org.utbot.framework.codegen.model.tree.CgSimpleRegion
@@ -18,33 +29,32 @@ import org.utbot.framework.codegen.model.tree.CgTestClass
1829
import org.utbot.framework.codegen.model.tree.CgTestClassFile
1930
import org.utbot.framework.codegen.model.tree.CgTestMethod
2031
import org.utbot.framework.codegen.model.tree.CgTestMethodCluster
21-
import org.utbot.framework.codegen.model.tree.CgTestMethodType.*
2232
import org.utbot.framework.codegen.model.tree.CgTripleSlashMultilineComment
33+
import org.utbot.framework.codegen.model.tree.CgUtilEntity
2334
import org.utbot.framework.codegen.model.tree.CgUtilMethod
2435
import org.utbot.framework.codegen.model.tree.buildTestClass
2536
import org.utbot.framework.codegen.model.tree.buildTestClassBody
2637
import org.utbot.framework.codegen.model.tree.buildTestClassFile
2738
import org.utbot.framework.codegen.model.visitor.importUtilMethodDependencies
39+
import org.utbot.framework.plugin.api.ClassId
2840
import org.utbot.framework.plugin.api.ExecutableId
2941
import org.utbot.framework.plugin.api.MethodId
30-
import org.utbot.framework.plugin.api.UtMethodTestSet
31-
import org.utbot.framework.codegen.model.constructor.TestClassModel
32-
import org.utbot.framework.codegen.model.tree.CgAuxiliaryClass
33-
import org.utbot.framework.codegen.model.tree.CgUtilEntity
34-
import org.utbot.framework.plugin.api.ClassId
3542
import org.utbot.framework.plugin.api.UtExecutionSuccess
43+
import org.utbot.framework.plugin.api.UtMethodTestSet
3644
import org.utbot.framework.plugin.api.util.description
3745
import org.utbot.framework.plugin.api.util.humanReadableName
38-
import org.utbot.framework.plugin.api.util.kClass
39-
import kotlin.reflect.KClass
4046

4147
internal class CgTestClassConstructor(val context: CgContext) :
4248
CgContextOwner by context,
43-
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
49+
CgStatementConstructor by getStatementConstructorBy(context) {
50+
51+
init {
52+
clearContextRelatedStorage()
53+
}
4454

45-
private val methodConstructor = CgComponents.getMethodConstructorBy(context)
46-
private val nameGenerator = CgComponents.getNameGeneratorBy(context)
47-
private val testFrameworkManager = CgComponents.getTestFrameworkManagerBy(context)
55+
private val methodConstructor = getMethodConstructorBy(context)
56+
private val nameGenerator = getNameGeneratorBy(context)
57+
private val testFrameworkManager = getTestFrameworkManagerBy(context)
4858

4959
private val testsGenerationReport: TestsGenerationReport = TestsGenerationReport()
5060

@@ -279,106 +289,45 @@ internal class CgTestClassConstructor(val context: CgContext) :
279289
*/
280290
private val CgMethodTestSet.allErrors: Map<String, Int>
281291
get() = errors + codeGenerationErrors.getOrDefault(this, mapOf())
282-
}
283292

284-
typealias MethodGeneratedTests = MutableMap<ExecutableId, MutableSet<CgTestMethod>>
285-
typealias ErrorsCount = Map<String, Int>
286-
287-
data class TestsGenerationReport(
288-
val executables: MutableSet<ExecutableId> = mutableSetOf(),
289-
var successfulExecutions: MethodGeneratedTests = mutableMapOf(),
290-
var timeoutExecutions: MethodGeneratedTests = mutableMapOf(),
291-
var failedExecutions: MethodGeneratedTests = mutableMapOf(),
292-
var crashExecutions: MethodGeneratedTests = mutableMapOf(),
293-
var errors: MutableMap<ExecutableId, ErrorsCount> = mutableMapOf()
294-
) {
295-
val classUnderTest: KClass<*>
296-
get() = executables.firstOrNull()?.classId?.kClass
297-
?: error("No executables found in test report")
298-
299-
val initialWarnings: MutableList<() -> String> = mutableListOf()
300-
val hasWarnings: Boolean
301-
get() = initialWarnings.isNotEmpty()
302-
303-
val detailedStatistics: String
304-
get() = buildString {
305-
appendHtmlLine("Class: ${classUnderTest.qualifiedName}")
306-
val testMethodsStatistic = executables.map { it.countTestMethods() }
307-
val errors = executables.map { it.countErrors() }
308-
val overallErrors = errors.sum()
309-
310-
appendHtmlLine("Successful test methods: ${testMethodsStatistic.sumBy { it.successful }}")
311-
appendHtmlLine(
312-
"Failing because of unexpected exception test methods: ${testMethodsStatistic.sumBy { it.failing }}"
313-
)
314-
appendHtmlLine(
315-
"Failing because of exceeding timeout test methods: ${testMethodsStatistic.sumBy { it.timeout }}"
316-
)
317-
appendHtmlLine(
318-
"Failing because of possible JVM crash test methods: ${testMethodsStatistic.sumBy { it.crashes }}"
319-
)
320-
appendHtmlLine("Not generated because of internal errors test methods: $overallErrors")
293+
internal object CgComponents {
294+
/**
295+
* Clears all stored data for current [CgContext].
296+
* As far as context is created per class under test,
297+
* no related data is required after it's processing.
298+
*/
299+
fun clearContextRelatedStorage() {
300+
nameGenerators.clear()
301+
statementConstructors.clear()
302+
callableAccessManagers.clear()
303+
testFrameworkManagers.clear()
304+
mockFrameworkManagers.clear()
305+
variableConstructors.clear()
306+
methodConstructors.clear()
321307
}
322308

323-
fun addMethodErrors(testSet: CgMethodTestSet, errors: Map<String, Int>) {
324-
this.errors[testSet.executableId] = errors
325-
}
326-
327-
fun addTestsByType(testSet: CgMethodTestSet, testMethods: List<CgTestMethod>) {
328-
with(testSet.executableId) {
329-
executables += this
330-
331-
testMethods.forEach {
332-
when (it.type) {
333-
SUCCESSFUL -> updateExecutions(it, successfulExecutions)
334-
FAILING -> updateExecutions(it, failedExecutions)
335-
TIMEOUT -> updateExecutions(it, timeoutExecutions)
336-
CRASH -> updateExecutions(it, crashExecutions)
337-
PARAMETRIZED -> {
338-
// Parametrized tests are not supported in the tests report yet
339-
// TODO JIRA:1507
340-
}
341-
}
342-
}
343-
}
344-
}
345-
346-
fun toString(isShort: Boolean): String = buildString {
347-
appendHtmlLine("Target: ${classUnderTest.qualifiedName}")
348-
if (initialWarnings.isNotEmpty()) {
349-
initialWarnings.forEach { appendHtmlLine(it()) }
350-
appendHtmlLine()
351-
}
309+
private val nameGenerators: MutableMap<CgContext, CgNameGenerator> = mutableMapOf()
310+
private val statementConstructors: MutableMap<CgContext, CgStatementConstructor> = mutableMapOf()
311+
private val callableAccessManagers: MutableMap<CgContext, CgCallableAccessManager> = mutableMapOf()
312+
private val testFrameworkManagers: MutableMap<CgContext, TestFrameworkManager> = mutableMapOf()
313+
private val mockFrameworkManagers: MutableMap<CgContext, MockFrameworkManager> = mutableMapOf()
352314

353-
val testMethodsStatistic = executables.map { it.countTestMethods() }
354-
val overallTestMethods = testMethodsStatistic.sumBy { it.count }
315+
private val variableConstructors: MutableMap<CgContext, CgVariableConstructor> = mutableMapOf()
316+
private val methodConstructors: MutableMap<CgContext, CgMethodConstructor> = mutableMapOf()
355317

356-
appendHtmlLine("Overall test methods: $overallTestMethods")
318+
fun getNameGeneratorBy(context: CgContext) = nameGenerators.getOrPut(context) { CgNameGeneratorImpl(context) }
319+
fun getCallableAccessManagerBy(context: CgContext) = callableAccessManagers.getOrPut(context) { CgCallableAccessManagerImpl(context) }
320+
fun getStatementConstructorBy(context: CgContext) = statementConstructors.getOrPut(context) { CgStatementConstructorImpl(context) }
357321

358-
if (!isShort) {
359-
appendHtmlLine(detailedStatistics)
322+
fun getTestFrameworkManagerBy(context: CgContext) = when (context.testFramework) {
323+
is Junit4 -> testFrameworkManagers.getOrPut(context) { Junit4Manager(context) }
324+
is Junit5 -> testFrameworkManagers.getOrPut(context) { Junit5Manager(context) }
325+
is TestNg -> testFrameworkManagers.getOrPut(context) { TestNgManager(context) }
360326
}
361-
}
362-
363-
override fun toString(): String = toString(false)
364-
365-
private fun ExecutableId.countTestMethods(): TestMethodStatistic = TestMethodStatistic(
366-
testMethodsNumber(successfulExecutions),
367-
testMethodsNumber(failedExecutions),
368-
testMethodsNumber(timeoutExecutions),
369-
testMethodsNumber(crashExecutions)
370-
)
371-
372-
private fun ExecutableId.countErrors(): Int = errors.getOrDefault(this, emptyMap()).values.sum()
373327

374-
private fun ExecutableId.testMethodsNumber(executables: MethodGeneratedTests): Int =
375-
executables.getOrDefault(this, emptySet()).size
376-
377-
private fun ExecutableId.updateExecutions(it: CgTestMethod, executions: MethodGeneratedTests) {
378-
executions.getOrPut(this) { mutableSetOf() } += it
379-
}
380-
381-
private data class TestMethodStatistic(val successful: Int, val failing: Int, val timeout: Int, val crashes: Int) {
382-
val count: Int = successful + failing + timeout + crashes
328+
fun getMockFrameworkManagerBy(context: CgContext) = mockFrameworkManagers.getOrPut(context) { MockFrameworkManager(context) }
329+
fun getVariableConstructorBy(context: CgContext) = variableConstructors.getOrPut(context) { CgVariableConstructor(context) }
330+
fun getMethodConstructorBy(context: CgContext) = methodConstructors.getOrPut(context) { CgMethodConstructor(context) }
383331
}
384332
}
333+

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgVariableConstructor.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import org.utbot.framework.codegen.model.constructor.builtin.forName
55
import org.utbot.framework.codegen.model.constructor.builtin.setArrayElement
66
import org.utbot.framework.codegen.model.constructor.context.CgContext
77
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
8-
import org.utbot.framework.codegen.model.constructor.util.CgComponents
8+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getCallableAccessManagerBy
9+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getMockFrameworkManagerBy
10+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getNameGeneratorBy
11+
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
912
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
1013
import org.utbot.framework.codegen.model.constructor.util.MAX_ARRAY_INITIALIZER_SIZE
1114
import org.utbot.framework.codegen.model.constructor.util.arrayInitializer
@@ -73,11 +76,11 @@ import org.utbot.framework.plugin.api.util.wrapperByPrimitive
7376
@Suppress("unused")
7477
internal class CgVariableConstructor(val context: CgContext) :
7578
CgContextOwner by context,
76-
CgCallableAccessManager by CgComponents.getCallableAccessManagerBy(context),
77-
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
79+
CgCallableAccessManager by getCallableAccessManagerBy(context),
80+
CgStatementConstructor by getStatementConstructorBy(context) {
7881

79-
private val nameGenerator = CgComponents.getNameGeneratorBy(context)
80-
private val mockFrameworkManager = CgComponents.getMockFrameworkManagerBy(context)
82+
private val nameGenerator = getNameGeneratorBy(context)
83+
private val mockFrameworkManager = getMockFrameworkManagerBy(context)
8184

8285
/**
8386
* Take already created CgValue or construct either a new [CgVariable] or new [CgLiteral] for the given model.

0 commit comments

Comments
 (0)