@@ -10,6 +10,9 @@ import org.utbot.framework.codegen.ParametrizedTestSource
10
10
import org.utbot.framework.codegen.StaticsMocking
11
11
import org.utbot.framework.codegen.TestFramework
12
12
import org.utbot.framework.codegen.model.CodeGenerator
13
+ import org.utbot.framework.codegen.model.CodeGeneratorResult
14
+ import org.utbot.framework.codegen.model.UtilClassKind
15
+ import org.utbot.framework.codegen.model.UtilClassKind.Companion.UT_UTILS_CLASS_NAME
13
16
import org.utbot.framework.plugin.api.CodegenLanguage
14
17
import org.utbot.framework.plugin.api.ExecutableId
15
18
import org.utbot.framework.plugin.api.MockFramework
@@ -19,6 +22,8 @@ import org.utbot.framework.plugin.api.util.UtContext
19
22
import org.utbot.framework.plugin.api.util.description
20
23
import org.utbot.framework.plugin.api.util.id
21
24
import org.utbot.framework.plugin.api.util.withUtContext
25
+ import java.io.File
26
+ import java.nio.file.Path
22
27
import kotlin.reflect.KClass
23
28
24
29
private val logger = KotlinLogging .logger {}
@@ -75,7 +80,8 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
75
80
val codegenLanguage = testFrameworkConfiguration.codegenLanguage
76
81
val parametrizedTestSource = testFrameworkConfiguration.parametrizedTestSource
77
82
78
- val testClass = callToCodeGenerator(testSets, classUnderTest)
83
+ val codeGenerationResult = callToCodeGenerator(testSets, classUnderTest)
84
+ val testClass = codeGenerationResult.generatedCode
79
85
80
86
// actual number of the tests in the generated testClass
81
87
val generatedMethodsCount = testClass
@@ -149,17 +155,33 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
149
155
150
156
val testClassName = classPipeline.retrieveTestClassName(" BrokenGeneratedTest" )
151
157
val generatedTestFile = writeTest(testClass, testClassName, buildDirectory, codegenLanguage)
158
+ val generatedUtilClassFile = codeGenerationResult.utilClassKind?.writeUtilClassToFile(buildDirectory, codegenLanguage)
152
159
153
160
logger.error(" Broken test has been written to the file: [$generatedTestFile ]" )
161
+ if (generatedUtilClassFile != null ) {
162
+ logger.error(" Util class for the broken test has been written to the file: [$generatedUtilClassFile ]" )
163
+ }
154
164
logger.error(" Failed configuration: $testFrameworkConfiguration " )
155
165
156
166
throw it
157
167
}
158
168
159
- classPipeline.stageContext = copy(data = testClass , stages = stages + information.completeStage())
169
+ classPipeline.stageContext = copy(data = codeGenerationResult , stages = stages + information.completeStage())
160
170
}
161
171
}
162
172
173
+ private fun UtilClassKind.writeUtilClassToFile (buildDirectory : Path , language : CodegenLanguage ): File {
174
+ val utilClassFile = File (buildDirectory.toFile(), " $UT_UTILS_CLASS_NAME${language.extension} " )
175
+ val utilClassText = getUtilClassText(language)
176
+ return writeFile(utilClassText, utilClassFile)
177
+ }
178
+
179
+ private data class GeneratedTestClassInfo (
180
+ val testClassName : String ,
181
+ val generatedTestFile : File ,
182
+ val generatedUtilClassFile : File ?
183
+ )
184
+
163
185
@Suppress(" UNCHECKED_CAST" )
164
186
private fun processCompilationStages (classesPipelines : List <ClassPipeline >) {
165
187
val information = StageExecutionInformation (Compilation )
@@ -169,24 +191,34 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
169
191
val codegenLanguage = testFrameworkConfiguration.codegenLanguage
170
192
171
193
val testClassesNamesToTestGeneratedTests = classesPipelines.map { classPipeline ->
172
- val testClass = classPipeline.stageContext.data as String
194
+ val codeGeneratorResult = classPipeline.stageContext.data as CodeGeneratorResult // String
195
+ val testClass = codeGeneratorResult.generatedCode
196
+
173
197
val testClassName = classPipeline.retrieveTestClassName(" GeneratedTest" )
174
198
val generatedTestFile = writeTest(testClass, testClassName, buildDirectory, codegenLanguage)
199
+ val generatedUtilClassFile = codeGeneratorResult.utilClassKind?.writeUtilClassToFile(buildDirectory, codegenLanguage)
175
200
176
201
logger.info(" Test has been written to the file: [$generatedTestFile ]" )
202
+ if (generatedUtilClassFile != null ) {
203
+ logger.info(" Util class for the test has been written to the file: [$generatedUtilClassFile ]" )
204
+ }
177
205
178
- testClassName to generatedTestFile
206
+ GeneratedTestClassInfo ( testClassName, generatedTestFile, generatedUtilClassFile)
179
207
}
180
208
209
+ val sourceFiles = mutableListOf<String >().apply {
210
+ this + = testClassesNamesToTestGeneratedTests.map { it.generatedTestFile.absolutePath }
211
+ this + = testClassesNamesToTestGeneratedTests.mapNotNull { it.generatedUtilClassFile?.absolutePath }
212
+ }
181
213
compileTests(
182
214
" $buildDirectory " ,
183
- testClassesNamesToTestGeneratedTests.map { it.second.absolutePath } ,
215
+ sourceFiles ,
184
216
codegenLanguage
185
217
)
186
218
187
- testClassesNamesToTestGeneratedTests.zip(classesPipelines) { testClassNameToTest , classPipeline ->
219
+ testClassesNamesToTestGeneratedTests.zip(classesPipelines) { generatedTestClassInfo , classPipeline ->
188
220
classPipeline.stageContext = classPipeline.stageContext.copy(
189
- data = CompilationResult (" $buildDirectory " , testClassNameToTest.first ),
221
+ data = CompilationResult (" $buildDirectory " , generatedTestClassInfo.testClassName ),
190
222
stages = classPipeline.stageContext.stages + information.completeStage()
191
223
)
192
224
}
@@ -224,7 +256,7 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
224
256
private fun callToCodeGenerator (
225
257
testSets : List <UtMethodTestSet >,
226
258
classUnderTest : KClass <* >
227
- ): String {
259
+ ): CodeGeneratorResult {
228
260
val params = mutableMapOf<ExecutableId , List <String >>()
229
261
230
262
val codeGenerator = with (testFrameworkConfiguration) {
@@ -244,7 +276,7 @@ class TestCodeGeneratorPipeline(private val testFrameworkConfiguration: TestFram
244
276
}
245
277
val testClassCustomName = " ${classUnderTest.java.simpleName} GeneratedTest"
246
278
247
- return codeGenerator.generateAsString (testSets, testClassCustomName)
279
+ return codeGenerator.generateAsStringWithTestReport (testSets, testClassCustomName)
248
280
}
249
281
250
282
private fun checkPipelinesResults (classesPipelines : List <ClassPipeline >) {
0 commit comments