Skip to content

Commit a2ee3b4

Browse files
committed
Tmp
1 parent a68df11 commit a2ee3b4

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
@@ -440,28 +443,23 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
440443
} else {
441444
resultModel = result
442445

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))
465463
}
466464
}
467465
.onFailure { thisInstance[method](*methodArguments.toTypedArray()).intercepted() }
@@ -1074,14 +1072,18 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
10741072
ParametrizedTestSource.DO_NOT_PARAMETRIZE ->
10751073
currentBlock = currentBlock.addAll(generateDeepEqualsAssertion(expected, actual))
10761074
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+
)
10831085
)
1084-
)
1086+
}
10851087
}
10861088
}
10871089
}
@@ -1227,50 +1229,87 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
12271229

12281230
return withTestMethodScope(arbitraryExecution) {
12291231
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
12371248
}
1238-
1239-
// build arguments for method under test and parameterized test
1249+
// arguments
12401250
for (index in arbitraryExecution.stateBefore.parameters.indices) {
12411251
val argumentName = paramNames[methodUnderTest]?.get(index)
12421252
val paramIndex = if (methodUnderTest.isStatic) index else index + 1
12431253
val paramType = methodUnderTestParameters[paramIndex].type.javaType
12441254

1245-
val argumentClassId = when {
1255+
val argumentType = when {
12461256
paramType is Class<*> && paramType.isArray -> paramType.id
12471257
paramType is ParameterizedTypeImpl -> paramType.rawType.id
12481258
else -> ClassId(paramType.typeName)
12491259
}
12501260

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
12551267
)
1268+
this += argument
1269+
currentMethodParameters[CgParameterType.Argument(index)] = argument.parameter
12561270
}
1271+
12571272
val method = currentExecutable as MethodId
12581273
val containsFailureExecution = containsFailureExecution(testSet)
12591274

12601275
val expectedResultClassId = wrapTypeIfRequired(method.returnType)
12611276

12621277
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
12661285
)
1286+
this += expectedResult
1287+
currentMethodParameters[CgParameterType.ExpectedResult] = expectedResult.parameter
12671288
}
1289+
12681290
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
12721297
isReferenceType = true
12731298
)
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)]!!
12741313
}
12751314

12761315
//record result and generate result assertions
@@ -1282,7 +1321,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
12821321
testMethod(
12831322
testName,
12841323
displayName = null,
1285-
testArguments,
1324+
testParameterDeclarations,
12861325
parameterized = true,
12871326
dataProviderMethodName
12881327
) {
@@ -1303,13 +1342,13 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
13031342
}
13041343
}
13051344

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

13141353
/**
13151354
* Constructs data provider method for parameterized tests.
@@ -1410,6 +1449,7 @@ internal class CgMethodConstructor(val context: CgContext) : CgContextOwner by c
14101449
methodArguments.clear()
14111450
currentExecution = null
14121451
mockFrameworkManager.clearExecutionResources()
1452+
currentMethodParameters.clear()
14131453
}
14141454

14151455
/**

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)