Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 74cba30

Browse files
committedSep 28, 2022
Fixed wrong resolved values for a primitive stream as a parameter
1 parent 8128803 commit 74cba30

File tree

11 files changed

+108
-17
lines changed

11 files changed

+108
-17
lines changed
 

‎utbot-framework-test/src/test/kotlin/org/utbot/examples/stream/DoubleStreamExampleTest.kt

+9-10
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,15 @@ class DoubleStreamExampleTest : UtValueTestCaseChecker(
4747

4848
@Test
4949
fun testUseParameterStream() {
50-
withoutConcrete {
51-
check(
52-
DoubleStreamExample::useParameterStream,
53-
eq(2),
54-
{ s, r -> s.toArray().isEmpty() && r == 0 },
55-
{ s, r -> s.toArray().let {
56-
it.isNotEmpty() && r == it.size }
57-
},
58-
)
59-
}
50+
check(
51+
DoubleStreamExample::useParameterStream,
52+
eq(2),
53+
{ s, r -> s.toArray().isEmpty() && r == 0 },
54+
{ s, r -> s.toArray().let {
55+
it.isNotEmpty() && r == it.size }
56+
},
57+
coverage = AtLeast(94)
58+
)
6059
}
6160

6261
@Test

‎utbot-framework-test/src/test/kotlin/org/utbot/examples/stream/IntStreamExampleTest.kt

+13
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@ class IntStreamExampleTest : UtValueTestCaseChecker(
4646
}
4747
}
4848

