Skip to content

Commit 34b2b02

Browse files
Merge pull request #1939 from romainbrenguier/bugfix/builtin-string-insert-eval
Fix StringBuilder.insert and String.substring [TG-2459]
2 parents 9d9fafa + 84186ff commit 34b2b02

File tree

16 files changed

+259
-76
lines changed

16 files changed

+259
-76
lines changed
Binary file not shown.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
public class Test {
3+
public void check (int i) {
4+
if(i == 0)
5+
{
6+
// Arrange
7+
StringBuilder s = new StringBuilder("bar");
8+
9+
// Act
10+
s = org.cprover.CProverString.insert(s, 0, "foo");
11+
12+
// Should succeed
13+
assert s.toString().equals("foobar");
14+
15+
// Should fail
16+
assert !s.toString().equals("foobar");
17+
}
18+
if(i == 1)
19+
{
20+
// Arrange
21+
StringBuilder s = new StringBuilder("bar");
22+
23+
// Act
24+
s = org.cprover.CProverString.insert(s, -10, "foo");
25+
26+
// Should succeed
27+
assert s.toString().equals("foobar");
28+
29+
// Should fail
30+
assert !s.toString().equals("foobar");
31+
}
32+
if(i == 2)
33+
{
34+
// Arrange
35+
StringBuilder s = new StringBuilder("bar");
36+
37+
// Act
38+
s = org.cprover.CProverString.insert(s, 10, "foo");
39+
40+
// Should succeed
41+
assert s.toString().equals("barfoo");
42+
43+
// Should fail
44+
assert !s.toString().equals("barfoo");
45+
}
46+
47+
}
48+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CORE
2+
Test.class
3+
--refine-strings --function Test.check
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
assertion at file Test.java line 13 .*: SUCCESS
7+
assertion at file Test.java line 16 .*: FAILURE
8+
assertion at file Test.java line 27 .*: SUCCESS
9+
assertion at file Test.java line 30 .*: FAILURE
10+
assertion at file Test.java line 41 .*: SUCCESS
11+
assertion at file Test.java line 44 .*: FAILURE
12+
--
Binary file not shown.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// This test uses CProverString so should be compiled with
2+
// javac Test.java ../cprover/CProverString.java
3+
import org.cprover.CProverString;
4+
5+
class Test {
6+
public void testSuccess(String s, String t, int start, int end) {
7+
// Filter
8+
if (s == null || t == null)
9+
return;
10+
11+
// Act
12+
StringBuilder sb = new StringBuilder(s);
13+
String result = CProverString.append(sb, t, start, end).toString();
14+
15+
// Arrange
16+
StringBuilder reference = new StringBuilder(s);
17+
if(start < 0)
18+
start = 0;
19+
for (int i = start; i < end && i < t.length(); i++)
20+
reference.append(org.cprover.CProverString.charAt(t, i));
21+
22+
// Assert
23+
assert result.equals(reference.toString());
24+
}
25+
26+
public void testFail(int i) {
27+
// Arrange
28+
StringBuilder sb = new StringBuilder("foo");
29+
30+
// Act
31+
CProverString.append(sb, "bar", 0, 1);
32+
CProverString.append(sb, "bar", 0, 4);
33+
CProverString.append(sb, "foo", -1, 0);
34+
CProverString.append(sb, "foo", -10, -1);
35+
CProverString.append(sb, "bar", -10, 25);
36+
37+
// Assert
38+
assert !sb.toString().equals("foobbarbar");
39+
}
40+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
Test.class
3+
--refine-strings --string-max-length 100 --string-max-input-length 4 --verbosity 10 --unwind 5 Test.class --function Test.testSuccess
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
assertion at file Test.java line 23 .*: SUCCESS
7+
--
8+
^warning: ignoring
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
Test.class
3+
--refine-strings --string-max-length 10000 --verbosity 10 Test.class --function Test.testFail
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
assertion at file Test.java line 38 .*: FAILURE
7+
--
8+
^warning: ignoring
Binary file not shown.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// This test uses CProverString so should be compiled with
2+
// javac Test.java ../cprover/CProverString.java
3+
4+
class Test {
5+
public void testSuccess(String s, int start, int end) {
6+
// Filter
7+
if (s == null)
8+
return;
9+
10+
// Act
11+
String sub = org.cprover.CProverString.substring(s, start, end);
12+
13+
// Arrange
14+
StringBuilder reference = new StringBuilder();
15+
if(start < 0)
16+
start = 0;
17+
for (int i = start; i < end && i < s.length(); i++)
18+
reference.append(org.cprover.CProverString.charAt(s, i));
19+
20+
// Assert
21+
assert sub.equals(reference.toString());
22+
}
23+
24+
public void testFail(int i) {
25+
// Arrange
26+
String[] s = new String[5];
27+
28+
// Act
29+
s[0] = org.cprover.CProverString.substring("foo", 0, 1);
30+
s[1] = org.cprover.CProverString.substring("foo", 0, 4);
31+
s[2] = org.cprover.CProverString.substring("foo", -1, 0);
32+
s[3] = org.cprover.CProverString.substring("foo", -10, -1);
33+
s[4] = org.cprover.CProverString.substring("foo", -10, 25);
34+
35+
// Assert
36+
if(i == 0)
37+
assert !s[0].equals("f");
38+
if(i == 1)
39+
assert !s[1].equals("foo");
40+
if(i == 2)
41+
assert !s[2].equals("");
42+
if(i == 3)
43+
assert !s[3].equals("");
44+
if(i == 4)
45+
assert !s[4].equals("foo");
46+
}
47+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CORE
2+
Test.class
3+
--refine-strings --unwind 10 --string-max-input-length 6 --function Test.testSuccess
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
assertion at file Test.java line 21.*: SUCCESS

0 commit comments

Comments
 (0)