Skip to content

Commit 87ca3db

Browse files
committed
Tmp
1 parent 777a77d commit 87ca3db

File tree

9 files changed

+181
-104
lines changed

9 files changed

+181
-104
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,16 @@ val Type.classId: ClassId
612612
*/
613613
open class ClassId(
614614
val name: String,
615-
val elementClassId: ClassId? = null
615+
val elementClassId: ClassId? = null,
616+
// Treat simple class ids as non-nullable
617+
open val isNullable: Boolean = false
616618
) {
619+
/**
620+
* This constructor is for calls from Java (e.g. `UtBotJavaApiTest`),
621+
* because we cannot skip default parameters in Java.
622+
*/
623+
constructor(name: String, elementClassId: ClassId?) : this(name, elementClassId, false)
624+
617625
open val canonicalName: String
618626
get() = jClass.canonicalName ?: error("ClassId $name does not have canonical name")
619627

@@ -677,9 +685,9 @@ open class ClassId(
677685
open val isSynthetic: Boolean
678686
get() = jClass.isSynthetic
679687

680-
open val isNullable: Boolean
681-
// Treat simple class ids as non-nullable
682-
get() = false
688+
// open val isNullable: Boolean
689+
// // Treat simple class ids as non-nullable
690+
// get() = false
683691

684692
/**
685693
* Collects all declared methods (including private and protected) from class and all its superclasses to sequence

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/context/CgContext.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import kotlinx.collections.immutable.persistentListOf
5454
import kotlinx.collections.immutable.persistentMapOf
5555
import kotlinx.collections.immutable.persistentSetOf
5656
import org.utbot.framework.codegen.model.constructor.builtin.streamsDeepEqualsMethodId
57+
import org.utbot.framework.codegen.model.tree.CgParameterType
5758
import org.utbot.framework.plugin.api.util.executableId
5859
import org.utbot.framework.plugin.api.util.id
5960
import org.utbot.framework.plugin.api.util.isCheckedException
@@ -70,8 +71,8 @@ import org.utbot.framework.plugin.api.util.jClass
7071
* For example, [currentTestClass] and [currentExecutable] can be reassigned
7172
* when we start generating another method or test class
7273
*
73-
* [variables] and [existingVariableNames] are 'var' properties
74-
* that can be reverted to their previous values on exit from a name scope
74+
* [existingVariableNames] is a 'var' property
75+
* that can be reverted to its previous value on exit from a name scope
7576
*
7677
* @see [CgContextOwner.withNameScope]
7778
*/
@@ -155,9 +156,6 @@ internal interface CgContextOwner {
155156
// variable names being used in the current name scope
156157
var existingVariableNames: PersistentSet<String>
157158

158-
// all declared variables in the current name scope
159-
var variables: PersistentSet<CgVariable>
160-
161159
// variables of java.lang.Class type declared in the current name scope
162160
var declaredClassRefs: PersistentMap<ClassId, CgVariable>
163161

@@ -190,6 +188,9 @@ internal interface CgContextOwner {
190188
// use it to compare stateBefore and result variables - in case of equality do not create new variable
191189
var valueByModelId: MutableMap<Int?, CgValue>
192190

191+
// parameters of the method currently being generated
192+
val currentMethodParameters: MutableMap<CgParameterType, CgVariable>
193+
193194
val testClassCustomName: String?
194195

195196
/**
@@ -282,7 +283,6 @@ internal interface CgContextOwner {
282283
}
283284

284285
fun updateVariableScope(variable: CgVariable, model: UtModel? = null) {
285-
variables = variables.add(variable)
286286
model?.let {
287287
valueByModel[it] = variable
288288
(model as UtReferenceModel).let { refModel ->
@@ -293,7 +293,6 @@ internal interface CgContextOwner {
293293

294294
fun <R> withNameScope(block: () -> R): R {
295295
val prevVariableNames = existingVariableNames
296-
val prevVariables = variables
297296
val prevDeclaredClassRefs = declaredClassRefs
298297
val prevDeclaredExecutableRefs = declaredExecutableRefs
299298
val prevValueByModel = IdentityHashMap(valueByModel)
@@ -302,7 +301,6 @@ internal interface CgContextOwner {
302301
block()
303302
} finally {
304303
existingVariableNames = prevVariableNames
305-
variables = prevVariables
306304
declaredClassRefs = prevDeclaredClassRefs
307305
declaredExecutableRefs = prevDeclaredExecutableRefs
308306
valueByModel = prevValueByModel
@@ -413,7 +411,6 @@ internal data class CgContext(
413411
override var mockFrameworkUsed: Boolean = false,
414412
override var currentBlock: PersistentList<CgStatement> = persistentListOf(),
415413
override var existingVariableNames: PersistentSet<String> = persistentSetOf(),
416-
override var variables: PersistentSet<CgVariable> = persistentSetOf(),
417414
override var declaredClassRefs: PersistentMap<ClassId, CgVariable> = persistentMapOf(),
418415
override var declaredExecutableRefs: PersistentMap<ExecutableId, CgVariable> = persistentMapOf(),
419416
override var thisInstance: CgValue? = null,
@@ -454,5 +451,7 @@ internal data class CgContext(
454451

455452
override var valueByModelId: MutableMap<Int?, CgValue> = mutableMapOf()
456453

454+
override val currentMethodParameters: MutableMap<CgParameterType, CgVariable> = mutableMapOf()
455+
457456
override val testClassThisInstance: CgThisInstance = CgThisInstance(currentTestClass)
458457
}

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgMethodConstructor.kt

Lines changed: 97 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ import org.utbot.framework.codegen.model.tree.CgLiteral
4949
import org.utbot.framework.codegen.model.tree.CgMethod
5050
import org.utbot.framework.codegen.model.tree.CgMethodCall
5151
import org.utbot.framework.codegen.model.tree.CgMultilineComment
52+
import org.utbot.framework.codegen.model.tree.CgNotNullAssertion
5253
import org.utbot.framework.codegen.model.tree.CgParameterDeclaration
54+
import org.utbot.framework.codegen.model.tree.CgParameterType
5355
import org.utbot.framework.codegen.model.tree.CgParameterizedTestDataProviderMethod
5456
import org.utbot.framework.codegen.model.tree.CgRegion
5557
import org.utbot.framework.codegen.model.tree.CgReturnStatement
@@ -144,6 +146,7 @@ import org.utbot.framework.plugin.api.util.isInnerClassEnclosingClassReference
144146
import org.utbot.framework.plugin.api.util.isIterableOrMap
145147
import org.utbot.framework.plugin.api.util.isPrimitive
146148
import org.utbot.framework.plugin.api.util.isPrimitiveArray
149+
import org.utbot.framework.plugin.api.util.isRefType
147150
import org.utbot.framework.plugin.api.util.jClass
148151
import org.utbot.framework.plugin.api.util.kClass
149152
import org.utbot.framework.plugin.api.util.longClassId
@@ -450,28 +453,23 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
450453
} else {
451454
resultModel = result
452455

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))
475473
}
476474
}
477475
.onFailure { thisInstance[method](*methodArguments.toTypedArray()).intercepted() }
@@ -1084,14 +1082,18 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
10841082
ParametrizedTestSource.DO_NOT_PARAMETRIZE ->
10851083
currentBlock = currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
10861084
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+
)
10931095
)
1094-
)
1096+
}
10951097
}
10961098
}
10971099
}
@@ -1237,50 +1239,87 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
12371239

12381240
return withTestMethodScope(arbitraryExecution) {
12391241
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
12471258
}
1248-
1249-
// build arguments for method under test and parameterized test
1259+
// arguments
12501260
for (index in arbitraryExecution.stateBefore.parameters.indices) {
12511261
val argumentName = paramNames[methodUnderTest]?.get(index)
12521262
val paramIndex = if (methodUnderTest.isStatic) index else index + 1
12531263
val paramType = methodUnderTestParameters[paramIndex].type.javaType
12541264

1255-
val argumentClassId = when {
1265+
val argumentType = when {
12561266
paramType is Class<*> && paramType.isArray -> paramType.id
12571267
paramType is ParameterizedTypeImpl -> paramType.rawType.id
12581268
else -> ClassId(paramType.typeName)
12591269
}
12601270

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
12651277
)
1278+
this += argument
1279+
currentMethodParameters[CgParameterType.Argument(index)] = argument.parameter
12661280
}
1281+
12671282
val method = currentExecutable as MethodId
12681283
val containsFailureExecution = containsFailureExecution(testSet)
12691284

12701285
val expectedResultClassId = wrapTypeIfRequired(method.returnType)
12711286

12721287
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
12761295
)
1296+
this += expectedResult
1297+
currentMethodParameters[CgParameterType.ExpectedResult] = expectedResult.parameter
12771298
}
1299+
12781300
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
12821307
isReferenceType = true
12831308
)
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)]!!
12841323
}
12851324

12861325
//record result and generate result assertions
@@ -1292,7 +1331,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
12921331
testMethod(
12931332
testName,
12941333
displayName = null,
1295-
testArguments,
1334+
testParameterDeclarations,
12961335
parameterized = true,
12971336
dataProviderMethodName
12981337
) {
@@ -1313,13 +1352,13 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
13131352
}
13141353
}
13151354

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+
// }
13231362

13241363
/**
13251364
* Constructs data provider method for parameterized tests.
@@ -1420,6 +1459,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
14201459
methodArguments.clear()
14211460
currentExecution = null
14221461
mockFrameworkManager.clearExecutionResources()
1462+
currentMethodParameters.clear()
14231463
}
14241464

14251465
/**

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/model/constructor/tree/CgVariableConstructor.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import org.utbot.framework.codegen.model.tree.CgExpression
1818
import org.utbot.framework.codegen.model.tree.CgFieldAccess
1919
import org.utbot.framework.codegen.model.tree.CgGetJavaClass
2020
import org.utbot.framework.codegen.model.tree.CgLiteral
21-
import org.utbot.framework.codegen.model.tree.CgNotNullVariable
21+
import org.utbot.framework.codegen.model.tree.CgNotNullAssertion
2222
import org.utbot.framework.codegen.model.tree.CgStaticFieldAccess
2323
import org.utbot.framework.codegen.model.tree.CgValue
2424
import org.utbot.framework.codegen.model.tree.CgVariable
@@ -114,14 +114,6 @@ internal class CgVariableConstructor(val context: CgContext) :
114114
}
115115
}
116116

117-
/**
118-
* Creates general variable of type (to replace with concrete value in each test case).
119-
*/
120-
fun parameterizedVariable(classId: ClassId, baseName: String? = null, isNotNull: Boolean = false): CgVariable {
121-
val name = nameGenerator.variableName(type = classId, base = baseName, isMock = false)
122-
return if (isNotNull) CgNotNullVariable(name, classId) else CgVariable(name, classId)
123-
}
124-
125117
private fun constructComposite(model: UtCompositeModel, baseName: String): CgVariable {
126118
val obj = if (model.isMock) {
127119
mockFrameworkManager.createMockFor(model, baseName)

0 commit comments

Comments
 (0)