Skip to content

Commit dbbdced

Browse files
committed
ToString support for abstract collection using makeSymbolic #391
1 parent 16c13fb commit dbbdced

File tree

8 files changed

+55
-5
lines changed

8 files changed

+55
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.utbot.engine.overrides.collections;
2+
3+
import org.utbot.api.annotation.UtClassMock;
4+
5+
import static org.utbot.api.mock.UtMock.makeSymbolic;
6+
7+
@UtClassMock(target = java.util.AbstractCollection.class, internalUsage = true)
8+
public abstract class AbstractCollection<E> implements java.util.Collection<E> {
9+
@Override
10+
public String toString() {
11+
return makeSymbolic(false);
12+
}
13+
}

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import org.utbot.engine.overrides.stream.UtStream;
2020

2121
import static org.utbot.api.mock.UtMock.assume;
22+
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
2223
import static org.utbot.engine.ResolverKt.MAX_LIST_SIZE;
2324
import static org.utbot.engine.overrides.UtOverrideMock.alreadyVisited;
24-
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
2525
import static org.utbot.engine.overrides.UtOverrideMock.executeConcretely;
2626
import static org.utbot.engine.overrides.UtOverrideMock.parameter;
2727
import static org.utbot.engine.overrides.UtOverrideMock.visit;
@@ -63,6 +63,14 @@ public UtArrayList(Collection<? extends E> c) {
6363
addAll(c);
6464
}
6565

66+
public UtArrayList(Object[] data) {
67+
visit(this);
68+
int length = data.length;
69+
elementData = new RangeModifiableUnlimitedArray<>();
70+
elementData.setRange(0, data, 0, length);
71+
elementData.end = length;
72+
}
73+
6674
/**
6775
* Precondition check is called only once by object,
6876
* if it was passed as parameter to method under test.

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import org.jetbrains.annotations.Nullable;
1616

1717
import static org.utbot.api.mock.UtMock.assume;
18+
import static org.utbot.api.mock.UtMock.makeSymbolic;
1819
import static org.utbot.engine.overrides.UtOverrideMock.alreadyVisited;
1920
import static org.utbot.engine.overrides.UtOverrideMock.doesntThrow;
20-
import static org.utbot.engine.overrides.UtOverrideMock.executeConcretely;
2121
import static org.utbot.engine.overrides.UtOverrideMock.parameter;
2222
import static org.utbot.engine.overrides.UtOverrideMock.visit;
2323

@@ -556,8 +556,7 @@ public final boolean remove(Object o) {
556556
// TODO rewrite it JIRA:1604
557557
@Override
558558
public String toString() {
559-
executeConcretely();
560-
return super.toString();
559+
return makeSymbolic(false);
561560
}
562561

563562
public final class Entry implements Map.Entry<K, V> {

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

+9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.utbot.engine.overrides.stream;
22

33
import org.utbot.api.annotation.UtClassMock;
4+
import org.utbot.engine.overrides.collections.UtArrayList;
45

6+
import java.util.List;
57
import java.util.stream.Stream;
68

79
@UtClassMock(target = java.util.Arrays.class, internalUsage = true)
@@ -16,5 +18,12 @@ public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusi
1618
return new UtStream<>(array, startInclusive, endExclusive);
1719
}
1820

21+
@SuppressWarnings({"unused", "varargs"})
22+
@SafeVarargs
23+
public static <T> List<T> asList(T... a) {
24+
// TODO immutable collection https://github.com/UnitTestBot/UTBotJava/issues/398
25+
return new UtArrayList<>(a);
26+
}
27+
1928
// TODO primitive arrays https://github.com/UnitTestBot/UTBotJava/issues/146
2029
}

utbot-framework/src/main/kotlin/org/utbot/engine/UtBotSymbolicEngine.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -2536,7 +2536,8 @@ class UtBotSymbolicEngine(
25362536
if (methodSignature != makeSymbolicMethod.signature && methodSignature != nonNullableMakeSymbolic.signature) return null
25372537

25382538
val method = environment.method
2539-
val isInternalMock = method.hasInternalMockAnnotation || method.declaringClass.allMethodsAreInternalMocks
2539+
val declaringClass = method.declaringClass
2540+
val isInternalMock = method.hasInternalMockAnnotation || declaringClass.allMethodsAreInternalMocks || declaringClass.isOverridden
25402541
val parameters = resolveParameters(invokeExpr.args, invokeExpr.method.parameterTypes)
25412542
val mockMethodResult = mockStaticMethod(invokeExpr.method, parameters)?.single()
25422543
?: error("Unsuccessful mock attempt of the `makeSymbolic` method call: $invokeExpr")

utbot-framework/src/main/kotlin/org/utbot/framework/plugin/api/SootUtils.kt

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import org.utbot.engine.overrides.collections.UtOptional
3131
import org.utbot.engine.overrides.collections.UtOptionalDouble
3232
import org.utbot.engine.overrides.collections.UtOptionalInt
3333
import org.utbot.engine.overrides.collections.UtOptionalLong
34+
import org.utbot.engine.overrides.collections.AbstractCollection
35+
import org.utbot.engine.overrides.stream.Arrays
3436
import org.utbot.engine.overrides.stream.Stream
3537
import org.utbot.engine.overrides.stream.UtStream
3638
import java.io.File
@@ -90,6 +92,7 @@ private fun addBasicClasses(vararg classes: KClass<*>) {
9092
}
9193

9294
private val classesToLoad = arrayOf(
95+
AbstractCollection::class,
9396
UtMock::class,
9497
UtOverrideMock::class,
9598
UtLogicMock::class,
@@ -132,6 +135,7 @@ private val classesToLoad = arrayOf(
132135
UtStringBuilder::class,
133136
UtStringBuffer::class,
134137
Stream::class,
138+
Arrays::class,
135139
Collection::class,
136140
UtStream::class,
137141
UtStream.UtStreamIterator::class

utbot-framework/src/test/kotlin/org/utbot/examples/strings/StringExamplesTest.kt

+10
Original file line numberDiff line numberDiff line change
@@ -589,4 +589,14 @@ internal class StringExamplesTest : AbstractTestCaseGeneratorTest(
589589
)
590590
}
591591
}
592+
593+
@Test
594+
fun testListToString() {
595+
check(
596+
StringExamples::listToString,
597+
eq(1),
598+
{ r -> r == "[a, b, c]"},
599+
coverage = DoNotCalculate
600+
)
601+
}
592602
}

utbot-sample/src/main/java/org/utbot/examples/strings/StringExamples.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.utbot.examples.strings;
22

3+
import java.util.Arrays;
4+
35
import static java.lang.Boolean.valueOf;
46

57
class IntPair {
@@ -411,4 +413,8 @@ public String equalsIgnoreCase(String s) {
411413
return "failure";
412414
}
413415
}
416+
417+
public String listToString() {
418+
return Arrays.asList("a", "b", "c").toString();
419+
}
414420
}

0 commit comments

Comments
 (0)