11package org.utbot.framework.context.custom
22
33import org.utbot.framework.context.JavaFuzzingContext
4+ import org.utbot.framework.plugin.api.UtNullModel
45import org.utbot.framework.plugin.api.ExecutableId
56import org.utbot.fuzzer.FuzzedType
67import org.utbot.fuzzing.JavaValueProvider
8+ import org.utbot.fuzzing.Seed
79import org.utbot.fuzzing.providers.AnyDepthNullValueProvider
8- import org.utbot.fuzzing.providers.MapValueProvider
10+ import org.utbot.fuzzing.providers.AnyObjectValueProvider
911import org.utbot.fuzzing.spring.unit.MockValueProvider
10- import org.utbot.fuzzing.providers.NullValueProvider
11- import org.utbot.fuzzing.providers.ObjectValueProvider
12- import org.utbot.fuzzing.providers.StringValueProvider
13- import org.utbot.fuzzing.providers.anyObjectValueProvider
12+ import org.utbot.fuzzing.spring.decorators.filterSeeds
1413import org.utbot.fuzzing.spring.decorators.filterTypes
1514import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
1615
1716/* *
1817 * Makes fuzzer to use mocks in accordance with [mockPredicate].
1918 *
2019 * NOTE:
21- * - fuzzer won't mock types, that have *specific* value providers (e.g. [MapValueProvider] and [StringValueProvider])
22- * - [ObjectValueProvider] and [NullValueProvider] do not count as *specific* value providers
23- * - fuzzer may still resort to mocks despite [mockPredicate] if it can't create other non-null values or at runtime
20+ * - fuzzer won't mock types, that have *specific* value providers
21+ * (i.e. ones that do not implement [AnyObjectValueProvider])
22+ * - fuzzer may still resort to mocks despite [mockPredicate] and *specific*
23+ * value providers if it can't create other non-null values or at runtime
2424 */
2525fun JavaFuzzingContext.useMocks (mockPredicate : (FuzzedType ) -> Boolean ) =
2626 MockingJavaFuzzingContext (delegateContext = this , mockPredicate)
@@ -32,17 +32,20 @@ class MockingJavaFuzzingContext(
3232 private val mockValueProvider = MockValueProvider (delegateContext.idGenerator)
3333
3434 override val valueProvider: JavaValueProvider =
35- // NOTE: we first remove `NullValueProvider` and `ObjectValueProvider` from `delegateContext.valueProvider`
36- // and then add them back as a part of our `withFallback` so they have the same priority as
37- // `mockValueProvider`, otherwise mocks will never be used where `null` or new object can be used.
35+
3836 delegateContext.valueProvider
39- .except { it is NullValueProvider }
40- .except { it is ObjectValueProvider }
37+ // NOTE: we first remove `AnyObjectValueProvider` and `NullValueProvider` from `delegateContext.valueProvider`
38+ // and then add them back as a part of our `withFallback` so they have the same priority as
39+ // `mockValueProvider`, otherwise mocks will never be used where `null` or new object can be used.
40+ .except { it is AnyObjectValueProvider }
4141 .withFallback(
4242 mockValueProvider.filterTypes(mockPredicate)
43- .with (anyObjectValueProvider(idGenerator).filterTypes { ! mockPredicate(it) })
43+ .with (
44+ delegateContext.valueProvider
45+ .filterTypes { ! mockPredicate(it) }
46+ .filterSeeds { (it as ? Seed .Simple )?.value?.model !is UtNullModel }
47+ )
4448 .withFallback(mockValueProvider.with (AnyDepthNullValueProvider ))
45- .with (NullValueProvider )
4649 )
4750
4851 override fun handleFuzzedConcreteExecutionResult (
0 commit comments