@@ -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
@@ -440,28 +443,23 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
440
443
} else {
441
444
resultModel = result
442
445
443
- val expected = variableConstructor.parameterizedVariable(
444
- result.classId,
445
- expectedResultVarName,
446
- isNotNull = true
447
- )
448
-
449
- val actualVariableName = when (codegenLanguage) {
450
- CodegenLanguage .JAVA -> when (method.returnType) {
451
- intClassId -> " ${intWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
452
- shortClassId -> " ${shortWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
453
- longClassId -> " ${longWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
454
- byteClassId -> " ${byteWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
455
- booleanClassId -> " ${booleanWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
456
- charClassId -> " ${charWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
457
- floatClassId -> " ${floatWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
458
- doubleWrapperClassId -> " ${doubleWrapperClassId.simpleName.capitalize()} .valueOf(actual)"
459
- else -> " actual"
460
- }
461
- CodegenLanguage .KOTLIN -> " actual"
462
- }
463
-
464
- assertEquality(expected, CgVariable (actualVariableName, method.returnType))
446
+ val expected = CgNotNullAssertion (currentMethodParameters[CgParameterType .ExpectedResult ]!! )
447
+
448
+ // val actualVariableName = when (codegenLanguage) {
449
+ // CodegenLanguage.JAVA -> when (method.returnType) {
450
+ // intClassId -> "${intWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
451
+ // shortClassId -> "${shortWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
452
+ // longClassId -> "${longWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
453
+ // byteClassId -> "${byteWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
454
+ // booleanClassId -> "${booleanWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
455
+ // charClassId -> "${charWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
456
+ // floatClassId -> "${floatWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
457
+ // doubleWrapperClassId -> "${doubleWrapperClassId.simpleName.capitalize()}.valueOf(actual)"
458
+ // else -> "actual"
459
+ // }
460
+ // CodegenLanguage.KOTLIN -> "actual"
461
+ // }
462
+ assertEquality(expected, actual)// CgVariable(actualVariableName, method.returnType))
465
463
}
466
464
}
467
465
.onFailure { thisInstance[method](* methodArguments.toTypedArray()).intercepted() }
@@ -1074,14 +1072,18 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1074
1072
ParametrizedTestSource .DO_NOT_PARAMETRIZE ->
1075
1073
currentBlock = currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
1076
1074
ParametrizedTestSource .PARAMETRIZE -> {
1077
- val assertNullStmt = listOf (testFrameworkManager.assertions[testFramework.assertNull](actual).toStatement())
1078
- currentBlock = currentBlock.add(
1079
- CgIfStatement (
1080
- CgEqualTo (expected, nullLiteral()),
1081
- assertNullStmt,
1082
- generateDeepEqualsAssertion(expected, actual)
1075
+ currentBlock = if (actual.type.isPrimitive) {
1076
+ currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
1077
+ } else {
1078
+ val assertNullStmt = listOf (testFrameworkManager.assertions[testFramework.assertNull](actual).toStatement())
1079
+ currentBlock.add(
1080
+ CgIfStatement (
1081
+ CgEqualTo (expected, nullLiteral()),
1082
+ assertNullStmt,
1083
+ generateDeepEqualsAssertion(expected, actual)
1084
+ )
1083
1085
)
1084
- )
1086
+ }
1085
1087
}
1086
1088
}
1087
1089
}
@@ -1227,50 +1229,87 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1227
1229
1228
1230
return withTestMethodScope(arbitraryExecution) {
1229
1231
val testName = nameGenerator.parameterizedTestMethodName(dataProviderMethodName)
1230
- val testArguments = mutableListOf<CgParameterDeclaration >()
1231
- val mainBody = {
1232
- // build this instance
1233
- thisInstance = arbitraryExecution.stateBefore.thisInstance?.let {
1234
- val thisInstanceVariable = constructInstanceVariable(it)
1235
- testArguments + = CgParameterDeclaration (thisInstanceVariable)
1236
- thisInstanceVariable
1232
+ // TODO: move out to a separate method e.g. createMethodParameters()
1233
+ // create parameter declarations
1234
+ val testParameterDeclarations = mutableListOf<CgParameterDeclaration >().apply {
1235
+ // this instance
1236
+ val thisInstanceModel = arbitraryExecution.stateBefore.thisInstance
1237
+ if (thisInstanceModel != null ) {
1238
+ val type = thisInstanceModel.classId
1239
+ val thisInstance = CgParameterDeclaration (
1240
+ parameter = declareParameter(
1241
+ type = type,
1242
+ name = nameGenerator.variableName(type)
1243
+ ),
1244
+ isReferenceType = true
1245
+ )
1246
+ this + = thisInstance
1247
+ currentMethodParameters[CgParameterType .ThisInstance ] = thisInstance.parameter
1237
1248
}
1238
-
1239
- // build arguments for method under test and parameterized test
1249
+ // arguments
1240
1250
for (index in arbitraryExecution.stateBefore.parameters.indices) {
1241
1251
val argumentName = paramNames[methodUnderTest]?.get(index)
1242
1252
val paramIndex = if (methodUnderTest.isStatic) index else index + 1
1243
1253
val paramType = methodUnderTestParameters[paramIndex].type.javaType
1244
1254
1245
- val argumentClassId = when {
1255
+ val argumentType = when {
1246
1256
paramType is Class <* > && paramType.isArray -> paramType.id
1247
1257
paramType is ParameterizedTypeImpl -> paramType.rawType.id
1248
1258
else -> ClassId (paramType.typeName)
1249
1259
}
1250
1260
1251
- val argument = variableConstructor.parameterizedVariable(argumentClassId, argumentName)
1252
- methodArguments + = argument
1253
- testArguments + = CgParameterDeclaration (
1254
- argument.name, argument.type, isReferenceType = ! argument.type.isPrimitive
1261
+ val argument = CgParameterDeclaration (
1262
+ parameter = declareParameter(
1263
+ type = argumentType,
1264
+ name = nameGenerator.variableName(argumentType, argumentName),
1265
+ ),
1266
+ isReferenceType = argumentType.isRefType
1255
1267
)
1268
+ this + = argument
1269
+ currentMethodParameters[CgParameterType .Argument (index)] = argument.parameter
1256
1270
}
1271
+
1257
1272
val method = currentExecutable as MethodId
1258
1273
val containsFailureExecution = containsFailureExecution(testSet)
1259
1274
1260
1275
val expectedResultClassId = wrapTypeIfRequired(method.returnType)
1261
1276
1262
1277
if (expectedResultClassId != voidClassId) {
1263
- testArguments + = CgParameterDeclaration (
1264
- expectedResultVarName, resultClassId(expectedResultClassId),
1265
- isReferenceType = containsFailureExecution || ! expectedResultClassId.isPrimitive
1278
+ val resultType = resultClassId(expectedResultClassId)
1279
+ val expectedResult = CgParameterDeclaration (
1280
+ parameter = declareParameter(
1281
+ type = resultType,
1282
+ name = nameGenerator.variableName(expectedResultVarName)
1283
+ ),
1284
+ isReferenceType = resultType.isRefType
1266
1285
)
1286
+ this + = expectedResult
1287
+ currentMethodParameters[CgParameterType .ExpectedResult ] = expectedResult.parameter
1267
1288
}
1289
+
1268
1290
if (containsFailureExecution) {
1269
- testArguments + = CgParameterDeclaration (
1270
- expectedErrorVarName,
1271
- throwableClassId(),
1291
+ val expectedException = CgParameterDeclaration (
1292
+ parameter = declareParameter(
1293
+ type = throwableClassId(),
1294
+ name = nameGenerator.variableName(expectedErrorVarName)
1295
+ ),
1296
+ // exceptions are always reference type
1272
1297
isReferenceType = true
1273
1298
)
1299
+ this + = expectedException
1300
+ currentMethodParameters[CgParameterType .ExpectedException ] = expectedException.parameter
1301
+ }
1302
+ }
1303
+
1304
+ // currentMethodParameters += testParameterDeclarations.map { it.parameter }
1305
+
1306
+ val mainBody = {
1307
+ // build this instance
1308
+ thisInstance = arbitraryExecution.stateBefore.thisInstance?.let { currentMethodParameters[0 ] }
1309
+
1310
+ // build arguments for method under test and parameterized test
1311
+ for (index in arbitraryExecution.stateBefore.parameters.indices) {
1312
+ methodArguments + = currentMethodParameters[CgParameterType .Argument (index)]!!
1274
1313
}
1275
1314
1276
1315
// record result and generate result assertions
@@ -1282,7 +1321,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1282
1321
testMethod(
1283
1322
testName,
1284
1323
displayName = null ,
1285
- testArguments ,
1324
+ testParameterDeclarations ,
1286
1325
parameterized = true ,
1287
1326
dataProviderMethodName
1288
1327
) {
@@ -1303,13 +1342,13 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1303
1342
}
1304
1343
}
1305
1344
1306
- /* *
1307
- * Constructs a variable for the instance parameter of parametrized test.
1308
- */
1309
- private fun constructInstanceVariable (instanceModel : UtModel ): CgVariable {
1310
- val className = instanceModel.classId.simpleName.decapitalize()
1311
- return variableConstructor.parameterizedVariable(instanceModel.classId, className)
1312
- }
1345
+ // /**
1346
+ // * Constructs a variable for the instance parameter of parametrized test.
1347
+ // */
1348
+ // private fun constructInstanceVariable(instanceModel: UtModel): CgValue {
1349
+ // val className = instanceModel.classId.simpleName.decapitalize()
1350
+ // return variableConstructor.getParameterByName( className)
1351
+ // }
1313
1352
1314
1353
/* *
1315
1354
* Constructs data provider method for parameterized tests.
@@ -1410,6 +1449,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
1410
1449
methodArguments.clear()
1411
1450
currentExecution = null
1412
1451
mockFrameworkManager.clearExecutionResources()
1452
+ currentMethodParameters.clear()
1413
1453
}
1414
1454
1415
1455
/* *
0 commit comments