@@ -15,6 +15,7 @@ import org.utbot.framework.plugin.api.util.fieldClassId
15
15
import org.utbot.framework.plugin.api.util.fieldId
16
16
import org.utbot.framework.plugin.api.util.id
17
17
import org.utbot.engine.greyboxfuzzer.quickcheck.generator.*
18
+ import org.utbot.framework.UtSettings
18
19
import java.lang.reflect.*
19
20
import kotlin.random.Random
20
21
@@ -56,13 +57,22 @@ class UserClassGenerator : ComponentizedGenerator(Any::class.java) {
56
57
57
58
private fun regenerate (random : SourceOfRandomness , status : GenerationStatus ): UtModel {
58
59
logger.debug { " Trying to generate ${parameterTypeContext!! .resolved} . Current depth: $depth " }
60
+ if (Random .getTrue(5 )) {
61
+ return UtNullModel (clazz!! .id)
62
+ }
59
63
if (depth >= GreyBoxFuzzerGenerators .maxDepthOfGeneration.toInt()) {
60
64
logger.debug { " Depth more than maxDepth ${GreyBoxFuzzerGenerators .maxDepthOfGeneration.toInt()} . Return UtNullModel" }
61
65
return UtNullModel (clazz!! .id)
62
66
}
63
67
val immutableClazz = clazz!!
68
+ // TODO make this generators as usual generators
64
69
when (immutableClazz) {
65
- Any ::class .java -> return ObjectGenerator (parameterTypeContext!! , random, status, generatorContext).generate()
70
+ Any ::class .java -> return ObjectGenerator (
71
+ parameterTypeContext!! ,
72
+ random,
73
+ status,
74
+ generatorContext
75
+ ).generate()
66
76
Class ::class .java -> return ReflectionClassGenerator (parameterTypeContext!! , generatorContext).generate()
67
77
Type ::class .java -> return ReflectionTypeGenerator (parameterTypeContext!! , generatorContext).generate()
68
78
// TODO implement field generator
@@ -73,7 +83,12 @@ class UserClassGenerator : ComponentizedGenerator(Any::class.java) {
73
83
return UtNullModel (immutableClazz.id)
74
84
}
75
85
val resolvedJavaType = parameterTypeContext!! .generics.resolveType(parameterTypeContext!! .type())
76
- val gctx = resolvedJavaType.createGenericsContext(immutableClazz)
86
+ val gctx =
87
+ if (resolvedJavaType is Class <* >) {
88
+ parameterTypeContext!! .generics
89
+ } else {
90
+ resolvedJavaType.createGenericsContext(immutableClazz)
91
+ }
77
92
if (! immutableClazz.canBeInstantiated()) {
78
93
return InterfaceImplementationsInstanceGenerator (
79
94
resolvedJavaType,
@@ -84,7 +99,19 @@ class UserClassGenerator : ComponentizedGenerator(Any::class.java) {
84
99
depth
85
100
).generate()
86
101
}
87
- return ClassesInstanceGenerator (
102
+ val unsafeGenerator = UnsafeBasedInstanceGenerator (
103
+ clazz!! ,
104
+ gctx,
105
+ resolvedJavaType,
106
+ GreyBoxFuzzerGenerators .sourceOfRandomness,
107
+ GreyBoxFuzzerGenerators .genStatus,
108
+ generatorContext,
109
+ depth
110
+ )
111
+ if (Random .getTrue(10 ) && UtSettings .useCompositeModelsInGreyBoxFuzzing) {
112
+ return unsafeGenerator.generate()
113
+ }
114
+ val generatedObject = ClassesInstanceGenerator (
88
115
clazz!! ,
89
116
gctx,
90
117
parameterTypeContext!! .generics,
@@ -94,6 +121,10 @@ class UserClassGenerator : ComponentizedGenerator(Any::class.java) {
94
121
generatorContext,
95
122
depth
96
123
).generate()
124
+ if (generatedObject is UtNullModel && Random .getTrue(75 ) && UtSettings .useCompositeModelsInGreyBoxFuzzing) {
125
+ return unsafeGenerator.generate()
126
+ }
127
+ return generatedObject
97
128
}
98
129
99
130
override fun modify (random : SourceOfRandomness , status : GenerationStatus ): UtModel {
@@ -152,10 +183,11 @@ class UserClassGenerator : ComponentizedGenerator(Any::class.java) {
152
183
clazz!! ,
153
184
chain.map { it!! }.reversed().drop(1 )
154
185
) ? : return cachedUtModel
155
- return Mutator .regenerateFieldWithContext(genericsContext, cachedUtModel, randomField, generatorContext)?.let {
156
- mutatedFields[randomField] = it.second
157
- it.first
158
- } ? : cachedUtModel
186
+ return Mutator .regenerateFieldWithContext(genericsContext, cachedUtModel, randomField, generatorContext)
187
+ ?.let {
188
+ mutatedFields[randomField] = it.second
189
+ it.first
190
+ } ? : cachedUtModel
159
191
}
160
192
}
161
193
0 commit comments