11package org.utbot.testing
22
33import mu.KotlinLogging
4+ import org.junit.jupiter.api.Assertions.assertFalse
45import org.junit.jupiter.api.Assertions.assertTrue
56import org.utbot.common.FileUtil
67import 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 {
377362sealed 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