Skip to content

Commit d82bb4e

Browse files
committed
Refactoring
1 parent 662e4d3 commit d82bb4e

File tree

1 file changed

+50
-67
lines changed

1 file changed

+50
-67
lines changed

utbot-testing/src/main/kotlin/org/utbot/testing/TestCodeGeneratorPipeline.kt

Lines changed: 50 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.utbot.testing
22

33
import mu.KotlinLogging
4+
import org.junit.jupiter.api.Assertions.assertFalse
45
import org.junit.jupiter.api.Assertions.assertTrue
56
import org.utbot.common.FileUtil
67
import org.utbot.common.measureTime
@@ -37,34 +38,30 @@ class TestCodeGeneratorPipeline(private val testInfrastructureConfiguration: Tes
3738
checkPipelinesResults(pipeline)
3839
}
3940

40-
private fun runPipelinesStages(classPipeline: ClassPipeline): List<CodeGenerationResult> {
41-
val classesPipelines = listOf(classPipeline)
42-
val classesPipelinesNames = classesPipelines.joinToString(" ") {
43-
val classUnderTest = it.stageContext.classUnderTest
41+
private fun runPipelinesStages(classPipeline: ClassPipeline): CodeGenerationResult {
42+
val classUnderTest = classPipeline.stageContext.classUnderTest
43+
val classPipelineName =
4444
classUnderTest.qualifiedName ?: error("${classUnderTest.simpleName} doesn't have a fqn name")
45-
}
4645

4746
logger
4847
.info()
49-
.measureTime({ "Executing code generation tests for [$classesPipelinesNames]" }) {
50-
CodeGeneration.filterPipelines(classesPipelines).forEach {
48+
.measureTime({ "Executing code generation tests for [$classPipelineName]" }) {
49+
CodeGeneration.verifyPipeline(classPipeline)?.let {
5150
withUtContext(UtContext(it.stageContext.classUnderTest.java.classLoader)) {
5251
processCodeGenerationStage(it)
5352
}
5453
}
5554

56-
Compilation.filterPipelines(classesPipelines).let {
57-
if (it.isNotEmpty()) processCompilationStages(it)
55+
Compilation.verifyPipeline(classPipeline)?.let {
56+
processCompilationStages(it)
5857
}
5958

60-
TestExecution.filterPipelines(classesPipelines).let {
61-
if (it.isNotEmpty()) processTestExecutionStages(it)
59+
TestExecution.verifyPipeline(classPipeline)?.let {
60+
processTestExecutionStages(it)
6261
}
6362

64-
return classesPipelines.map {
65-
with(it.stageContext) {
66-
CodeGenerationResult(classUnderTest, numberOfTestCases, stages)
67-
}
63+
return with(classPipeline.stageContext) {
64+
CodeGenerationResult(classUnderTest, numberOfTestCases, stages)
6865
}
6966
}
7067
}
@@ -181,18 +178,17 @@ class TestCodeGeneratorPipeline(private val testInfrastructureConfiguration: Tes
181178
)
182179

183180
@Suppress("UNCHECKED_CAST")
184-
private fun processCompilationStages(classesPipelines: List<ClassPipeline>) {
181+
private fun processCompilationStages(classesPipeline: ClassPipeline) {
185182
val information = StageExecutionInformation(Compilation)
186-
val classes = classesPipelines.retrieveClasses()
183+
val classes = listOf(classesPipeline).retrieveClasses()
187184
val buildDirectory = classes.createBuildDirectory()
188185

189186
val codegenLanguage = testInfrastructureConfiguration.codegenLanguage
190187

191-
val testClassesNamesToTestGeneratedTests = classesPipelines.map { classPipeline ->
192-
val codeGeneratorResult = classPipeline.stageContext.data as CodeGeneratorResult//String
188+
val codeGeneratorResult = classesPipeline.stageContext.data as CodeGeneratorResult//String
193189
val testClass = codeGeneratorResult.generatedCode
194190

195-
val testClassName = classPipeline.retrieveTestClassName("GeneratedTest")
191+
val testClassName = classesPipeline.retrieveTestClassName("GeneratedTest")
196192
val generatedTestFile = writeTest(testClass, testClassName, buildDirectory, codegenLanguage)
197193
val generatedUtilClassFile = codeGeneratorResult.utilClassKind?.writeUtilClassToFile(buildDirectory, codegenLanguage)
198194

@@ -201,25 +197,23 @@ class TestCodeGeneratorPipeline(private val testInfrastructureConfiguration: Tes
201197
logger.info("Util class for the test has been written to the file: [$generatedUtilClassFile]")
202198
}
203199

204-
GeneratedTestClassInfo(testClassName, generatedTestFile, generatedUtilClassFile)
205-
}
200+
val testClassesNamesToTestGeneratedTests = GeneratedTestClassInfo(testClassName, generatedTestFile, generatedUtilClassFile)
201+
206202

207203
val sourceFiles = mutableListOf<String>().apply {
208-
this += testClassesNamesToTestGeneratedTests.map { it.generatedTestFile.absolutePath }
209-
this += testClassesNamesToTestGeneratedTests.mapNotNull { it.generatedUtilClassFile?.absolutePath }
204+
testClassesNamesToTestGeneratedTests.generatedTestFile.absolutePath?.let { this += it }
205+
testClassesNamesToTestGeneratedTests.generatedUtilClassFile?.absolutePath?.let { this += it }
210206
}
211207
compileTests(
212208
"$buildDirectory",
213209
sourceFiles,
214210
codegenLanguage
215211
)
216212

217-
testClassesNamesToTestGeneratedTests.zip(classesPipelines) { generatedTestClassInfo, classPipeline ->
218-
classPipeline.stageContext = classPipeline.stageContext.copy(
219-
data = CompilationResult("$buildDirectory", generatedTestClassInfo.testClassName),
220-
stages = classPipeline.stageContext.stages + information.completeStage()
221-
)
222-
}
213+
classesPipeline.stageContext = classesPipeline.stageContext.copy(
214+
data = CompilationResult("$buildDirectory", testClassesNamesToTestGeneratedTests.testClassName),
215+
stages = classesPipeline.stageContext.stages + information.completeStage()
216+
)
223217
}
224218

225219
/**
@@ -235,21 +229,20 @@ class TestCodeGeneratorPipeline(private val testInfrastructureConfiguration: Tes
235229
private fun List<ClassPipeline>.retrieveClasses() = map { it.stageContext.classUnderTest.java }
236230

237231
@Suppress("UNCHECKED_CAST")
238-
private fun processTestExecutionStages(classesPipelines: List<ClassPipeline>) {
232+
private fun processTestExecutionStages(classesPipeline: ClassPipeline) {
239233
val information = StageExecutionInformation(TestExecution)
240-
val buildDirectory = (classesPipelines.first().stageContext.data as CompilationResult).buildDirectory
241-
val testClassesNames = classesPipelines.map { classPipeline ->
242-
(classPipeline.stageContext.data as CompilationResult).testClassName
243-
}
234+
val compilationResult = classesPipeline.stageContext.data as CompilationResult
235+
val buildDirectory = compilationResult.buildDirectory
236+
val testClassesNames = listOf(compilationResult.testClassName)
237+
244238
with(testInfrastructureConfiguration) {
245239
runTests(buildDirectory, testClassesNames, testFramework, codegenLanguage)
246240
}
247-
classesPipelines.forEach {
248-
it.stageContext = it.stageContext.copy(
241+
242+
classesPipeline.stageContext = classesPipeline.stageContext.copy(
249243
data = Unit,
250-
stages = it.stageContext.stages + information.completeStage()
244+
stages = classesPipeline.stageContext.stages + information.completeStage()
251245
)
252-
}
253246
}
254247

255248
private fun callToCodeGenerator(
@@ -308,35 +301,27 @@ class TestCodeGeneratorPipeline(private val testInfrastructureConfiguration: Tes
308301
}
309302

310303
private fun checkPipelinesResults(classesPipeline: ClassPipeline) {
311-
val results = runPipelinesStages(classesPipeline)
312-
val classesChecks = classesPipeline.stageContext.classUnderTest to listOf(classesPipeline.check)
313-
processResults(results, listOf(classesChecks))
304+
val result = runPipelinesStages(classesPipeline)
305+
val classChecks = classesPipeline.stageContext.classUnderTest to listOf(classesPipeline.check)
306+
processResults(result, classChecks)
314307
}
315308

316309
private fun processResults(
317-
results: List<CodeGenerationResult>,
318-
classesChecks: List<Pair<KClass<*>, List<StageStatusCheck>>>
310+
result: CodeGenerationResult,
311+
classChecks: Pair<KClass<*>, List<StageStatusCheck>>
319312
) {
320-
val transformedResults: List<Pair<KClass<*>, List<String>>> =
321-
results.zip(classesChecks) { result, classChecks ->
322-
val stageStatusChecks = classChecks.second.mapNotNull { check ->
323-
runCatching { check(result) }
324-
.fold(
325-
onSuccess = { if (it) null else check.description },
326-
onFailure = { it.description }
327-
)
328-
}
329-
result.classUnderTest to stageStatusChecks
330-
}
331-
val failedResults = transformedResults.filter { it.second.isNotEmpty() }
332-
333-
assertTrue(failedResults.isEmpty()) {
334-
val separator = "\n\t\t"
335-
val failedResultsConcatenated = failedResults.joinToString(separator, prefix = separator) {
336-
"${it.first.simpleName} : ${it.second.joinToString()}"
337-
}
313+
val stageStatusChecks = classChecks.second.mapNotNull { check ->
314+
runCatching { check(result) }
315+
.fold(
316+
onSuccess = { if (it) null else check.description },
317+
onFailure = { it.description }
318+
)
319+
}
320+
val transformedResult: Pair<KClass<*>, List<String>> = result.classUnderTest to stageStatusChecks
321+
val failedResultExists = transformedResult.second.isNotEmpty()
338322

339-
"There are failed checks: $failedResultsConcatenated"
323+
assertFalse(failedResultExists) {
324+
"There are failed checks: ${transformedResult.second}"
340325
}
341326
}
342327

@@ -377,10 +362,8 @@ enum class ExecutionStatus {
377362
sealed class Stage(private val name: String, val nextStage: Stage?) {
378363
override fun toString() = name
379364

380-
fun filterPipelines(classesPipelines: List<ClassPipeline>): List<ClassPipeline> =
381-
classesPipelines.filter {
382-
it.check.firstStage <= this && it.check.lastStage >= this
383-
}
365+
fun verifyPipeline(classesPipeline: ClassPipeline): ClassPipeline? =
366+
if (classesPipeline.check.firstStage <= this && classesPipeline.check.lastStage >= this) classesPipeline else null
384367

385368
abstract operator fun compareTo(stage: Stage): Int
386369
}

0 commit comments

Comments
 (0)