49+
@Test
50+
fun testUseParameterStream() {
51+
check(
52+
IntStreamExample::useParameterStream,
53+
eq(2),
54+
{ s, r -> s.toArray().isEmpty() && r == 0 },
55+
{ s, r -> s.toArray().let {
56+
it.isNotEmpty() && r == it.size }
57+
},
58+
coverage = AtLeast(94)
59+
)
60+
}
61+
4962
@Test
5063
fun testFilterExample() {
5164
check(

‎utbot-framework-test/src/test/kotlin/org/utbot/examples/stream/LongStreamExampleTest.kt

+13
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@ class LongStreamExampleTest : UtValueTestCaseChecker(
4646
}
4747
}
4848

49+
@Test
50+
fun testUseParameterStream() {
51+
check(
52+
LongStreamExample::useParameterStream,
53+
eq(2),
54+
{ s, r -> s.toArray().isEmpty() && r == 0 },
55+
{ s, r -> s.toArray().let {
56+
it.isNotEmpty() && r == it.size }
57+
},
58+
coverage = AtLeast(94)
59+
)
60+
}
61+
4962
@Test
5063
fun testFilterExample() {
5164
check(

‎utbot-framework/src/main/java/org/utbot/engine/overrides/collections/UtGenericStorage.java

+6
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,10 @@ public interface UtGenericStorage<E> {
1010
@SuppressWarnings("unused")
1111
default void setEqualGenericType(RangeModifiableUnlimitedArray<E> elements) {}
1212

13+
/**
14+
* Auxiliary method that tells engine to add constraint, that binds type parameter of this storage
15+
* to the type of the specified object value.
16+
*/
17+
@SuppressWarnings("unused")
18+
default void setGenericTypeToTypeOfValue(RangeModifiableUnlimitedArray<E> array, E value) {}
1319
}

‎utbot-framework/src/main/java/org/utbot/engine/overrides/stream/UtDoubleStream.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ public UtDoubleStream(Double[] data, int startInclusive, int endExclusive) {
7373
* <li> elementData is marked as parameter </li>
7474
* <li> elementData.storage and it's elements are marked as parameters </li>
7575
*/
76-
@SuppressWarnings("DuplicatedCode")
76+
@SuppressWarnings({"DuplicatedCode"})
7777
void preconditionCheck() {
7878
if (alreadyVisited(this)) {
7979
return;
8080
}
81-
setEqualGenericType(elementData);
81+
setGenericTypeToTypeOfValue(elementData, 0.0);
8282

8383
assume(elementData != null);
8484
assume(elementData.storage != null);
@@ -97,6 +97,9 @@ void preconditionCheck() {
9797
assume(elementData.get(i) != null);
9898
}
9999

100+
// Do not assume that firstly used stream may be already closed to prevent garbage branches
101+
isClosed = false;
102+
100103
visit(this);
101104
}
102105

‎utbot-framework/src/main/java/org/utbot/engine/overrides/stream/UtIntStream.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void preconditionCheck() {
7979
if (alreadyVisited(this)) {
8080
return;
8181
}
82-
setEqualGenericType(elementData);
82+
setGenericTypeToTypeOfValue(elementData, 0);
8383

8484
assume(elementData != null);
8585
assume(elementData.storage != null);
@@ -98,6 +98,9 @@ void preconditionCheck() {
9898
assume(elementData.get(i) != null);
9999
}
100100

101+
// Do not assume that firstly used stream may be already closed to prevent garbage branches
102+
isClosed = false;
103+
101104
visit(this);
102105
}
103106

‎utbot-framework/src/main/java/org/utbot/engine/overrides/stream/UtLongStream.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void preconditionCheck() {
7979
if (alreadyVisited(this)) {
8080
return;
8181
}
82-
setEqualGenericType(elementData);
82+
setGenericTypeToTypeOfValue(elementData, 0L);
8383

8484
assume(elementData != null);
8585
assume(elementData.storage != null);
@@ -98,6 +98,9 @@ void preconditionCheck() {
9898
assume(elementData.get(i) != null);
9999
}
100100

101+
// Do not assume that firstly used stream may be already closed to prevent garbage branches
102+
isClosed = false;
103+
101104
visit(this);
102105
}
103106

‎utbot-framework/src/main/kotlin/org/utbot/engine/ArrayObjectWrappers.kt

+18-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.utbot.framework.plugin.api.util.id
2929
import org.utbot.framework.plugin.api.util.objectArrayClassId
3030
import org.utbot.framework.plugin.api.util.objectClassId
3131
import soot.ArrayType
32+
import soot.RefType
3233
import soot.Scene
3334
import soot.SootClass
3435
import soot.SootField
@@ -196,7 +197,23 @@ class RangeModifiableUnlimitedArrayWrapper : WrapperInterface {
196197
with(traverser) {
197198
val value = getStorageArrayExpression(wrapper).select((parameters[0] as PrimitiveValue).expr)
198199
val addr = UtAddrExpression(value)
199-
val resultObject = createObject(addr, OBJECT_TYPE, useConcreteType = false)
200+
201+
// Try to retrieve manually set type if present
202+
val valueType = typeRegistry
203+
.getTypeStoragesForObjectTypeParameters(wrapper.addr)
204+
?.singleOrNull()
205+
?.leastCommonType
206+
?: OBJECT_TYPE
207+
208+
val resultObject = if (valueType is RefType) {
209+
createObject(addr, valueType, useConcreteType = false)
210+
} else {
211+
require(valueType is ArrayType) {
212+
"Unexpected Primitive Type $valueType in generic parameter for RangeModifiableUnlimitedArray $wrapper"
213+
}
214+
215+
createArray(addr, valueType, useConcreteType = false)
216+
}
200217

201218
listOf(
202219
MethodResult(

‎utbot-framework/src/main/kotlin/org/utbot/engine/CollectionWrappers.kt

+12-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import org.utbot.framework.plugin.api.UtCompositeModel
2323
import org.utbot.framework.plugin.api.UtExecutableCallModel
2424
import org.utbot.framework.plugin.api.UtModel
2525
import org.utbot.framework.plugin.api.UtNullModel
26-
import org.utbot.framework.plugin.api.UtStatementModel
2726
import org.utbot.framework.plugin.api.classId
2827
import org.utbot.framework.plugin.api.getIdOrThrow
2928
import org.utbot.framework.util.graph
@@ -40,7 +39,6 @@ import soot.Scene
4039
import soot.SootClass
4140
import soot.SootField
4241
import soot.SootMethod
43-
import kotlin.reflect.KFunction4
4442

4543
abstract class BaseOverriddenWrapper(protected val overriddenClassName: String) : WrapperInterface {
4644
val overriddenClass: SootClass = Scene.v().getSootClass(overriddenClassName)
@@ -179,6 +177,15 @@ abstract class BaseGenericStorageBasedContainerWrapper(containerClassName: Strin
179177

180178
listOf(methodResult)
181179
}
180+
UT_GENERIC_STORAGE_SET_GENERIC_TYPE_TO_TYPE_OF_VALUE_SIGNATURE -> {
181+
val valueTypeStorage = parameters[1].typeStorage
182+
183+
typeRegistry.saveObjectParameterTypeStorages(parameters[0].addr, listOf(valueTypeStorage))
184+
185+
val methodResult = MethodResult(SymbolicSuccess(voidValue))
186+
187+
listOf(methodResult)
188+
}
182189
else -> null
183190
}
184191

@@ -398,6 +405,9 @@ private val UT_GENERIC_STORAGE_CLASS
398405
internal val UT_GENERIC_STORAGE_SET_EQUAL_GENERIC_TYPE_SIGNATURE =
399406
UT_GENERIC_STORAGE_CLASS.getMethodByName(UtGenericStorage<*>::setEqualGenericType.name).signature
400407

408+
internal val UT_GENERIC_STORAGE_SET_GENERIC_TYPE_TO_TYPE_OF_VALUE_SIGNATURE =
409+
UT_GENERIC_STORAGE_CLASS.getMethodByName(UtGenericStorage<*>::setGenericTypeToTypeOfValue.name).signature
410+
401411
private val UT_GENERIC_ASSOCIATIVE_CLASS
402412
get() = Scene.v().getSootClass(UtGenericAssociative::class.java.canonicalName)
403413

‎utbot-sample/src/main/java/org/utbot/examples/stream/IntStreamExample.java

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ IntStream returningStreamAsParameterExample(IntStream s) {
4040
return s;
4141
}
4242

43+
int useParameterStream(IntStream s) {
44+
UtMock.assume(s != null);
45+
46+
final int[] values = s.toArray();
47+
48+
if (values.length == 0) {
49+
return 0;
50+
} else {
51+
return values.length;
52+
}
53+
}
54+
4355
boolean filterExample(List<Short> list) {
4456
UtMock.assume(list != null && !list.isEmpty());
4557

‎utbot-sample/src/main/java/org/utbot/examples/stream/LongStreamExample.java

+12
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ LongStream returningStreamAsParameterExample(LongStream s) {
3939
return s;
4040
}
4141

42+
int useParameterStream(LongStream s) {
43+
UtMock.assume(s != null);
44+
45+
final long[] values = s.toArray();
46+
47+
if (values.length == 0) {
48+
return 0;
49+
} else {
50+
return values.length;
51+
}
52+
}
53+
4254
boolean filterExample(List<Short> list) {
4355
UtMock.assume(list != null && !list.isEmpty());
4456

0 commit comments

Comments
 (0)
Please sign in to comment.