1
1
package org.utbot.fuzzer
2
2
3
3
import mu.KotlinLogging
4
+ import org.utbot.framework.plugin.api.UtPrimitiveModel
5
+ import org.utbot.framework.plugin.api.util.intClassId
6
+ import org.utbot.framework.plugin.api.util.voidClassId
4
7
import org.utbot.fuzzer.mutators.NumberRandomMutator
5
8
import org.utbot.fuzzer.mutators.RegexStringModelMutator
6
9
import org.utbot.fuzzer.mutators.StringRandomMutator
7
10
import org.utbot.fuzzer.providers.ArrayModelProvider
8
11
import org.utbot.fuzzer.providers.CharToStringModelProvider
9
- import org.utbot.fuzzer.providers.CollectionModelProvider
12
+ import org.utbot.fuzzer.providers.CollectionWithEmptyStatesModelProvider
10
13
import org.utbot.fuzzer.providers.ConstantsModelProvider
11
14
import org.utbot.fuzzer.providers.EnumModelProvider
15
+ import org.utbot.fuzzer.providers.CollectionWithModificationModelProvider
16
+ import org.utbot.fuzzer.providers.NumberClassModelProvider
12
17
import org.utbot.fuzzer.providers.ObjectModelProvider
13
18
import org.utbot.fuzzer.providers.PrimitiveDefaultsModelProvider
14
19
import org.utbot.fuzzer.providers.PrimitiveWrapperModelProvider
@@ -19,6 +24,8 @@ import java.util.*
19
24
import java.util.concurrent.atomic.AtomicInteger
20
25
import kotlin.random.Random
21
26
import org.utbot.fuzzer.providers.DateConstantModelProvider
27
+ import org.utbot.fuzzer.providers.PrimitiveRandomModelProvider
28
+ import org.utbot.fuzzer.providers.RecursiveModelProvider
22
29
23
30
private val logger by lazy { KotlinLogging .logger {} }
24
31
@@ -146,46 +153,62 @@ fun <T> Sequence<List<FuzzedValue>>.withMutations(statistics: FuzzerStatistics<T
146
153
while (yieldMutated(statistics, description, mutatorList, random)) {}
147
154
}
148
155
156
+ /* *
157
+ * Create a sequence that contains all [defaultValues] plus any value which is found as fuzzing with concrete values.
158
+ *
159
+ * Method is useful for generating some bound values,
160
+ * for example, when for code `array.length > 4` there are 2 values in concrete value: 4 and 5.
161
+ *
162
+ * All values after filtering are cast to [Int].
163
+ */
164
+ fun fuzzNumbers (concreteValues : Collection <FuzzedConcreteValue >, vararg defaultValues : Int , filter : (Number ) -> Boolean = { true }): Sequence <Int > {
165
+ val description = FuzzedMethodDescription (" helper: number fuzzing" , voidClassId, listOf (intClassId), concreteValues)
166
+ val fuzzedValues = fuzz(description, ConstantsModelProvider )
167
+ .mapNotNull { ((it.single().model as ? UtPrimitiveModel )?.value as ? Number ) }
168
+ .filter(filter)
169
+ .map { it.toInt() }
170
+ return (defaultValues.asSequence() + fuzzedValues).distinct()
171
+ }
172
+
149
173
/* *
150
174
* Creates a model provider from a list of default providers.
151
175
*/
152
176
fun defaultModelProviders (idGenerator : IdentityPreservingIdGenerator <Int >): ModelProvider {
153
- return ModelProvider .of(
154
- ObjectModelProvider (idGenerator),
155
- CollectionModelProvider (idGenerator),
156
- ArrayModelProvider (idGenerator),
157
- EnumModelProvider (idGenerator),
158
- DateConstantModelProvider (idGenerator),
159
- ConstantsModelProvider ,
160
- StringConstantModelProvider ,
161
- RegexModelProvider ,
162
- CharToStringModelProvider ,
163
- PrimitivesModelProvider ,
164
- PrimitiveWrapperModelProvider ,
165
- )
177
+ return modelProviderForRecursiveCalls(idGenerator, recursionDepth = - 1 )
178
+ .with (ObjectModelProvider (idGenerator))
179
+ .with (ArrayModelProvider (idGenerator))
180
+ .with (CollectionWithModificationModelProvider (idGenerator))
181
+ .exceptIsInstance<PrimitiveRandomModelProvider >()
182
+ .except(PrimitiveDefaultsModelProvider )
183
+ .with (PrimitivesModelProvider )
166
184
}
167
185
168
186
/* *
169
187
* Creates a model provider from a list of providers that we want to use by default in [RecursiveModelProvider]
170
188
*/
171
189
internal fun modelProviderForRecursiveCalls (idGenerator : IdentityPreservingIdGenerator <Int >, recursionDepth : Int ): ModelProvider {
172
190
val nonRecursiveProviders = ModelProvider .of(
173
- CollectionModelProvider (idGenerator),
191
+ CollectionWithEmptyStatesModelProvider (idGenerator),
174
192
EnumModelProvider (idGenerator),
175
193
DateConstantModelProvider (idGenerator),
194
+ RegexModelProvider ,
176
195
StringConstantModelProvider ,
177
196
CharToStringModelProvider ,
178
197
ConstantsModelProvider ,
198
+ PrimitiveRandomModelProvider (Random (0 )),
179
199
PrimitiveDefaultsModelProvider ,
180
200
PrimitiveWrapperModelProvider ,
201
+ NumberClassModelProvider (idGenerator, Random (0 )),
181
202
)
182
203
183
- return if (recursionDepth >= 0 )
204
+ return if (recursionDepth >= 0 ) {
184
205
nonRecursiveProviders
185
206
.with (ObjectModelProvider (idGenerator, recursionDepth))
186
207
.with (ArrayModelProvider (idGenerator, recursionDepth))
187
- else
208
+ .with (CollectionWithModificationModelProvider (idGenerator, recursionDepth))
209
+ } else {
188
210
nonRecursiveProviders
211
+ }
189
212
}
190
213
191
214
0 commit comments