Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
1175678
squash constraint model synthesis
AbdullinAM Sep 28, 2022
d69ebc4
squash constraint model synthesis
AbdullinAM Sep 28, 2022
8d68488
resolver fix
AbdullinAM Sep 29, 2022
c6cac8d
model based post condition constructor restored
AbdullinAM Sep 29, 2022
df75f26
very primitive global timeoutfor synthesis
AbdullinAM Oct 11, 2022
e10a50e
Primitive Stream wrappers (no laziness and source mutations support) …
Damtev Sep 28, 2022
80da28b
Avoid summary duplication #985 (#1015)
onewhl Sep 28, 2022
608d56c
Fix bug in filtering Kotlin getters/setters in plugin (#1026)
volivan239 Sep 28, 2022
1f59106
Reordered the test clusters (#991)
amandelpie Sep 30, 2022
f96c118
Fix build directory for classes from Kotlin files (#1019)
volivan239 Sep 30, 2022
40bf31b
Improve choosing between simpleName and canonicalName in rendered cod…
EgorkaKulikov Sep 30, 2022
3380506
Run tests on `push` into release branches (#1045)
viktoriia-fomina Sep 30, 2022
234ace0
Fix utbot-maven compilation (#1049)
dtim Oct 1, 2022
1a0289d
Support AssertionError in SARIF report (#1032)
mmvpm Oct 3, 2022
7b417c9
Render links in the invokes part of JavaDocs (#1051)
onewhl Oct 3, 2022
0cedf7a
Improve fuzzer recursive model providers (#1039)
Markoutte Oct 3, 2022
4293d4f
IndexNotReadyException thrown in IDEA with installed UnitTestBot plug…
Vassiliy-Kudryashov Oct 3, 2022
a5d628c
Publish without workflow run number (#1053)
viktoriia-fomina Oct 3, 2022
ba08cb7
Modificators processing in AssembleModelGenerator and UtBotFieldModif…
EgorkaKulikov Oct 3, 2022
ae5b883
Gradle cache usage added #974 (#998)
bissquit Oct 4, 2022
b6d8a65
Try to fix memory leak in CgComponents (#1057)
EgorkaKulikov Oct 4, 2022
77194a3
Repeating SourceFolder fix (#1073)
Domonion Oct 4, 2022
0ff62da
Include information about triggered recursion to Javadocs (#1084)
onewhl Oct 4, 2022
e5d8b5f
Fix rendering for different IDE versions (#1087)
onewhl Oct 4, 2022
8016349
Fixed unavailable mock classes (#1066)
Damtev Oct 5, 2022
f55c96d
Engine process #2 (#1067)
Domonion Oct 5, 2022
f3af058
Remove unsat states from invokes (#1071)
CaelmBleidd Oct 5, 2022
e298169
Settings revision, 2nd iteration #977 (#1088)
Vassiliy-Kudryashov Oct 5, 2022
5a690b9
Fix soot initialization (#1090)
sergeypospelov Oct 5, 2022
cd3dcd1
Improve verification that static mocking is configured (#1091)
EgorkaKulikov Oct 5, 2022
b067af9
Fix assertions (#1096)
SBOne-Kenobi Oct 5, 2022
43efb96
Cancel test generation if compilation was not successful #1100 (#1103)
volivan239 Oct 5, 2022
bf272b6
Vassiliy kudryashov/1021 plugin support idea 20222 new (#1094)
Vassiliy-Kudryashov Oct 5, 2022
fc61391
Wrap method reference into @link tag only if the invoked method is no…
onewhl Oct 6, 2022
4ce788d
Notify and reason to the user that UtBot can't be run on the class in…
EgorkaKulikov Oct 6, 2022
0abc48b
Make snapshot version calendar-dependant (#1108)
Vassiliy-Kudryashov Oct 6, 2022
a215477
We create temporary files a lot, we have to clean it either (#1089)
Vassiliy-Kudryashov Oct 7, 2022
8280807
Get PsiClass' package by declaration in containingFile and not by its…
volivan239 Oct 7, 2022
8fb3938
Out of process bug fixes (#1109)
Domonion Oct 7, 2022
5fb1e16
Plugin setting to choose Kotlin generation doesn't work #1075 (#1110)
Vassiliy-Kudryashov Oct 7, 2022
ad150ba
Lessen thisInstance creation in parameterized test generation (#1065)
sofurihafe Oct 7, 2022
2f03687
Fix settings persistence: we save IDs, thus we should parse IDs inste…
Vassiliy-Kudryashov Oct 7, 2022
15bdfa8
Support Android Studio in utbot-intellij (#1121)
EgorkaKulikov Oct 10, 2022
166b393
Select Kotlin test src root by default when generating for Kotlin #94…
volivan239 Oct 10, 2022
c7618bb
Filter generated sources in Android Studio projects #692 (#1123)
EgorkaKulikov Oct 10, 2022
5479449
Exclude mocking javax (#1124)
SBOne-Kenobi Oct 10, 2022
06c548e
Linux engine process fix (#1126)
Domonion Oct 10, 2022
7e71d75
Android Studio troubleshooting related to Lombok improved (#1131)
EgorkaKulikov Oct 11, 2022
1a18c53
Other class is not mocked as required #747 (#1033)
Markoutte Oct 11, 2022
d1bea97
Add parameterized test generation in CI (#1114)
sofurihafe Oct 11, 2022
5181cef
Fix static mocking (#1142)
SBOne-Kenobi Oct 12, 2022
4706d1b
Added simple custom JavaDocs for the tests produced by Fuzzer (#1069)
amandelpie Oct 12, 2022
d36b988
Concrete execution fails for a static method using a static field #71…
Markoutte Oct 12, 2022
a55999d
Field assertions fixes (#920)
Damtev Oct 12, 2022
529c10d
Fix dump mode fail (#1146)
Domonion Oct 13, 2022
4470ea8
Refactor Sarif reports (#1152)
mmvpm Oct 13, 2022
d4cb666
Publish plugin and CLI for minor release (#1155)
viktoriia-fomina Oct 14, 2022
cad8133
Fixing long summarization timeouts & mics (#1151)
Domonion Oct 14, 2022
724b794
squash constraint model synthesis
AbdullinAM Sep 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Try to fix memory leak in CgComponents (#1057)
* Try to fix memory leak in CgFieldStateManager

* Removed unused testClassConstructors

* Make CgContext much more thin

* Clear content related maps before the processing of new test class
  • Loading branch information
EgorkaKulikov authored and AbdullinAM committed Oct 17, 2022
commit b6d8a65258e1f602f9a48417ce582d24d444f000
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,10 @@ internal interface CgContextOwner {

var statesCache: EnvironmentFieldStateCache

var allExecutions: List<UtExecution>
/**
* Result models required to create generic execution in parametrized tests.
*/
var successfulExecutionsModels: List<UtModel>

fun block(init: () -> Unit): Block {
val prevBlock = currentBlock
Expand Down Expand Up @@ -463,7 +466,7 @@ internal data class CgContext(
) : CgContextOwner {
override lateinit var statesCache: EnvironmentFieldStateCache
override lateinit var actual: CgVariable
override lateinit var allExecutions: List<UtExecution>
override lateinit var successfulExecutionsModels: List<UtModel>

/**
* This property cannot be accessed outside of test class file scope
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import org.utbot.framework.codegen.model.constructor.builtin.setAccessible
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
import org.utbot.framework.codegen.model.constructor.tree.CgCallableAccessManagerImpl.FieldAccessorSuitability.*
import org.utbot.framework.codegen.model.constructor.util.CgComponents
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getVariableConstructorBy
import org.utbot.framework.codegen.model.constructor.util.getAmbiguousOverloadsOf
import org.utbot.framework.codegen.model.constructor.util.importIfNeeded
import org.utbot.framework.codegen.model.constructor.util.isUtil
Expand Down Expand Up @@ -85,9 +86,9 @@ interface CgCallableAccessManager {
internal class CgCallableAccessManagerImpl(val context: CgContext) : CgCallableAccessManager,
CgContextOwner by context {

private val statementConstructor by lazy { CgComponents.getStatementConstructorBy(context) }
private val statementConstructor by lazy { getStatementConstructorBy(context) }

private val variableConstructor by lazy { CgComponents.getVariableConstructorBy(context) }
private val variableConstructor by lazy { getVariableConstructorBy(context) }

override operator fun CgExpression?.get(methodId: MethodId): CgIncompleteMethodCall =
CgIncompleteMethodCall(methodId, this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import org.utbot.framework.codegen.model.constructor.builtin.forName
import org.utbot.framework.codegen.model.constructor.builtin.getArrayElement
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
import org.utbot.framework.codegen.model.constructor.util.CgComponents
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getCallableAccessManagerBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
import org.utbot.framework.codegen.model.constructor.util.CgFieldState
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
import org.utbot.framework.codegen.model.constructor.util.FieldStateCache
Expand Down Expand Up @@ -44,8 +45,8 @@ internal interface CgFieldStateManager {
internal class CgFieldStateManagerImpl(val context: CgContext)
: CgContextOwner by context,
CgFieldStateManager,
CgCallableAccessManager by CgComponents.getCallableAccessManagerBy(context),
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
CgCallableAccessManager by getCallableAccessManagerBy(context),
CgStatementConstructor by getStatementConstructorBy(context) {

override fun rememberInitialEnvironmentState(info: StateModificationInfo) {
rememberThisInstanceState(info, FieldState.INITIAL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ import org.utbot.framework.codegen.model.constructor.builtin.invoke
import org.utbot.framework.codegen.model.constructor.builtin.newInstance
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
import org.utbot.framework.codegen.model.constructor.util.CgComponents
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getCallableAccessManagerBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getMockFrameworkManagerBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getNameGeneratorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getTestFrameworkManagerBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getVariableConstructorBy
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
import org.utbot.framework.codegen.model.constructor.util.EnvironmentFieldStateCache
import org.utbot.framework.codegen.model.constructor.util.FieldStateCache
Expand Down Expand Up @@ -112,15 +117,14 @@ import java.lang.reflect.ParameterizedType
private const val DEEP_EQUALS_MAX_DEPTH = 5 // TODO move it to plugin settings?

internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by context,
CgFieldStateManager by CgComponents.getFieldStateManagerBy(context),
CgCallableAccessManager by CgComponents.getCallableAccessManagerBy(context),
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
CgCallableAccessManager by getCallableAccessManagerBy(context),
CgStatementConstructor by getStatementConstructorBy(context) {

private val nameGenerator = CgComponents.getNameGeneratorBy(context)
private val testFrameworkManager = CgComponents.getTestFrameworkManagerBy(context)
private val nameGenerator = getNameGeneratorBy(context)
private val testFrameworkManager = getTestFrameworkManagerBy(context)

private val variableConstructor = CgComponents.getVariableConstructorBy(context)
private val mockFrameworkManager = CgComponents.getMockFrameworkManagerBy(context)
private val variableConstructor = getVariableConstructorBy(context)
private val mockFrameworkManager = getMockFrameworkManagerBy(context)

private val floatDelta: Float = 1e-6f
private val doubleDelta = 1e-6
Expand Down Expand Up @@ -905,13 +909,6 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
}

private fun collectExecutionsResultFields() {
val successfulExecutionsModels = allExecutions
.filter {
it.result is UtExecutionSuccess
}.map {
(it.result as UtExecutionSuccess).model
}

for (model in successfulExecutionsModels) {
when (model) {
is UtCompositeModel -> {
Expand Down Expand Up @@ -1245,6 +1242,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
rememberInitialStaticFields(statics)
val stateAnalyzer = ExecutionStateAnalyzer(execution)
val modificationInfo = stateAnalyzer.findModifiedFields()
val fieldStateManager = CgFieldStateManagerImpl(context)
// TODO: move such methods to another class and leave only 2 public methods: remember initial and final states
val mainBody = {
substituteStaticFields(statics)
Expand All @@ -1258,10 +1256,10 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
val name = paramNames[executableId]?.get(index)
methodArguments += variableConstructor.getOrCreateVariable(param, name)
}
rememberInitialEnvironmentState(modificationInfo)
fieldStateManager.rememberInitialEnvironmentState(modificationInfo)
recordActualResult()
generateResultAssertions()
rememberFinalEnvironmentState(modificationInfo)
fieldStateManager.rememberFinalEnvironmentState(modificationInfo)
generateFieldStateAssertions()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package org.utbot.framework.codegen.model.constructor.tree

import org.utbot.common.appendHtmlLine
import org.utbot.framework.codegen.Junit4
import org.utbot.framework.codegen.Junit5
import org.utbot.framework.codegen.ParametrizedTestSource
import org.utbot.framework.codegen.TestNg
import org.utbot.framework.codegen.model.constructor.CgMethodTestSet
import org.utbot.framework.codegen.model.constructor.TestClassModel
import org.utbot.framework.codegen.model.constructor.builtin.TestClassUtilMethodProvider
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
import org.utbot.framework.codegen.model.constructor.util.CgComponents
import org.utbot.framework.codegen.model.constructor.name.CgNameGenerator
import org.utbot.framework.codegen.model.constructor.name.CgNameGeneratorImpl
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.clearContextRelatedStorage
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getMethodConstructorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getNameGeneratorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getStatementConstructorBy
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor.CgComponents.getTestFrameworkManagerBy
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructor
import org.utbot.framework.codegen.model.tree.CgMethod
import org.utbot.framework.codegen.model.constructor.util.CgStatementConstructorImpl
import org.utbot.framework.codegen.model.tree.CgAuxiliaryClass
import org.utbot.framework.codegen.model.tree.CgExecutableUnderTestCluster
import org.utbot.framework.codegen.model.tree.CgMethod
import org.utbot.framework.codegen.model.tree.CgParameterDeclaration
import org.utbot.framework.codegen.model.tree.CgRegion
import org.utbot.framework.codegen.model.tree.CgSimpleRegion
Expand All @@ -18,32 +29,32 @@ import org.utbot.framework.codegen.model.tree.CgTestClass
import org.utbot.framework.codegen.model.tree.CgTestClassFile
import org.utbot.framework.codegen.model.tree.CgTestMethod
import org.utbot.framework.codegen.model.tree.CgTestMethodCluster
import org.utbot.framework.codegen.model.tree.CgTestMethodType.*
import org.utbot.framework.codegen.model.tree.CgTripleSlashMultilineComment
import org.utbot.framework.codegen.model.tree.CgUtilEntity
import org.utbot.framework.codegen.model.tree.CgUtilMethod
import org.utbot.framework.codegen.model.tree.buildTestClass
import org.utbot.framework.codegen.model.tree.buildTestClassBody
import org.utbot.framework.codegen.model.tree.buildTestClassFile
import org.utbot.framework.codegen.model.visitor.importUtilMethodDependencies
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.ExecutableId
import org.utbot.framework.plugin.api.MethodId
import org.utbot.framework.plugin.api.UtExecutionSuccess
import org.utbot.framework.plugin.api.UtMethodTestSet
import org.utbot.framework.codegen.model.constructor.TestClassModel
import org.utbot.framework.codegen.model.tree.CgAuxiliaryClass
import org.utbot.framework.codegen.model.tree.CgUtilEntity
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.util.description
import org.utbot.framework.plugin.api.util.humanReadableName
import org.utbot.framework.plugin.api.util.kClass
import kotlin.reflect.KClass

internal class CgTestClassConstructor(val context: CgContext) :
CgContextOwner by context,
CgStatementConstructor by CgComponents.getStatementConstructorBy(context) {
CgStatementConstructor by getStatementConstructorBy(context) {

init {
clearContextRelatedStorage()
}

private val methodConstructor = CgComponents.getMethodConstructorBy(context)
private val nameGenerator = CgComponents.getNameGeneratorBy(context)
private val testFrameworkManager = CgComponents.getTestFrameworkManagerBy(context)
private val methodConstructor = getMethodConstructorBy(context)
private val nameGenerator = getNameGeneratorBy(context)
private val testFrameworkManager = getTestFrameworkManagerBy(context)

private val testsGenerationReport: TestsGenerationReport = TestsGenerationReport()

Expand Down Expand Up @@ -124,7 +135,10 @@ internal class CgTestClassConstructor(val context: CgContext) :
return null
}

allExecutions = testSet.executions
successfulExecutionsModels = testSet
.executions
.filter { it.result is UtExecutionSuccess }
.map { (it.result as UtExecutionSuccess).model }

val (methodUnderTest, _, _, clustersInfo) = testSet
val regions = mutableListOf<CgRegion<CgMethod>>()
Expand Down Expand Up @@ -275,106 +289,45 @@ internal class CgTestClassConstructor(val context: CgContext) :
*/
private val CgMethodTestSet.allErrors: Map<String, Int>
get() = errors + codeGenerationErrors.getOrDefault(this, mapOf())
}

typealias MethodGeneratedTests = MutableMap<ExecutableId, MutableSet<CgTestMethod>>
typealias ErrorsCount = Map<String, Int>

data class TestsGenerationReport(
val executables: MutableSet<ExecutableId> = mutableSetOf(),
var successfulExecutions: MethodGeneratedTests = mutableMapOf(),
var timeoutExecutions: MethodGeneratedTests = mutableMapOf(),
var failedExecutions: MethodGeneratedTests = mutableMapOf(),
var crashExecutions: MethodGeneratedTests = mutableMapOf(),
var errors: MutableMap<ExecutableId, ErrorsCount> = mutableMapOf()
) {
val classUnderTest: KClass<*>
get() = executables.firstOrNull()?.classId?.kClass
?: error("No executables found in test report")

val initialWarnings: MutableList<() -> String> = mutableListOf()
val hasWarnings: Boolean
get() = initialWarnings.isNotEmpty()

val detailedStatistics: String
get() = buildString {
appendHtmlLine("Class: ${classUnderTest.qualifiedName}")
val testMethodsStatistic = executables.map { it.countTestMethods() }
val errors = executables.map { it.countErrors() }
val overallErrors = errors.sum()

appendHtmlLine("Successful test methods: ${testMethodsStatistic.sumBy { it.successful }}")
appendHtmlLine(
"Failing because of unexpected exception test methods: ${testMethodsStatistic.sumBy { it.failing }}"
)
appendHtmlLine(
"Failing because of exceeding timeout test methods: ${testMethodsStatistic.sumBy { it.timeout }}"
)
appendHtmlLine(
"Failing because of possible JVM crash test methods: ${testMethodsStatistic.sumBy { it.crashes }}"
)
appendHtmlLine("Not generated because of internal errors test methods: $overallErrors")
internal object CgComponents {
/**
* Clears all stored data for current [CgContext].
* As far as context is created per class under test,
* no related data is required after it's processing.
*/
fun clearContextRelatedStorage() {
nameGenerators.clear()
statementConstructors.clear()
callableAccessManagers.clear()
testFrameworkManagers.clear()
mockFrameworkManagers.clear()
variableConstructors.clear()
methodConstructors.clear()
}

fun addMethodErrors(testSet: CgMethodTestSet, errors: Map<String, Int>) {
this.errors[testSet.executableId] = errors
}
private val nameGenerators: MutableMap<CgContext, CgNameGenerator> = mutableMapOf()
private val statementConstructors: MutableMap<CgContext, CgStatementConstructor> = mutableMapOf()
private val callableAccessManagers: MutableMap<CgContext, CgCallableAccessManager> = mutableMapOf()
private val testFrameworkManagers: MutableMap<CgContext, TestFrameworkManager> = mutableMapOf()
private val mockFrameworkManagers: MutableMap<CgContext, MockFrameworkManager> = mutableMapOf()

fun addTestsByType(testSet: CgMethodTestSet, testMethods: List<CgTestMethod>) {
with(testSet.executableId) {
executables += this

testMethods.forEach {
when (it.type) {
SUCCESSFUL -> updateExecutions(it, successfulExecutions)
FAILING -> updateExecutions(it, failedExecutions)
TIMEOUT -> updateExecutions(it, timeoutExecutions)
CRASH -> updateExecutions(it, crashExecutions)
PARAMETRIZED -> {
// Parametrized tests are not supported in the tests report yet
// TODO JIRA:1507
}
}
}
}
}

fun toString(isShort: Boolean): String = buildString {
appendHtmlLine("Target: ${classUnderTest.qualifiedName}")
if (initialWarnings.isNotEmpty()) {
initialWarnings.forEach { appendHtmlLine(it()) }
appendHtmlLine()
}

val testMethodsStatistic = executables.map { it.countTestMethods() }
val overallTestMethods = testMethodsStatistic.sumBy { it.count }
private val variableConstructors: MutableMap<CgContext, CgVariableConstructor> = mutableMapOf()
private val methodConstructors: MutableMap<CgContext, CgMethodConstructor> = mutableMapOf()

appendHtmlLine("Overall test methods: $overallTestMethods")
fun getNameGeneratorBy(context: CgContext) = nameGenerators.getOrPut(context) { CgNameGeneratorImpl(context) }
fun getCallableAccessManagerBy(context: CgContext) = callableAccessManagers.getOrPut(context) { CgCallableAccessManagerImpl(context) }
fun getStatementConstructorBy(context: CgContext) = statementConstructors.getOrPut(context) { CgStatementConstructorImpl(context) }

if (!isShort) {
appendHtmlLine(detailedStatistics)
fun getTestFrameworkManagerBy(context: CgContext) = when (context.testFramework) {
is Junit4 -> testFrameworkManagers.getOrPut(context) { Junit4Manager(context) }
is Junit5 -> testFrameworkManagers.getOrPut(context) { Junit5Manager(context) }
is TestNg -> testFrameworkManagers.getOrPut(context) { TestNgManager(context) }
}
}

override fun toString(): String = toString(false)

private fun ExecutableId.countTestMethods(): TestMethodStatistic = TestMethodStatistic(
testMethodsNumber(successfulExecutions),
testMethodsNumber(failedExecutions),
testMethodsNumber(timeoutExecutions),
testMethodsNumber(crashExecutions)
)

private fun ExecutableId.countErrors(): Int = errors.getOrDefault(this, emptyMap()).values.sum()

private fun ExecutableId.testMethodsNumber(executables: MethodGeneratedTests): Int =
executables.getOrDefault(this, emptySet()).size

private fun ExecutableId.updateExecutions(it: CgTestMethod, executions: MethodGeneratedTests) {
executions.getOrPut(this) { mutableSetOf() } += it
}

private data class TestMethodStatistic(val successful: Int, val failing: Int, val timeout: Int, val crashes: Int) {
val count: Int = successful + failing + timeout + crashes
fun getMockFrameworkManagerBy(context: CgContext) = mockFrameworkManagers.getOrPut(context) { MockFrameworkManager(context) }
fun getVariableConstructorBy(context: CgContext) = variableConstructors.getOrPut(context) { CgVariableConstructor(context) }
fun getMethodConstructorBy(context: CgContext) = methodConstructors.getOrPut(context) { CgMethodConstructor(context) }
}
}

Loading