@@ -49,7 +49,9 @@ import org.utbot.framework.codegen.model.tree.CgLiteral
49
49
import org.utbot.framework.codegen.model.tree.CgMethod
50
50
import org.utbot.framework.codegen.model.tree.CgMethodCall
51
51
import org.utbot.framework.codegen.model.tree.CgMultilineComment
52
+ import org.utbot.framework.codegen.model.tree.CgNotNullAssertion
52
53
import org.utbot.framework.codegen.model.tree.CgParameterDeclaration
54
+ import org.utbot.framework.codegen.model.tree.CgParameterType
53
55
import org.utbot.framework.codegen.model.tree.CgParameterizedTestDataProviderMethod
54
56
import org.utbot.framework.codegen.model.tree.CgRegion
55
57
import org.utbot.framework.codegen.model.tree.CgReturnStatement
@@ -144,6 +146,7 @@ import org.utbot.framework.plugin.api.util.isInnerClassEnclosingClassReference
144
146
import org.utbot.framework.plugin.api.util.isIterableOrMap
145
147
import org.utbot.framework.plugin.api.util.isPrimitive
146
148
import org.utbot.framework.plugin.api.util.isPrimitiveArray
149
+ import org.utbot.framework.plugin.api.util.isRefType
147
150
import org.utbot.framework.plugin.api.util.jClass
148
151
import org.utbot.framework.plugin.api.util.kClass
149
152
import org.utbot.framework.plugin.api.util.longClassId
@@ -450,28 +453,23 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
450
453
} else {
451
454
resultModel = result
452
455
453
- val expected = variableConstructor.parameterizedVariable(
454
- result.classId,
455
- expectedResultVarName,
456
- isNotNull = true
457
- )
458
-
459
- val actualVariableName = when (codegenLanguage) {
460
- CodegenLanguage .JAVA -> when (method.returnType) {
461
- intClassId -> " ${intWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
462
- shortClassId -> " ${shortWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
463
- longClassId -> " ${longWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
464
- byteClassId -> " ${byteWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
465
- booleanClassId -> " ${booleanWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
466
- charClassId -> " ${charWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
467
- floatClassId -> " ${floatWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
468
- doubleWrapperClassId -> " ${doubleWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
469
- else -> " actual"
470
- }
471
- CodegenLanguage .KOTLIN -> " actual"
472
- }
473
-
474
- assertEquality(expected, CgVariable (actualVariableName, method.returnType))
456
+ val expected = CgNotNullAssertion (currentMethodParameters[CgParameterType .ExpectedResult ]!! )
457
+
458
+ // val actualVariableName = when (codegenLanguage) {
459
+ // CodegenLanguage.JAVA -> when (method.returnType) {
460
+ // intClassId -> "${intWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
461
+ // shortClassId -> "${shortWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
462
+ // longClassId -> "${longWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
463
+ // byteClassId -> "${byteWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
464
+ // booleanClassId -> "${booleanWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
465
+ // charClassId -> "${charWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
466
+ // floatClassId -> "${floatWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
467
+ // doubleWrapperClassId -> "${doubleWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
468
+ // else -> "actual"
469
+ // }
470
+ // CodegenLanguage.KOTLIN -> "actual"
471
+ // }
472
+ assertEquality(expected, actual)// CgVariable(actualVariableName, method.returnType))
475
473
}
476
474
}
477
475
.onFailure { thisInstance[method](* methodArguments.toTypedArray()).intercepted() }
@@ -1084,14 +1082,18 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1084
1082
ParametrizedTestSource .DO_NOT_PARAMETRIZE ->
1085
1083
currentBlock = currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
1086
1084
ParametrizedTestSource .PARAMETRIZE -> {
1087
- val assertNullStmt = listOf (testFrameworkManager.assertions[testFramework.assertNull](actual).toStatement())
1088
- currentBlock = currentBlock.add(
1089
- CgIfStatement (
1090
- CgEqualTo (expected, nullLiteral()),
1091
- assertNullStmt,
1092
- generateDeepEqualsAssertion(expected, actual)
1085
+ currentBlock = if (actual.type.isPrimitive) {
1086
+ currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
1087
+ } else {
1088
+ val assertNullStmt = listOf (testFrameworkManager.assertions[testFramework.assertNull](actual).toStatement())
1089
+ currentBlock.add(
1090
+ CgIfStatement (
1091
+ CgEqualTo (expected, nullLiteral()),
1092
+ assertNullStmt,
1093
+ generateDeepEqualsAssertion(expected, actual)
1094
+ )
1093
1095
)
1094
- )
1096
+ }
1095
1097
}
1096
1098
}
1097
1099
}
@@ -1237,50 +1239,87 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1237
1239
1238
1240
return withTestMethodScope(arbitraryExecution) {
1239
1241
val testName = nameGenerator.parameterizedTestMethodName(dataProviderMethodName)
1240
- val testArguments = mutableListOf<CgParameterDeclaration >()
1241
- val mainBody = {
1242
- // build this instance
1243
- thisInstance = arbitraryExecution.stateBefore.thisInstance?.let {
1244
- val thisInstanceVariable = constructInstanceVariable(it)
1245
- testArguments + = CgParameterDeclaration (thisInstanceVariable)
1246
- thisInstanceVariable
1242
+ // TODO: move out to a separate method e.g. createMethodParameters()
1243
+ // create parameter declarations
1244
+ val testParameterDeclarations = mutableListOf<CgParameterDeclaration >().apply {
1245
+ // this instance
1246
+ val thisInstanceModel = arbitraryExecution.stateBefore.thisInstance
1247
+ if (thisInstanceModel != null ) {
1248
+ val type = thisInstanceModel.classId
1249
+ val thisInstance = CgParameterDeclaration (
1250
+ parameter = declareParameter(
1251
+ type = type,
1252
+ name = nameGenerator.variableName(type)
1253
+ ),
1254
+ isReferenceType = true
1255
+ )
1256
+ this + = thisInstance
1257
+ currentMethodParameters[CgParameterType .ThisInstance ] = thisInstance.parameter
1247
1258
}
1248
-
1249
- // build arguments for method under test and parameterized test
1259
+ // arguments
1250
1260
for (index in arbitraryExecution.stateBefore.parameters.indices) {
1251
1261
val argumentName = paramNames[methodUnderTest]?.get(index)
1252
1262
val paramIndex = if (methodUnderTest.isStatic) index else index + 1
1253
1263
val paramType = methodUnderTestParameters[paramIndex].type.javaType
1254
1264
1255
- val argumentClassId = when {
1265
+ val argumentType = when {
1256
1266
paramType is Class <* > && paramType.isArray -> paramType.id
1257
1267
paramType is ParameterizedTypeImpl -> paramType.rawType.id
1258
1268
else -> ClassId (paramType.typeName)
1259
1269
}
1260
1270
1261
- val argument = variableConstructor.parameterizedVariable(argumentClassId, argumentName)
1262
- methodArguments + = argument
1263
- testArguments + = CgParameterDeclaration (
1264
- argument.name, argument.type, isReferenceType = ! argument.type.isPrimitive
1271
+ val argument = CgParameterDeclaration (
1272
+ parameter = declareParameter(
1273
+ type = argumentType,
1274
+ name = nameGenerator.variableName(argumentType, argumentName),
1275
+ ),
1276
+ isReferenceType = argumentType.isRefType
1265
1277
)
1278
+ this + = argument
1279
+ currentMethodParameters[CgParameterType .Argument (index)] = argument.parameter
1266
1280
}
1281
+
1267
1282
val method = currentExecutable as MethodId
1268
1283
val containsFailureExecution = containsFailureExecution(testSet)
1269
1284
1270
1285
val expectedResultClassId = wrapTypeIfRequired(method.returnType)
1271
1286
1272
1287
if (expectedResultClassId != voidClassId) {
1273
- testArguments + = CgParameterDeclaration (
1274
- expectedResultVarName, resultClassId(expectedResultClassId),
1275
- isReferenceType = containsFailureExecution || ! expectedResultClassId.isPrimitive
1288
+ val resultType = resultClassId(expectedResultClassId)
1289
+ val expectedResult = CgParameterDeclaration (
1290
+ parameter = declareParameter(
1291
+ type = resultType,
1292
+ name = nameGenerator.variableName(expectedResultVarName)
1293
+ ),
1294
+ isReferenceType = resultType.isRefType
1276
1295
)
1296
+ this + = expectedResult
1297
+ currentMethodParameters[CgParameterType .ExpectedResult ] = expectedResult.parameter
1277
1298
}
1299
+
1278
1300
if (containsFailureExecution) {
1279
- testArguments + = CgParameterDeclaration (
1280
- expectedErrorVarName,
1281
- throwableClassId(),
1301
+ val expectedException = CgParameterDeclaration (
1302
+ parameter = declareParameter(
1303
+ type = throwableClassId(),
1304
+ name = nameGenerator.variableName(expectedErrorVarName)
1305
+ ),
1306
+ // exceptions are always reference type
1282
1307
isReferenceType = true
1283
1308
)
1309
+ this + = expectedException
1310
+ currentMethodParameters[CgParameterType .ExpectedException ] = expectedException.parameter
1311
+ }
1312
+ }
1313
+
1314
+ // currentMethodParameters += testParameterDeclarations.map { it.parameter }
1315
+
1316
+ val mainBody = {
1317
+ // build this instance
1318
+ thisInstance = arbitraryExecution.stateBefore.thisInstance?.let { currentMethodParameters[0 ] }
1319
+
1320
+ // build arguments for method under test and parameterized test
1321
+ for (index in arbitraryExecution.stateBefore.parameters.indices) {
1322
+ methodArguments + = currentMethodParameters[CgParameterType .Argument (index)]!!
1284
1323
}
1285
1324
1286
1325
// record result and generate result assertions
@@ -1292,7 +1331,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1292
1331
testMethod(
1293
1332
testName,
1294
1333
displayName = null ,
1295
- testArguments ,
1334
+ testParameterDeclarations ,
1296
1335
parameterized = true ,
1297
1336
dataProviderMethodName
1298
1337
) {
@@ -1313,13 +1352,13 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1313
1352
}
1314
1353
}
1315
1354
1316
- /* *
1317
- * Constructs a variable for the instance parameter of parametrized test.
1318
- */
1319
- private fun constructInstanceVariable (instanceModel : UtModel ): CgVariable {
1320
- val className = instanceModel.classId.simpleName.decapitalize()
1321
- return variableConstructor.parameterizedVariable(instanceModel.classId, className)
1322
- }
1355
+ // /**
1356
+ // * Constructs a variable for the instance parameter of parametrized test.
1357
+ // */
1358
+ // private fun constructInstanceVariable(instanceModel: UtModel): CgValue {
1359
+ // val className = instanceModel.classId.simpleName.decapitalize()
1360
+ // return variableConstructor.getParameterByName( className)
1361
+ // }
1323
1362
1324
1363
/* *
1325
1364
* Constructs data provider method for parameterized tests.
@@ -1420,6 +1459,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1420
1459
methodArguments.clear()
1421
1460
currentExecution = null
1422
1461
mockFrameworkManager.clearExecutionResources()
1462
+ currentMethodParameters.clear()
1423
1463
}
1424
1464
1425
1465
/* *
0 commit comments