Skip to content

Commit d2200d8

Browse files
committed
Generate separated parametrized tests for test sets with different result type
1 parent 45e687e commit d2200d8

File tree

3 files changed

+59
-20
lines changed

3 files changed

+59
-20
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ data class UtMethodTestSet(
9898
val clustersInfo: List<Pair<UtClusterInfo?, IntRange>> = listOf(null to executions.indices)
9999
)
100100

101-
data class CgMethodTestSet private constructor(
101+
data class CgMethodTestSet internal constructor(
102102
val executableId: ExecutableId,
103103
val executions: List<UtExecution> = emptyList(),
104104
val jimpleBody: JimpleBody? = null,
@@ -114,6 +114,10 @@ data class CgMethodTestSet private constructor(
114114
)
115115
}
116116

117+
fun CgMethodTestSet.substituteExecutions(executions: List<UtExecution>): CgMethodTestSet {
118+
return CgMethodTestSet(this.executableId, executions, this.jimpleBody, this.errors, this.clustersInfo)
119+
}
120+
117121
data class Step(
118122
val stmt: Stmt,
119123
val depth: Int,

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

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import org.utbot.framework.codegen.model.visitor.importUtilMethodDependencies
2626
import org.utbot.framework.plugin.api.CgMethodTestSet
2727
import org.utbot.framework.plugin.api.ExecutableId
2828
import org.utbot.framework.plugin.api.MethodId
29+
import org.utbot.framework.plugin.api.UtExecutionSuccess
2930
import org.utbot.framework.plugin.api.UtMethodTestSet
31+
import org.utbot.framework.plugin.api.substituteExecutions
3032
import org.utbot.framework.plugin.api.util.description
3133
import org.utbot.framework.plugin.api.util.kClass
3234
import kotlin.reflect.KClass
@@ -107,22 +109,29 @@ internal class CgTestClassConstructor(val context: CgContext) :
107109
}
108110
}
109111
ParametrizedTestSource.PARAMETRIZE -> {
110-
runCatching {
111-
val dataProviderMethodName = nameGenerator.dataProviderMethodNameFor(testSet.executableId)
112-
113-
val parameterizedTestMethod =
114-
methodConstructor.createParameterizedTestMethod(testSet, dataProviderMethodName)
115-
116-
requiredFields += parameterizedTestMethod.requiredFields
117-
118-
cgDataProviderMethods +=
119-
methodConstructor.createParameterizedTestDataProvider(testSet, dataProviderMethodName)
120-
121-
regions += CgSimpleRegion(
122-
"Parameterized test for method ${methodUnderTest.displayName}",
123-
listOf(parameterizedTestMethod),
112+
val groupedExecutions = executions
113+
.filter { it.result is UtExecutionSuccess }
114+
.groupBy { (it.result as UtExecutionSuccess).model.classId }
115+
116+
if (groupedExecutions.isEmpty()) {
117+
processParametrizedTestSet(
118+
testSet,
119+
requiredFields,
120+
regions,
121+
methodUnderTest,
124122
)
125-
}.onFailure { error -> processFailure(testSet, error) }
123+
} else {
124+
for (executionsGroup in groupedExecutions.values) {
125+
val testSet = testSet.substituteExecutions(executionsGroup)
126+
127+
processParametrizedTestSet(
128+
testSet,
129+
requiredFields,
130+
regions,
131+
methodUnderTest,
132+
)
133+
}
134+
}
126135
}
127136
}
128137

@@ -141,6 +150,30 @@ internal class CgTestClassConstructor(val context: CgContext) :
141150
.merge(failure.description, 1, Int::plus)
142151
}
143152

153+
private fun processParametrizedTestSet(
154+
testSet: CgMethodTestSet,
155+
requiredFields: MutableList<CgParameterDeclaration>,
156+
regions: MutableList<CgRegion<CgMethod>>,
157+
methodUnderTest: ExecutableId,
158+
) {
159+
runCatching {
160+
val dataProviderMethodName = nameGenerator.dataProviderMethodNameFor(testSet.executableId)
161+
162+
val parameterizedTestMethod =
163+
methodConstructor.createParameterizedTestMethod(testSet, dataProviderMethodName)
164+
165+
requiredFields += parameterizedTestMethod.requiredFields
166+
167+
cgDataProviderMethods +=
168+
methodConstructor.createParameterizedTestDataProvider(testSet, dataProviderMethodName)
169+
170+
regions += CgSimpleRegion(
171+
"Parameterized test for method ${methodUnderTest.displayName}",
172+
listOf(parameterizedTestMethod),
173+
)
174+
}.onFailure { error -> processFailure(testSet, error) }
175+
}
176+
144177
// TODO: collect imports of util methods
145178
private fun createUtilMethods(): List<CgUtilMethod> {
146179
val utilMethods = mutableListOf<CgUtilMethod>()

utbot-framework/src/test/kotlin/org/utbot/framework/codegen/TestCodeGeneratorPipeline.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,12 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
129129
"Errors regions has been generated: $errorText"
130130
}
131131

132-
require(generatedMethodsCount == expectedNumberOfGeneratedMethods) {
133-
"Something went wrong during the code generation for ${classUnderTest.simpleName}. " +
134-
"Expected to generate $expectedNumberOfGeneratedMethods test methods, " +
135-
"but got only $generatedMethodsCount"
132+
if (parametrizedTestSource != ParametrizedTestSource.PARAMETRIZE) {
133+
require(generatedMethodsCount == expectedNumberOfGeneratedMethods) {
134+
"Something went wrong during the code generation for ${classUnderTest.simpleName}. " +
135+
"Expected to generate $expectedNumberOfGeneratedMethods test methods, " +
136+
"but got only $generatedMethodsCount"
137+
}
136138
}
137139
}.onFailure {
138140
val classes = listOf(classPipeline).retrieveClasses()

0 commit comments

Comments
 (0)