package org.jmlspecs.openjmltest.testcases; import java.util.Collection; import org.jmlspecs.openjmltest.EscBase; import org.junit.Assume; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.ParameterizedWithNames; import org.junit.runners.Parameterized.Parameters; @RunWith(ParameterizedWithNames.class) public class escnew3 extends EscBase { public escnew3(String options, String solver) { super(options,solver); } // Test well-definedness within the implicit old @Test public void testNonNullElements() { Assume.assumeTrue(!"z3_4_3".equals(solver)); Assume.assumeTrue(!"cvc4".equals(solver)); Assume.assumeTrue(!"yices2".equals(solver)); // TODO: yices2 cannot handle quantifiers - better error message helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ modifies \\everything;\n" +" public void m1x(/*@ non_null */ Object[] a) {\n" +" //@ assume \\nonnullelements(a);\n" +" //@ assume a.length > 1;\n" +" //@ assert a[0] != null;\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m11(Object[] a) {\n" +" //@ assume \\nonnullelements(a);\n" +" //@ assert a != null;\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m11a(Object[] a) {\n" +" //@ assume \\nonnullelements(a);\n" +" //@ assert a == null;\n" // BAD +" }\n" +" //@ modifies \\everything;\n" +" public void m1a(Object[] a) {\n" +" //@ assume a != null && a.length > 1;\n" +" //@ assert a[0] != null;\n" // BAD +" }\n" +" //@ modifies \\everything;\n" +" public void m2(Object[] a) {\n" +" //@ assume a != null && a.length == 0;\n" +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m22(Object[] a) {\n" +" //@ assume a != null && a.length == 0;\n" +" //@ assert (\\forall int i; 0<=i && i<a.length; a[i] != null);\n" // OK +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m3(Object[] a) {\n" +" //@ assume a != null && a.length == 1;\n" +" a[0] = new Object();" // No return so as not to bollix the line numbers in the error messages +" //@ assert a[0] != null;\n" // OK +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m33(Object[] a) {\n" +" //@ assume a != null && a.length == 1;\n" +" //@ assume a[0] != null;\n" +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m4(Object[] a) {\n" +" //@ assume a != null && a.length == 2;\n" +" a[0] = new Object();\n" +" a[1] = new Object();\n" +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m44(Object[] a) {\n" +" //@ assume a != null && a.length == 2;\n" +" //@ assume a[0] != null;\n" +" //@ assume a[1] != null;\n" +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m4a(Object[] a) {\n" +" //@ assume a != null && a.length == 3;\n" +" a[0] = new Object();\n" +" a[1] = new Object();\n" +" //@ assert \\nonnullelements(a);\n" // BAD +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m5(Object[] a) {\n" +" //@ assume \\nonnullelements(a) && a.length == 3;\n" +" a[0] = new Object();\n" +" //@ assert \\nonnullelements(a);\n" // OK +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m5a(Object[] a) {\n" +" //@ assume a != null && a.length == 3;\n" // Line 75 +" a[0] = null;\n" +" //@ assert \\nonnullelements(a);\n" // BAD +" }\n" +" //@ requires \\elemtype(\\typeof(a)) == \\type(Object); modifies \\everything;\n" +" public void m5b(Object[] a) {\n" +" //@ assume a != null && a.length == 3;\n" +" //@ assume \\nonnullelements(a);\n" +" a[0] = null;\n" +" //@ assert \\nonnullelements(a);\n" // BAD +" }\n" +" //@ modifies \\everything;\n" +" public void m5c(Object[] a) {\n" +" //@ assume a != null && a.length == 0;\n" +" //@ assert \\nonnullelements(a);\n" +" }\n" +"}" ,"/tt/TestJava.java:17: warning: The prover cannot establish an assertion (Assert) in method m11a",9 ,"/tt/TestJava.java:22: warning: The prover cannot establish an assertion (Assert) in method m1a",9 ,"/tt/TestJava.java:65: warning: The prover cannot establish an assertion (Assert) in method m4a",9 ,"/tt/TestJava.java:77: warning: The prover cannot establish an assertion (Assert) in method m5a",9 ,"/tt/TestJava.java:84: warning: The prover cannot establish an assertion (Assert) in method m5b",9 ); } @Test public void testNotModified() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ requires i == 5;\n" +" //@ modifies \\everything;\n" +" public void m1(int i) {\n" +" i = 5;\n" +" //@ assert \\not_modified(i);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m1a(int i) {\n" +" i = 5;\n" +" //@ assert \\not_modified(i);\n" // BAD +" }\n" +" public int i;\n" +" public static int si;\n" +" //@ ghost public int gi;\n" +" //@ requires i == 5;\n" +" //@ modifies \\everything;\n" +" public void m2() {\n" +" i = 5;\n" +" //@ assert \\not_modified(i);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m2a() {\n" +" i = 5;\n" +" //@ assert \\not_modified(i);\n" // BAD +" }\n" +" //@ requires si == 5;\n" +" //@ modifies \\everything;\n" +" public void m3() {\n" +" si = 5;\n" +" //@ assert \\not_modified(si);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m3a() {\n" +" si = 5;\n" +" //@ assert \\not_modified(si);\n" // BAD +" }\n" +" //@ requires gi == 5;\n" +" //@ modifies \\everything;\n" +" public void m4() {\n" +" //@ set gi = 5;\n" +" //@ assert \\not_modified(gi);\n" // OK +" }\n" +" //@ modifies \\everything;\n" +" public void m4a() {\n" +" //@ set gi = 5;\n" +" //@ assert \\not_modified(gi);\n" // BAD +" }\n" +"}" ,"/tt/TestJava.java:12: warning: The prover cannot establish an assertion (Assert) in method m1a",9 ,"/tt/TestJava.java:26: warning: The prover cannot establish an assertion (Assert) in method m2a",9 ,"/tt/TestJava.java:37: warning: The prover cannot establish an assertion (Assert) in method m3a",9 ,"/tt/TestJava.java:48: warning: The prover cannot establish an assertion (Assert) in method m4a",9 ); } // Test well-definedness within the implicit old @Test public void testNotModified2() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public int i;\n" +" public static /*@ nullable */ TestJava t;\n" +" //@ requires t != null;\n" +" //@ modifies \\everything;\n" +" public void m0() {\n" +" //@ assert \\not_modified(t.i);\n" // OK +" }\n" +" //@ requires t != null;\n" +" //@ modifies \\everything;\n" +" public void m1a() {\n" +" t = null;\n" +" //@ assert \\not_modified(t.i) ? true: true;\n" // BAD +" }\n" +" //@ requires t == null;\n" +" //@ modifies \\everything;\n" +" public void m1b() {\n" +" t = new TestJava();\n" +" //@ assert \\not_modified(t.i) ? true: true;\n" // BAD +" }\n" +" //@ modifies \\everything;\n" +" public void m1c() {\n" +" //@ assert \\not_modified(t.i) ? true: true;\n" // BAD +" }\n" +"}" ,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (UndefinedNullDeReference) in method m1a",31 ,"/tt/TestJava.java:20: warning: The prover cannot establish an assertion (UndefinedNullDeReference) in method m1b",31 ,"/tt/TestJava.java:24: warning: The prover cannot establish an assertion (UndefinedNullDeReference) in method m1c",31 ); } @Test public void testCast() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public static long l;\n" +" public static int i;\n" +" public static short s;\n" +" public static char c;\n" +" public static byte b;\n" +" //@ requires i == 6;\n" +" //@ modifies \\everything;\n" +" public void m0() {\n" +" s = (short)i;\n" +" //@ assert s == i;\n" // OK +" b = (byte)i;\n" +" //@ assert b == i;\n" // OK +" c = (char)i;\n" +" //@ assert c == i;\n" // OK +" l = (long)i;\n" +" //@ assert l == i;\n" // OK +" int ii = (int)i;\n" +" //@ assert ii == i;\n" // OK +" //@ assert i == (short)i;\n" +" //@ assert i == (long)i;\n" +" //@ assert i == (char)i;\n" +" //@ assert i == (byte)i;\n" +" //@ assert i == (int)i;\n" +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m0bad() {\n" +" s = (short)i;\n" // Line 30 +" //@ assert s == i;\n" +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m0badx() {\n" +" //@ assert i == (short)i;\n" // BAD +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m1badx() {\n" +" //@ assert i == (byte)i;\n" +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m2badx() {\n" +" //@ assert i == (char)i;\n" +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m1bad() {\n" +" b = (byte)i;\n" +" //@ assert b == i;\n" +" }\n" +" //@ requires i == 100000;\n" +" //@ modifies \\everything;\n" +" public static void m2bad() {\n" +" c = (char)i;\n" +" //@ assert c == i;\n" +" }\n" +"}" ,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m0bad",9 ,"/tt/TestJava.java:36: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m0badx",21 ,"/tt/TestJava.java:41: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m1badx",21 ,"/tt/TestJava.java:46: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m2badx",21 ,"/tt/TestJava.java:51: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m1bad",9 ,"/tt/TestJava.java:57: warning: The prover cannot establish an assertion (ArithmeticCastRange) in method m2bad",9 ); } @Test public void testCast1() { main.addOptions("-escMaxWarnings=1"); // FIXME - issues very many warnings - lots of nearly identical paths? helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ modifies \\everything;\n" +" public void m0() {\n" +" {/*@ nullable */ Short s = null;\n" +" short ss = (short)s;\n" +" //@ assert 0 == (short)s;\n}" +" }\n" +" //@ modifies \\everything;\n" +" public void m1() {\n" +" {/*@ nullable */ Integer s = null;\n" +" int ss = (int)s;\n" +" //@ assert 0 == (int)s;\n}" +" }\n" +" //@ modifies \\everything;\n" +" public void m2() {\n" +" {/*@ nullable */ Long s = null;\n" +" long ss = (long)s;\n" +" //@ assert 0L == (long)s;\n}" +" }\n" +" //@ modifies \\everything;\n" +" public void m3() {\n" +" {/*@ nullable */ Byte s = null;\n" +" byte ss = (byte)s;\n" +" //@ assert 0 == (byte)s;\n}" +" }\n" +" //@ modifies \\everything;\n" +" public void m4() {\n" +" {/*@ nullable */ Character s = null;\n" +" char ss = (char)s;\n" +" //@ assert 0 == (char)s;\n}" +" }\n" +" //@ modifies \\everything;\n" +" public void m7() {\n" +" {/*@ nullable */ Boolean s = null;\n" +" boolean ss = (boolean)s;\n" +" //@ assert (boolean)s;\n}" +" }\n" +"}" ,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m0",16 ,"/tt/TestJava.java:12: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m1",14 ,"/tt/TestJava.java:18: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m2",15 ,"/tt/TestJava.java:24: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m3",15 ,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m4",15 ,"/tt/TestJava.java:36: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m7",18 ); } @Test public void testCast1real() { Assume.assumeTrue(runLongTests || !"z3_4_3".equals(solver)); main.addOptions("-logic=AUFLIRA","-escMaxWarnings=1"); // FIXME - issues very many warnings - lots of nearly identical paths? helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ modifies \\everything;\n" +" public void m5() {\n" +" {/*@ nullable */ Double s = null;\n" +" double ss = (double)s;\n" +" //@ assert 0 == (double)s;\n}" +" }\n" +"}" ,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m5",17 ); } @Test public void testCast1realb() { Assume.assumeTrue(runLongTests || !"z3_4_3".equals(solver)); main.addOptions("-logic=AUFLIRA","-escMaxWarnings=1"); // FIXME - issues very many warnings - lots of nearly identical paths? helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ modifies \\everything;\n" +" public void m6() {\n" +" {/*@ nullable */ Float s = null;\n" +" float ss = (float)s;\n" +" //@ assert 0.0 == (float)s;\n}" +" }\n" +"}" ,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (PossiblyNullUnbox) in method m6",16 ); } // TODO - test not_modified and old nested in each other; remember to test definedness @Test public void testAssignableConstructor0() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ assignable \\everything;\n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor1() { expectedExit = 1; helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ assignable i;\n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ,"/tt/TestJava.java:4: An identifier with private visibility may not be used in a assignable clause with public visibility",18 ); } @Test public void testAssignableConstructor2() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ assignable \\nothing;\n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" // ,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (Assignable) in method TestJava: i",25 // ,"/tt/TestJava.java:4: warning: Associated declaration",7 ); } @Test public void testAssignableConstructor3() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" // ,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (Assignable) in method TestJava: i",25 // ,"/tt/TestJava.java:5: warning: Associated declaration",10 ); } @Test public void testAssignableConstructor3a() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ requires true; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" // ,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (Assignable) in method TestJava: i",25 // ,"/tt/TestJava.java:4: warning: Associated declaration",7 ); } @Test public void testAssignableConstructor3ae() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ requires true; assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" // ,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (Assignable) in method TestJava: i",25 // ,"/tt/TestJava.java:4: warning: Associated declaration",22 ); } @Test public void testAssignableConstructor3e() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" private int i;\n" +" //@ assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" // ,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (Assignable) in method TestJava: i",25 // ,"/tt/TestJava.java:4: warning: Associated declaration",7 ); } @Test public void testAssignableConstructor4() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor4e() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" //@ assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor4a() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" //@ requires true;\n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor4ae() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" //@ requires true; assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor5() { //main.addOptions("-jmldebug"); helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" //@ assignable state; \n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor5s() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { //@ public nullable model Object state;\n" +" private int i; //@ in state;\n" +" //@ assignable this.state; \n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor6() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava {\n" +" /*@ spec_public */ private int i;\n" +" \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor6a() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava {\n" +" /*@ spec_public */ private int i;\n" +" //@ requires true; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor6e() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava {\n" +" /*@ spec_public */ private int i;\n" +" //@ assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor6ae() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava {\n" +" /*@ spec_public */ private int i;\n" +" //@ requires true; assignable this.*; \n" // default assignable +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor7() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" /*@ spec_public */ private int i; \n" +" //@ assignable i; \n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testAssignableConstructor7s() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" /*@ spec_public */ private int i; \n" +" //@ assignable this.i; \n" +" public TestJava() { i = 0; }\n" +" //@ assignable \\everything;\n" +" public static void m() { new TestJava(); }\n" +"}" ); } @Test public void testVarargs() { helpTCX("tt.TestJava","package tt; \n" +"/*@ nullable_by_default */ public class TestJava { \n" +" //@ ensures \\result == ints.length;\n" +" //@ pure \n" +" public static int m(Integer ... ints) { \n" +" //@ assert ints != null; \n" +" return ints.length; }\n" +" public static void n(/*@ non_null*/Integer[] args) { \n" +" int i = m(args); \n" +" //@ assert i == args.length; \n" +" }\n" +" public static void n0() { \n" +" int i = m(); \n" +" //@ assert i == 0; \n" +" }\n" +" public static void n1() { \n" +" int i = m(1); \n" +" //@ assert i == 1; \n" +" }\n" +" public static void n2() { \n" +" int i = m(1,1); \n" +" //@ assert i == 2; \n" +" }\n" +"}" ); } @Test public void testVarargs2() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ ensures \\result == (ints.length > 0 ? ints[0] : ints.length);\n" +" //@ pure \n" +" public static int m(int ... ints) { \n" +" //@ assert ints != null; \n" +" if (ints.length > 0) return ints[0]; else return ints.length; }\n" +" public static void n0() { \n" +" int i = m(); \n" +" //@ assert i == 0; \n" +" }\n" +" public static void n1() { \n" +" int i = m(2); \n" +" //@ assert i == 2; \n" +" }\n" +" public static void n2() { \n" +" int i = m(5,6); \n" +" //@ assert i == 5; \n" +" }\n" +"}" ); } @Test public void testVarargs3() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ requires ints.length == 0 || ints[0] != null;\n" +" //@ ensures \\result == (ints.length > 0 ? ints[0] : ints.length);\n" +" //@ pure \n" +" public static int m(Integer ... ints) { \n" +" //@ assert ints != null; \n" +" if (ints.length > 0) return ints[0]; else return ints.length; }\n" +" public static void n0() { \n" +" int i = m(); \n" +" //@ assert i == 0; \n" +" }\n" +" public static void n1() { \n" +" int i = m(2); \n" +" //@ assert i == 2; \n" +" }\n" +" public static void n2() { \n" +" int i = m(5,6); \n" +" //@ assert i == 5; \n" +" }\n" +"}" ); } @Test public void testBits() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public void m() {\n" +" boolean b = true;\n" +" boolean bb = false;\n" +" //@ assert !(b & bb);\n" +" //@ assert (b | bb);\n" +" //@ assert (b ^ bb);\n" +" //@ assert (b & bb);\n" // FALSE +" }\n" +"}" ,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (Assert) in method m",10 ); } @Test public void testLabels() { main.addOptions("-show","-method=m"); helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " //@ requires i == 10;\n" + " public void m(int i) {\n" + " a:{};\n" + " i = 12;\n" + " b:{};\n" + " i = 14;\n" + " //@ assert \\old(i) == 10;\n" + " //@ assert \\old(i,a) == 10;\n" + " //@ assert \\old(i,b) == 12;\n" + " //@ assert i == 14;\n" + " }\n" + "}" ); } @Test public void testLabels2() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " public int k;\n" + " /*@ ensures \\result == k; */ public int mm() { return k; }\n" + " //@ requires k == 10;\n" + " public void m() {\n" + " a:{}\n" + " k = 12;\n" + " b:{}\n" + " k = 14;\n" + " //@ assert \\old(mm()) == 10;\n" + " //@ assert \\old(mm(),a) == 10;\n" + " //@ assert \\old(mm(),b) == 12;\n" + " //@ assert mm() == 14;\n" + " }\n" + "}" ); } @Test public void testOldClause() { main.addOptions("-escMaxWarnings=1","-subexpressions","-show","-method=m"); helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " static public int k = 5;\n" + " //@ old int kk = k; requires k == 5 && i > kk && i < 100 && i > -100; assignable k; ensures k == i+1; ensures kk == 5;\n" + " //@ also\n" + " //@ old int kk = k+1; requires k == 5 && i < kk && i < 100 && i > -100; assignable k; ensures k == i-1; ensures kk == 6;\n" + " static public void m(int i) {\n" + " if (i>k) k = i+1; else k = i-1;\n" + " }\n" + "}" ); } @Ignore // FIXME - fix up label scoping @Test public void testBadLabel() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " public int k;\n" + " public void m() {\n" + " //@ assert \\old(k,a) == 10;\n" + " a:{}\n" + " k = 12;\n" + " while(k > 10) { a:{} k--; }\n" + " while(k > 6) { b:{ b:{} } k--; }\n" + " while(k > 5) { b:{} b:{} k--; }\n" + " while(k > 0) { c:{} k--;}\n" + " k = 14;\n" + " //@ assert \\old(k,c) == 12;\n" + " }\n" + "}" ); } @Test public void testIfNoBrace() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " //@ requires i > -10 && i < 10;\n" + " public void m(int i) {\n" + " if (i < 0) \n" + " //@ assert i < 0;\n" // OK + " i = -i; \n" + " //@ assert i >= 0;\n" // OK + " }\n" + "}" ); } @Test @Ignore public void testIfNoBrace2() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " //@ requires i > -10 && i < 10;\n" + " public void m(int i) {\n" + " if (i < 0) \n" + " i = -i; \n" + " //@ assert i < 0;\n" // false, since not in if + " //@ assert i >= 0;\n" + " }\n" + "}" ,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (Assert) in method m", 13 ); } @Test public void testIfNoBrace3() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava { \n" + " //@ requires i > -10 && i < 10;\n" + " public void m(int i) {\n" + " if (i < 0) \n" + " i = -i; \n" + " //@ assert i > 0;\n" // false, since not in if + " //@ assert i >= 0;\n" + " }\n" + "}" ,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (Assert) in method m", 13 ); } @Test public void testOldClause2() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava {\n" + " static public int k = 5;\n" + " //@ old int kk = k;\n" + " //@ {| requires i < 10 && i > kk; assignable k; ensures k == i+1; \n" + " //@ also\n" + " //@ requires i > -10 && i < kk; assignable k; ensures k == i-1; \n" + " //@ |}\n" + " static public void m(int i) {\n" + " if (i>k) k = i+1; else k = i-1;\n" + " }\n" + "}" ); } // Problem from Michael Coblenz - git issue #504 @Test public void testSimpleClone() { helpTCX("tt.TestJava", "package tt; \n" + "public class TestJava {\n" + " public String y = \"\";\n" + " \n" + " public int[] foo() {\n" + " int[] result1 = new int[]{1};\n" + " int[] result2 = result1.clone();\n" + " return result2;\n" + " }\n" + "}" ); } }