Skip to content

Commit

Permalink
ToString support for abstract collection using makeSymbolic #391
Browse files Browse the repository at this point in the history
  • Loading branch information
CaelmBleidd committed Jul 4, 2022
1 parent b737f40 commit ca9154e
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.utbot.engine.overrides.collections;

import org.utbot.api.annotation.UtClassMock;

import static org.utbot.api.mock.UtMock.makeSymbolic;

@UtClassMock(target = java.util.AbstractCollection.class, internalUsage = true)
public abstract class AbstractCollection<E> implements java.util.Collection<E> {
@Override
public String toString() {
return makeSymbolic(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
import org.utbot.engine.overrides.stream.UtStream;

import static org.utbot.api.mock.UtMock.assume;
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
import static org.utbot.engine.ResolverKt.MAX_LIST_SIZE;
import static org.utbot.engine.overrides.UtOverrideMock.alreadyVisited;
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
import static org.utbot.engine.overrides.UtOverrideMock.executeConcretely;
import static org.utbot.engine.overrides.UtOverrideMock.parameter;
import static org.utbot.engine.overrides.UtOverrideMock.visit;
Expand Down Expand Up @@ -63,6 +63,14 @@ public UtArrayList(Collection<? extends E> c) {
addAll(c);
}

public UtArrayList(Object[] data) {
visit(this);
int length = data.length;
elementData = new RangeModifiableUnlimitedArray<>();
elementData.setRange(0, data, 0, length);
elementData.end = length;
}

/**
* Precondition check is called only once by object,
* if it was passed as parameter to method under test.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
import org.jetbrains.annotations.Nullable;

import static org.utbot.api.mock.UtMock.assume;
import static org.utbot.api.mock.UtMock.makeSymbolic;
import static org.utbot.engine.overrides.UtOverrideMock.alreadyVisited;
import static org.utbot.engine.overrides.UtOverrideMock.doesntThrow;
import static org.utbot.engine.overrides.UtOverrideMock.executeConcretely;
import static org.utbot.engine.overrides.UtOverrideMock.parameter;
import static org.utbot.engine.overrides.UtOverrideMock.visit;

Expand Down Expand Up @@ -556,8 +556,7 @@ public final boolean remove(Object o) {
// TODO rewrite it JIRA:1604
@Override
public String toString() {
executeConcretely();
return super.toString();
return makeSymbolic(false);
}

public final class Entry implements Map.Entry<K, V> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.utbot.engine.overrides.stream;

import org.utbot.api.annotation.UtClassMock;
import org.utbot.engine.overrides.collections.UtArrayList;

import java.util.List;
import java.util.stream.Stream;

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

@SuppressWarnings({"unused", "varargs"})
@SafeVarargs
public static <T> List<T> asList(T... a) {
// TODO immutable collection https://github.com/UnitTestBot/UTBotJava/issues/398
return new UtArrayList<>(a);
}

// TODO primitive arrays https://github.com/UnitTestBot/UTBotJava/issues/146
}
Original file line number Diff line number Diff line change
Expand Up @@ -2526,7 +2526,8 @@ class UtBotSymbolicEngine(
if (methodSignature != makeSymbolicMethod.signature && methodSignature != nonNullableMakeSymbolic.signature) return null

val method = environment.method
val isInternalMock = method.hasInternalMockAnnotation || method.declaringClass.allMethodsAreInternalMocks
val declaringClass = method.declaringClass
val isInternalMock = method.hasInternalMockAnnotation || declaringClass.allMethodsAreInternalMocks || declaringClass.isOverridden
val parameters = resolveParameters(invokeExpr.args, invokeExpr.method.parameterTypes)
val mockMethodResult = mockStaticMethod(invokeExpr.method, parameters)?.single()
?: error("Unsuccessful mock attempt of the `makeSymbolic` method call: $invokeExpr")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import org.utbot.engine.overrides.collections.UtOptional
import org.utbot.engine.overrides.collections.UtOptionalDouble
import org.utbot.engine.overrides.collections.UtOptionalInt
import org.utbot.engine.overrides.collections.UtOptionalLong
import org.utbot.engine.overrides.stream.Arrays
import org.utbot.engine.overrides.stream.Stream
import org.utbot.engine.overrides.stream.UtStream
import java.io.File
Expand Down Expand Up @@ -132,6 +133,7 @@ private val classesToLoad = arrayOf(
UtStringBuilder::class,
UtStringBuffer::class,
Stream::class,
Arrays::class,
Collection::class,
UtStream::class,
UtStream.UtStreamIterator::class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -589,4 +589,14 @@ internal class StringExamplesTest : AbstractTestCaseGeneratorTest(
)
}
}

@Test
fun testListToString() {
check(
StringExamples::listToString,
eq(1),
{ r -> r == "[a, b, c]"},
coverage = DoNotCalculate
)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.utbot.examples.strings;

import java.util.Arrays;

import static java.lang.Boolean.valueOf;

class IntPair {
Expand Down Expand Up @@ -411,4 +413,8 @@ public String equalsIgnoreCase(String s) {
return "failure";
}
}

public String listToString() {
return Arrays.asList("a", "b", "c").toString();
}
}

0 comments on commit ca9154e

Please sign in to comment.