Skip to content

Commit 579f340

Browse files
committed
Remove Z3 string theory support
* Removed `UtNativeString`, `NativeStringWrapper`, string-related `UtExpression` subclasses * Implemented `toString` methods for numeric wrappers in Java * Restored temporarily disabled `testByteToString` test Complex `GenericExamples` string tests are disabled until symbolic part of the wrapper is enabled.
1 parent 1260c8f commit 579f340

File tree

25 files changed

+277
-1414
lines changed

25 files changed

+277
-1414
lines changed

utbot-analytics/src/main/kotlin/org/utbot/features/UtExpressionStructureCounter.kt

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,6 @@ val featureIndex = listOf(
3434
UtBoolOpExpression::class.simpleName,
3535
UtIsExpression::class.simpleName,
3636
UtIteExpression::class.simpleName,
37-
UtStringConst::class.simpleName,
38-
UtConcatExpression::class.simpleName,
39-
UtConvertToString::class.simpleName,
40-
UtStringLength::class.simpleName,
41-
UtStringPositiveLength::class.simpleName,
42-
UtStringCharAt::class.simpleName,
43-
UtStringEq::class.simpleName,
44-
UtSubstringExpression::class.simpleName,
45-
UtReplaceExpression::class.simpleName,
46-
UtStartsWithExpression::class.simpleName,
47-
UtEndsWithExpression::class.simpleName,
48-
UtIndexOfExpression::class.simpleName,
49-
UtContainsExpression::class.simpleName,
50-
UtToStringExpression::class.simpleName,
51-
UtSeqLiteral::class.simpleName,
5237
TREES,
5338
MAX_NODES,
5439
MIN_NODES,
@@ -216,59 +201,6 @@ class UtExpressionStructureCounter(private val input: Iterable<UtExpression>) :
216201
)
217202
}
218203

219-
//const string value
220-
override fun visit(expr: UtStringConst) = NestStat()
221-
222-
override fun visit(expr: UtConcatExpression) = multipleExpression(expr.parts)
223-
224-
override fun visit(expr: UtConvertToString): NestStat {
225-
val stat = buildState(expr.expression)
226-
stat.level++
227-
stat.nodes++
228-
return stat
229-
}
230-
231-
override fun visit(expr: UtStringToInt): NestStat {
232-
val stat = buildState(expr.expression)
233-
stat.level++
234-
stat.nodes++
235-
return stat
236-
}
237-
238-
override fun visit(expr: UtStringLength): NestStat {
239-
val stat = buildState(expr.string)
240-
stat.level++
241-
stat.nodes++
242-
return stat
243-
}
244-
245-
override fun visit(expr: UtStringPositiveLength): NestStat {
246-
val stat = buildState(expr.string)
247-
stat.level++
248-
stat.nodes++
249-
return stat
250-
}
251-
252-
override fun visit(expr: UtStringCharAt) = multipleExpressions(expr.string, expr.index)
253-
254-
override fun visit(expr: UtStringEq) = multipleExpressions(expr.left, expr.right)
255-
256-
override fun visit(expr: UtSubstringExpression) = multipleExpressions(expr.string, expr.beginIndex, expr.length)
257-
258-
override fun visit(expr: UtReplaceExpression) = multipleExpressions(expr.string, expr.regex, expr.replacement)
259-
260-
override fun visit(expr: UtStartsWithExpression) = multipleExpressions(expr.string, expr.prefix)
261-
262-
override fun visit(expr: UtEndsWithExpression) = multipleExpressions(expr.string, expr.suffix)
263-
264-
override fun visit(expr: UtIndexOfExpression) = multipleExpressions(expr.string, expr.substring)
265-
266-
override fun visit(expr: UtContainsExpression) = multipleExpressions(expr.string, expr.substring)
267-
268-
override fun visit(expr: UtToStringExpression) = multipleExpressions(expr.notNullExpr, expr.isNull)
269-
270-
override fun visit(expr: UtSeqLiteral) = NestStat()
271-
272204
private fun multipleExpressions(vararg expressions: UtExpression) = multipleExpression(expressions.toList())
273205

274206
private fun multipleExpression(expressions: List<UtExpression>): NestStat {
@@ -311,14 +243,6 @@ class UtExpressionStructureCounter(private val input: Iterable<UtExpression>) :
311243
override fun visit(expr: UtArrayApplyForAll): NestStat {
312244
return NestStat()
313245
}
314-
315-
override fun visit(expr: UtStringToArray): NestStat {
316-
return NestStat()
317-
}
318-
319-
override fun visit(expr: UtArrayToString): NestStat {
320-
return NestStat()
321-
}
322246
}
323247

324248
data class NestStat(var nodes: Int = 1, var level: Int = 1)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.utbot.examples.strings
2+
3+
import org.utbot.tests.infrastructure.UtValueTestCaseChecker
4+
import org.utbot.tests.infrastructure.isException
5+
import org.utbot.tests.infrastructure.CodeGeneration
6+
import org.utbot.framework.plugin.api.CodegenLanguage
7+
import org.junit.jupiter.api.Disabled
8+
import org.junit.jupiter.api.Test
9+
import org.utbot.testcheckers.eq
10+
11+
@Disabled("TODO: Fails and takes too long")
12+
internal class GenericExamplesTest : UtValueTestCaseChecker(
13+
testClass = GenericExamples::class,
14+
testCodeGeneration = true,
15+
languagePipelines = listOf(
16+
CodeGenerationLanguageLastStage(CodegenLanguage.JAVA),
17+
CodeGenerationLanguageLastStage(CodegenLanguage.KOTLIN, CodeGeneration)
18+
)
19+
) {
20+
@Test
21+
fun testContainsOkWithIntegerType() {
22+
checkWithException(
23+
GenericExamples<Int>::containsOk,
24+
eq(2),
25+
{ obj, result -> obj == null && result.isException<NullPointerException>() },
26+
{ obj, result -> obj != null && result.isSuccess && result.getOrNull() == false }
27+
)
28+
}
29+
30+
@Test
31+
fun testContainsOkExampleTest() {
32+
check(
33+
GenericExamples<String>::containsOkExample,
34+
eq(1),
35+
{ result -> result == true }
36+
)
37+
}
38+
}

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

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,13 @@ internal class StringExamplesTest : UtValueTestCaseChecker(
2626
)
2727
) {
2828
@Test
29-
@Disabled("Flaky test: https://github.com/UnitTestBot/UTBotJava/issues/131 (will be enabled in new strings PR)")
3029
fun testByteToString() {
31-
// TODO related to the https://github.com/UnitTestBot/UTBotJava/issues/131
32-
withSolverTimeoutInMillis(5000) {
33-
check(
34-
StringExamples::byteToString,
35-
eq(2),
36-
{ a, b, r -> a > b && r == a.toString() },
37-
{ a, b, r -> a <= b && r == b.toString() },
38-
)
39-
}
30+
check(
31+
StringExamples::byteToString,
32+
eq(2),
33+
{ a, b, r -> a > b && r == a.toString() },
34+
{ a, b, r -> a <= b && r == b.toString() },
35+
)
4036
}
4137

4238
@Test
@@ -53,43 +49,34 @@ internal class StringExamplesTest : UtValueTestCaseChecker(
5349

5450
@Test
5551
fun testShortToString() {
56-
// TODO related to the https://github.com/UnitTestBot/UTBotJava/issues/131
57-
withSolverTimeoutInMillis(5000) {
58-
check(
59-
StringExamples::shortToString,
60-
eq(2),
61-
{ a, b, r -> a > b && r == a.toString() },
62-
{ a, b, r -> a <= b && r == b.toString() },
63-
)
64-
}
52+
check(
53+
StringExamples::shortToString,
54+
ignoreExecutionsNumber,
55+
{ a, b, r -> a > b && r == a.toString() },
56+
{ a, b, r -> a <= b && r == b.toString() },
57+
)
6558
}
6659

6760

6861
@Test
6962
fun testIntToString() {
70-
// TODO related to the https://github.com/UnitTestBot/UTBotJava/issues/131
71-
withSolverTimeoutInMillis(5000) {
72-
check(
73-
StringExamples::intToString,
74-
ignoreExecutionsNumber,
75-
{ a, b, r -> a > b && r == a.toString() },
76-
{ a, b, r -> a <= b && r == b.toString() },
77-
)
78-
}
63+
check(
64+
StringExamples::intToString,
65+
ignoreExecutionsNumber,
66+
{ a, b, r -> a > b && r == a.toString() },
67+
{ a, b, r -> a <= b && r == b.toString() },
68+
)
7969
}
8070

8171

8272
@Test
8373
fun testLongToString() {
84-
// TODO related to the https://github.com/UnitTestBot/UTBotJava/issues/131
85-
withSolverTimeoutInMillis(5000) {
86-
check(
87-
StringExamples::longToString,
88-
ignoreExecutionsNumber,
89-
{ a, b, r -> a > b && r == a.toString() },
90-
{ a, b, r -> a <= b && r == b.toString() },
91-
)
92-
}
74+
check(
75+
StringExamples::longToString,
76+
ignoreExecutionsNumber,
77+
{ a, b, r -> a > b && r == a.toString() },
78+
{ a, b, r -> a <= b && r == b.toString() },
79+
)
9380
}
9481

9582
@Test
@@ -250,6 +237,15 @@ internal class StringExamplesTest : UtValueTestCaseChecker(
250237
)
251238
}
252239

240+
@Test
241+
fun testIsStringBuilderEmpty() {
242+
check(
243+
StringExamples::isStringBuilderEmpty,
244+
eq(2),
245+
{ stringBuilder, result -> result == stringBuilder.isEmpty() }
246+
)
247+
}
248+
253249
@Test
254250
@Disabled("Flaky on GitHub: https://github.com/UnitTestBot/UTBotJava/issues/1004")
255251
fun testIsValidUuid() {
@@ -585,7 +581,7 @@ internal class StringExamplesTest : UtValueTestCaseChecker(
585581
withPushingStateFromPathSelectorForConcrete {
586582
check(
587583
StringExamples::equalsIgnoreCase,
588-
eq(2),
584+
ignoreExecutionsNumber,
589585
{ s, r -> "SUCCESS".equals(s, ignoreCase = true) && r == "success" },
590586
{ s, r -> !"SUCCESS".equals(s, ignoreCase = true) && r == "failure" },
591587
)

utbot-framework/src/main/java/org/utbot/engine/overrides/Byte.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.utbot.engine.overrides;
22

33
import org.utbot.api.annotation.UtClassMock;
4-
import org.utbot.engine.overrides.strings.UtNativeString;
5-
import org.utbot.engine.overrides.strings.UtString;
64
import org.utbot.engine.overrides.strings.UtStringBuilder;
75

6+
import java.util.Arrays;
7+
88
import static org.utbot.api.mock.UtMock.assume;
99
import static org.utbot.engine.overrides.UtLogicMock.ite;
1010
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
@@ -54,11 +54,31 @@ public static String toString(byte b) {
5454
// and reduce time of solving queries with bv2int expressions
5555
assume(b < 128);
5656
assume(b >= -128);
57-
// prefix = condition ? "-" : ""
58-
String prefix = ite(condition, "-", "");
59-
UtStringBuilder sb = new UtStringBuilder(prefix);
60-
// value = condition ? -i : i
61-
int value = ite(condition, (byte) -b, b);
62-
return sb.append(new UtString(new UtNativeString(value)).toStringImpl()).toString();
57+
58+
if (b == -128) {
59+
return "-128";
60+
} else {
61+
String prefix = ite(condition, "-", "");
62+
int value = ite(condition, (byte) -b, b);
63+
char[] reversed = new char[3];
64+
int offset = 0;
65+
while (value > 0) {
66+
reversed[offset] = (char) ('0' + value % 10);
67+
value = value / 10;
68+
offset++;
69+
}
70+
71+
if (offset > 0) {
72+
char[] buffer = new char[offset];
73+
int counter = 0;
74+
while (offset > 0) {
75+
offset--;
76+
buffer[counter++] = reversed[offset];
77+
}
78+
return prefix + new String(buffer);
79+
} else {
80+
return "0";
81+
}
82+
}
6383
}
6484
}

utbot-framework/src/main/java/org/utbot/engine/overrides/Integer.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package org.utbot.engine.overrides;
22

33
import org.utbot.api.annotation.UtClassMock;
4-
import org.utbot.engine.overrides.strings.UtNativeString;
5-
import org.utbot.engine.overrides.strings.UtString;
64
import org.utbot.engine.overrides.strings.UtStringBuilder;
75

86
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
@@ -75,17 +73,30 @@ public static String toString(int i) {
7573
if (i == 0x80000000) { // java.lang.MIN_VALUE
7674
return "-2147483648";
7775
}
78-
// assumes are placed here to limit search space of solver
79-
// and reduce time of solving queries with bv2int expressions
80-
assumeOrExecuteConcretely(i <= 0x8000);
81-
assumeOrExecuteConcretely(i >= -0x8000);
76+
8277
// condition = i < 0
8378
boolean condition = less(i, 0);
8479
// prefix = condition ? "-" : ""
8580
String prefix = ite(condition, "-", "");
86-
UtStringBuilder sb = new UtStringBuilder(prefix);
87-
// value = condition ? -i : i
8881
int value = ite(condition, -i, i);
89-
return sb.append(new UtString(new UtNativeString(value)).toStringImpl()).toString();
82+
char[] reversed = new char[10];
83+
int offset = 0;
84+
while (value > 0) {
85+
reversed[offset] = (char) ('0' + value % 10);
86+
value = value / 10;
87+
offset++;
88+
}
89+
90+
if (offset > 0) {
91+
char[] buffer = new char[offset];
92+
int counter = 0;
93+
while (offset > 0) {
94+
offset--;
95+
buffer[counter++] = reversed[offset];
96+
}
97+
return prefix + new String(buffer);
98+
} else {
99+
return "0";
100+
}
90101
}
91102
}

utbot-framework/src/main/java/org/utbot/engine/overrides/Long.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package org.utbot.engine.overrides;
22

33
import org.utbot.api.annotation.UtClassMock;
4-
import org.utbot.engine.overrides.strings.UtNativeString;
5-
import org.utbot.engine.overrides.strings.UtString;
64
import org.utbot.engine.overrides.strings.UtStringBuilder;
75

86
import static org.utbot.api.mock.UtMock.assumeOrExecuteConcretely;
@@ -75,17 +73,30 @@ public static String toString(long l) {
7573
if (l == 0x8000000000000000L) { // java.lang.Long.MIN_VALUE
7674
return "-9223372036854775808";
7775
}
78-
// assumes are placed here to limit search space of solver
79-
// and reduce time of solving queries with bv2int expressions
80-
assumeOrExecuteConcretely(l <= 10000);
81-
assumeOrExecuteConcretely(l >= -10000);
8276
// condition = l < 0
8377
boolean condition = less(l, 0);
8478
// prefix = condition ? "-" : ""
8579
String prefix = ite(condition, "-", "");
86-
UtStringBuilder sb = new UtStringBuilder(prefix);
8780
// value = condition ? -l : l
8881
long value = ite(condition, -l, l);
89-
return sb.append(new UtString(new UtNativeString(value)).toStringImpl()).toString();
82+
char[] reversed = new char[19];
83+
int offset = 0;
84+
while (value > 0) {
85+
reversed[offset] = (char) ('0' + value % 10);
86+
value = value / 10;
87+
offset++;
88+
}
89+
90+
if (offset > 0) {
91+
char[] buffer = new char[offset];
92+
int i = 0;
93+
while (offset > 0) {
94+
offset--;
95+
buffer[i++] = reversed[offset];
96+
}
97+
return prefix + new String(buffer);
98+
} else {
99+
return "0";
100+
}
90101
}
91102
}

0 commit comments

Comments
 (0)