package org.jmlspecs.openjmltest.testcases;
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;
@RunWith(ParameterizedWithNames.class)
public class escall2 extends EscBase {
public escall2(String options, String solver) {
super(options,solver);
}
@Override
public void setUp() throws Exception {
//noCollectDiagnostics = true;
super.setUp();
main.addOptions("-nullableByDefault"); // Tests were written this way
}
@Test
public void testNNParam() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n"
+" public void n3(Object s) {} \n"
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:26: warning: The prover cannot establish an assertion (Precondition) in method m8",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
);
}
@Test
public void testNN2Param() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NullableByDefault public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n"
+" public void n3(Object s) {} \n"
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:26: warning: The prover cannot establish an assertion (Precondition) in method m8",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
);
}
@Test
public void testNN3Param() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NonNullByDefault public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n" // Line 32
+" public void n3(Object s) {} \n" // Line 33
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:11: warning: The prover cannot establish an assertion (Precondition) in method m3",8
,"/tt/TestJava.java:33: warning: Associated declaration",24
);
}
@Test
public void testNN4Param() {
main.addOptions("-nonnullByDefault");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n"
+" public void n3(Object s) {} \n"
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:11: warning: The prover cannot establish an assertion (Precondition) in method m3",8
,"/tt/TestJava.java:33: warning: Associated declaration",24
);
}
@Test
public void testNN5Param() {
main.addOptions("-nonnullByDefault");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NullableByDefault public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n"
+" public void n3(Object s) {} \n"
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:26: warning: The prover cannot establish an assertion (Precondition) in method m8",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
);
}
@Test
public void testNN6Param() {
main.addOptions("-nonnullByDefault");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NonNullByDefault public class TestJava { \n"
+" public void m1(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(o); \n"
+" } \n"
+" public void m2(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(o); // ERROR \n"
+" } \n"
+" public void m3(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(o); // ERROR if default is NonNull \n"
+" } \n"
+" public void m4(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(oo); \n"
+" } \n"
+" public void m5(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(oo); \n"
+" } \n"
+" public void m6(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(oo); \n"
+" } \n"
+" public void m7(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n1(ooo); \n"
+" } \n"
+" public void m8(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n2(ooo); // ERROR if default is Nullable \n"
+" } \n"
+" public void m9(@Nullable Object o, @NonNull Object oo, Object ooo) { \n"
+" n3(ooo); \n"
+" } \n"
+" public void n1(@Nullable Object s) {} \n"
+" public void n2(@NonNull Object s) {} \n" // Line 32
+" public void n3(Object s) {} \n" // Line 33
+" public TestJava() {}\n"
+" } \n"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Precondition) in method m2",8
,"/tt/TestJava.java:32: warning: Associated declaration",17
,"/tt/TestJava.java:11: warning: The prover cannot establish an assertion (Precondition) in method m3",8
,"/tt/TestJava.java:33: warning: Associated declaration",24
);
}
@Test
public void testNNAssign() {
// Assume.assumeTrue(runLongTests);
// Use noInternalSpecs to help yices, which cannot handle the quantified statements in String specs
main.addOptions("-no-internalSpecs");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" String s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" @NonNull String s = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" @Nullable String s = null;\n"
+" }\n"
+" public void m2() {\n"
+" String s;\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" @NonNull String s;\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" @Nullable String s;\n"
+" s = null;\n"
+" }\n"
+" public String f; @NonNull public String ff; @Nullable public String fff; \n"
+" public void m3() {\n"
+" f = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m3a() {\n"
+" ff = null;\n" // ERROR
+" }\n"
+" public void m3b() {\n"
+" fff = null;\n"
+" }\n"
+" public void m4(String s) {\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m4a(@NonNull String s) {\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m4b(@Nullable String s) {\n"
+" s = null;\n"
+" }\n"
+" public TestJava() { f = ff = \"\"; }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (PossiblyNullInitialization) in method m1a: s",21
,"/tt/TestJava.java:19: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",7
,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m3a",8
,"/tt/TestJava.java:39: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m4a",7
);
}
@Test
public void testNNAssign2() {
// Assume.assumeTrue(runLongTests);
main.addOptions("-no-internalSpecs");
//main.addOptions("-show","-method=<init>");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NonNullByDefault public class TestJava { \n"
+" public void m1() {\n"
+" String s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" @NonNull String s = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" @Nullable String s = null;\n"
+" }\n"
+" public void m2() {\n"
+" String s;\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" @NonNull String s;\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" @Nullable String s;\n"
+" s = null;\n"
+" }\n"
+" public String f; @NonNull public String ff; @Nullable public String fff; \n"
+" public void m3() {\n"
+" f = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m3a() {\n"
+" ff = null;\n" // ERROR
+" }\n"
+" public void m3b() {\n"
+" fff = null;\n"
+" }\n"
+" public void m4(String s) {\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m4a(@NonNull String s) {\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m4b(@Nullable String s) {\n"
+" s = null;\n"
+" }\n"
+" public TestJava() { f = ff = new String(); }\n"
+"}"
,"/tt/TestJava.java:5: warning: The prover cannot establish an assertion (PossiblyNullInitialization) in method m1: s",12
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (PossiblyNullInitialization) in method m1a: s",21
,"/tt/TestJava.java:15: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2",7
,"/tt/TestJava.java:19: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",7
,"/tt/TestJava.java:27: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m3",7
,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m3a",8
,"/tt/TestJava.java:36: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m4",7
,"/tt/TestJava.java:39: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m4a",7
);
}
@Test
public void testNNAssign3() {
// Assume.assumeTrue(runLongTests);
main.addOptions("internalSpecs=false"); // Part of test
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NullableByDefault public class TestJava { \n"
+" public void m1() {\n"
+" String s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" @NonNull String s = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" @Nullable String s = null;\n"
+" }\n"
+" public void m2() {\n"
+" String s;\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" @NonNull String s;\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" @Nullable String s;\n"
+" s = null;\n"
+" }\n"
+" public String f; @NonNull public String ff; @Nullable public String fff; \n"
+" public void m3() {\n"
+" f = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m3a() {\n"
+" ff = null;\n" // ERROR
+" }\n"
+" public void m3b() {\n"
+" fff = null;\n"
+" }\n"
+" public void m4(String s) {\n"
+" s = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m4a(@NonNull String s) {\n"
+" s = null;\n" // ERROR
+" }\n"
+" public void m4b(@Nullable String s) {\n"
+" s = null;\n"
+" }\n"
+" public TestJava() { f = ff = new String(); }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (PossiblyNullInitialization) in method m1a: s",21
,"/tt/TestJava.java:19: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",7
,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m3a",8
,"/tt/TestJava.java:39: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m4a",7
);
}
@Test
public void testNNAssignB() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public static class A { /*@ assignable this.*, A.*; */ public A() { q = qq = new String(); r = rr = new String(); }\n"
+" public String q; @NonNull public String qq; @Nullable public String qqq; \n"
+" static public String r; static @NonNull public String rr; static @Nullable public String rrr; \n"
+" }\n"
+" public void m1() {\n"
+" A a = new A();\n"
+" a.q = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" A a = new A();\n"
+" a.qq = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" A a = new A();\n"
+" a.qqq = null;\n"
+" }\n"
+" public void m2() {\n"
+" A.r = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" A.rr = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" A.rrr = null;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m1a",10
,"/tt/TestJava.java:24: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",10
);
}
@Test
public void testNNAssignB1() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NonNullByDefault public class TestJava { \n"
+" public static class A {" // Tests whether this gets the enclosing class's annotation; global option is nullable
+" /*@ assignable this.*, A.*; */ public A() { q = qq = new String(); r = rr = new String(); }\n"
+" public String q; @NonNull public String qq; @Nullable public String qqq; \n"
+" static public String r; static @NonNull public String rr; static @Nullable public String rrr; \n"
+" }\n"
+" public void m1() {\n"
+" A a = new A();\n"
+" a.q = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" A a = new A();\n"
+" a.qq = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" A a = new A();\n"
+" a.qqq = null;\n"
+" }\n"
+" public void m2() {\n"
+" A.r = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" A.rr = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" A.rrr = null;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:10: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m1",9
,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m1a",10
,"/tt/TestJava.java:21: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2",9
,"/tt/TestJava.java:24: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",10
);
}
@Test
public void testNNAssignB2() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NullableByDefault public class TestJava { \n"
+" public static class A { /*@ assignable this.*, A.*; */ public A() { q = qq = new String(); r = rr = new String(); }\n"
+" public String q; @NonNull public String qq; @Nullable public String qqq; \n"
+" static public String r; static @NonNull public String rr; static @Nullable public String rrr; \n"
+" }\n"
+" public void m1() {\n"
+" A a = new A();\n"
+" a.q = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m1a() {\n"
+" A a = new A();\n"
+" a.qq = null;\n" // ERROR
+" }\n"
+" public void m1b() {\n"
+" A a = new A();\n"
+" a.qqq = null;\n"
+" }\n"
+" public void m2() {\n"
+" A.r = null;\n" // ERROR if default is nonnull
+" }\n"
+" public void m2a() {\n"
+" A.rr = null;\n" // ERROR
+" }\n"
+" public void m2b() {\n"
+" A.rrr = null;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m1a",10
,"/tt/TestJava.java:24: warning: The prover cannot establish an assertion (PossiblyNullAssignment) in method m2a",10
);
}
@Test @Ignore // FIXME - need a test to check type testing as part of condition
public void testTypeCast() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m(String s) {\n"
+" }\n"
+"}"
);
}
@Test
public void testInvariantForOK() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = 10; \n"
+" //@ assert \\invariant_for(this);\n" // OK - invariant is true
+" f = 1; \n"
+" }\n"
+"} class P { public int f; //@ public invariant f >= 0; \n"
+"}\n"
);
}
@Test
public void testInvariantForVisibility() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = 10; \n"
+" //@ assert \\invariant_for(this);\n" // OK - does not see invariant
+" f = 1; \n"
+" }\n"
+"} class P { public int f; //@ private invariant false; \n"
+"}\n"
);
}
@Test
public void testInvariantForVisibility2() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = 10; \n"
+" //@ assert \\invariant_for(this);\n" // OK - sees invariant
+" f = 1; \n"
+" }\n"
+"} class P { public int f; //@ public invariant true; \n"
+"}\n"
);
}
@Test
public void testInvariantFor() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = -10; \n"
+" //@ assert \\invariant_for(this);\n" // ERROR - should see inherited invariant and fail
+" f = 1; \n"
+" }\n"
+"} class P { public int f; //@ public invariant f >= 0; \n"
+"}\n"
,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (Assert) in method m", 10
);
}
@Test
public void testInvariantForSeeStatic() {
Assume.assumeTrue(!solver.startsWith("cvc4"));
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = -10; \n"
+" //@ assert \\invariant_for(this);\n" // ERROR - should see static invariant
+" f = 1; \n"
+" }\n"
+"} class P { static public int f; //@ static public invariant f >= 0; \n"
+"}\n"
,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (Assert) in method m", 10
);
}
@Test
public void testInvariantForStatic() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" public void m() {\n"
+" f = -10; \n"
+" //@ assert \\invariant_for(TestJava);\n" // OK - sees only static invariants
+" f = 1; \n"
+" }\n"
+"} class P { public int f; //@ public invariant f >= 0; \n"
+"}\n"
);
}
@Test
public void testInvariantForStatic1() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" static public int f; //@ static public invariant f >= 0; \n"
+" public void m() {\n"
+" f = -10; \n"
+" //@ assert \\invariant_for(TestJava);\n" // ERROR - should see static invariant
+" f = 1; \n"
+" }\n"
+"} class P { }\n "
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (Assert) in method m",10
);
}
@Test
public void testInvariantForStatic2() {
main.addOptions("-method=m"); // Part of test - don't test constructor
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava extends P { \n"
+" static public int f; //@ static public invariant f >= 0; \n"
+" public void m() {\n"
+" f = -10; \n"
+" //@ assert \\invariant_for(P);\n" // OK
+" f = 1; \n"
+" }\n"
+"} class P { }\n "
);
}
@Test
public void testDZero() {
Assume.assumeTrue(runLongTests || !"z3_4_3".equals(solver));
// Assume.assumeTrue(false); // SKIPPING because CVC4 does not handle integer division
main.addOptions("-logic=AUFNIRA");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m() {\n"
+" int q = 5;\n"
+" int r = q/1;\n"
+" }\n"
+" public void ma() {\n"
+" int q = 5;\n"
+" int r = q%1;\n"
+" }\n"
+" public void m1() {\n"
+" int z = 0; int q = 5;\n"
+" int r = q/z;\n" // ERROR
+" }\n"
+" public void m1a() {\n"
+" int z = 0; int q = 5;\n"
+" int r = q%z;\n" // ERROR
+" }\n"
+" public void m2() {\n"
+" int z = 0; int q = 5;\n"
+" int r; r = q/z;\n" // ERROR
+" }\n"
+" public void m2a() {\n"
+" int z = 0; int q = 5;\n"
+" int r; r = q%z;\n" // ERROR
+" }\n"
+" public void m3() {\n"
+" int z = 0; int q = 5;\n"
+" q /= z;\n" // ERROR
+" }\n"
+" public void m3a() {\n"
+" int z = 0; int q = 5;\n"
+" q %= z;\n" // ERROR
+" }\n"
+"}"
,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m1",14
,"/tt/TestJava.java:18: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m1a",14
,"/tt/TestJava.java:22: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m2",17
,"/tt/TestJava.java:26: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m2a",17
,"/tt/TestJava.java:30: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m3",7
,"/tt/TestJava.java:34: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m3a",7
);
}
@Test // THIS ONE BLOWS THE PROVER ??? FIXME (literal divide by zero)
public void testDZero2() {
Assume.assumeTrue(runLongTests);
Assume.assumeTrue(false);
main.addOptions("-logic=AUFNIRA");
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" int q = 5;\n"
+" int r = q/(1-1);\n" // ERROR
+" }\n"
+" public void m2() {\n"
+" int q = 5;\n"
+" int r = q/0;\n" // ERROR
+" }\n"
+"}"
,"/tt/TestJava.java:6: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m1",14
,"/tt/TestJava.java:10: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m2",14
);
}
@Test
public void testInvariant1() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" static public int ii;\n"
+" public int i;\n"
+" //@ public invariant i >= 0;\n"
+" //@ static public invariant ii >= 0;\n"
+" //@ assignable \\everything; \n"
+" public void m1bad() {\n"
+" i = -i;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m2bad() {\n"
+" ii = -ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" static public void m3bad() {\n"
+" ii = -ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m1good() {\n"
+" ++i;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m2good() {\n"
+" ++ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" static public void m3good() {\n"
+" ++ii;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (InvariantExit) in method m1bad",15
,"/tt/TestJava.java:6: warning: Associated declaration",14
,"/tt/TestJava.java:13: warning: The prover cannot establish an assertion (InvariantExit) in method m2bad",15
,"/tt/TestJava.java:7: warning: Associated declaration",21
,"/tt/TestJava.java:17: warning: The prover cannot establish an assertion (InvariantExit) in method m3bad",22
,"/tt/TestJava.java:7: warning: Associated declaration",21
);
}
@Test
public void testConstraint1() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava {\n"
+" static public int ii;\n"
+" public int i;\n"
+" //@ public constraint i >= \\old(i);\n"
+" //@ static public constraint ii >= \\old(ii);\n"
+" //@ assignable \\everything; \n"
+" public void m1bad() { //@ assume i > -2147483648;\n"
+" i = -i;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m2bad() { //@ assume ii > -2147483648;\n"
+" ii = -ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" static public void m3bad() { //@ assume ii > -2147483648;\n"
+" ii = -ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m1good() {\n"
+" ++i;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" public void m2good() {\n"
+" ++ii;\n"
+" }\n"
+" //@ assignable \\everything; \n"
+" static public void m3good() {\n"
+" ++ii;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (Constraint) in method m1bad",15
,"/tt/TestJava.java:6: warning: Associated declaration",14
,"/tt/TestJava.java:13: warning: The prover cannot establish an assertion (Constraint) in method m2bad",15
,"/tt/TestJava.java:7: warning: Associated declaration",21
,"/tt/TestJava.java:17: warning: The prover cannot establish an assertion (Constraint) in method m3bad",22
,"/tt/TestJava.java:7: warning: Associated declaration",21
);
}
@Test
public void testAxiom1() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
// FIXME - use this // +" //@ axiom (\\forall TestJava o; o.i == o.ii);\n"
+" //@ axiom i == ii;\n"
+" static int ii;\n"
+" int i;\n"
+" //@ assignable \\everything; \n"
+" public void m1good() {\n"
+" //@ assert i == ii;\n"
+" }\n"
+"}"
);
}
@Test
public void testAxiom2() {
if ("yices2".equals(solver)) return; // TODO: yices2 does not handle quantifiers
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"public class TestJava { \n"
+" //@ axiom (\\forall TestJava o; o.i == o.ii);\n"
+" static int ii;\n"
+" int i;\n"
+" //@ assignable \\nothing; \n"
+" public void m1good() {\n"
+" //@ assert i == ii;\n"
+" }\n"
+"}"
);
}
@Test
public void testAssignable() {
// Assume.assumeTrue(runLongTests);
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+"@NonNullByDefault public class TestJava { \n"
+" public TestJava t;\n"
+" public int a;\n"
+" public static int b;\n"
+" //@ assignable this.a;\n"
+" public void m1(TestJava o) {\n"
+" o.a = 0;\n" // BAD
+" }\n" // Line 10
+" //@ assignable \\nothing;\n"
+" public void m2(TestJava o) {\n"
+" o.a = 0;\n" // BAD
+" }\n"
+" //@ assignable \\everything;\n"
+" public void m3(TestJava o) {\n"
+" o.a = 0;\n" // OK
+" }\n"
+" //@ assignable this.a;\n"
+" public void m4(TestJava o) {\n"
+" this.a = 0;\n" // OK
+" }\n"
+" //@ assignable TestJava.b;\n"
+" public void m4x(TestJava o) {\n"
+" this.b = 0;\n" // OK
+" }\n"
+" //@ assignable this.b;\n"
+" public void m4y(TestJava o) {\n"
+" TestJava.b = 0;\n" // OK
+" }\n" // Line 30
+" //@ assignable this.a;\n"
+" public void m4a(TestJava o) {\n"
+" o.a = 0;\n" // BAD
+" }\n"
+" //@ assignable this.a;\n"
+" public void m4b(TestJava o) {\n"
+" //@ assume this == o; \n"
+" o.a = 0;\n" // OK
+" }\n"
+" //@ assignable this.a;\n" // Line 40
+" public void m5(TestJava o) {\n"
+" a = 0;\n" // OK
+" }\n"
+" //@ assignable a;\n"
+" public void m6(TestJava o) {\n"
+" a = 0;\n" // OK
+" }\n"
+" //@ assignable \\nothing;\n"
+" public void m7(TestJava o) {\n"
+" a = 0;\n" // BAD // Line 50
+" }\n"
+" //@ assignable \\nothing;\n"
+" public void m8(TestJava o) {\n"
+" int a; a = 0;\n" // OK
+" }\n"
+" //@ assignable o.*;\n"
+" public void m9(TestJava o) {\n"
+" //@ assume this == o; \n"
+" o.a = 0;\n" // OK
+" }\n"
+" //@ assignable this.*;\n"
+" public void m9b(TestJava o) {\n"
+" o.a = 0;\n" // BAD
+" }\n"
+" public TestJava() { t = new TestJava(); }\n"
+"}"
,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (Assignable) in method m1: o.a",9
,"/tt/TestJava.java:7: warning: Associated declaration",7
,"/tt/TestJava.java:13: warning: The prover cannot establish an assertion (Assignable) in method m2: o.a",9
,"/tt/TestJava.java:11: warning: Associated declaration",7
,"/tt/TestJava.java:33: warning: The prover cannot establish an assertion (Assignable) in method m4a: o.a",9
,"/tt/TestJava.java:31: warning: Associated declaration",7
,"/tt/TestJava.java:50: warning: The prover cannot establish an assertion (Assignable) in method m7: a",7
,"/tt/TestJava.java:48: warning: Associated declaration",7
,"/tt/TestJava.java:63: warning: The prover cannot establish an assertion (Assignable) in method m9b: o.a",9
,"/tt/TestJava.java:61: warning: Associated declaration",7
);
}
@Test
public void testPureMethod() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+" public class TestJava { \n"
+" public TestJava t;\n"
+" public int a;\n"
+" public static int b;\n"
+" //@ public normal_behavior requires b; ensures \\result == 5; \n"
+" //@ also public normal_behavior requires !b; ensures \\result == 7; \n"
+" @Pure public int m(boolean b) {\n"
+" return b ? 5 : 7;\n"
+" }\n"
+" public void m1() {\n"
+" //@ assert m(true) == 5; \n"
+" }\n"
+" public void m2() {\n"
+" //@ assert m(false) == 7; \n"
+" }\n"
+" public void m1a(boolean bb) {\n"
+" //@ assert m(bb) == 6; \n"
+" }\n"
+"}"
,"/tt/TestJava.java:19: warning: The prover cannot establish an assertion (Assert) in method m1a",9
);
}
@Test
public void testPureMethod2() {
helpTCX("tt.TestJava","package tt; \n"
+" import org.jmlspecs.annotation.*; \n"
+" public class TestJava { \n"
+" public TestJava t;\n"
+" public int a;\n"
+" public static int b;\n"
+" //@ public normal_behavior requires b; ensures \\result == 5; \n"
+" @Pure public int m(boolean b) {\n"
+" return b ? 5 : 7;\n"
+" }\n"
+" public void m1() {\n"
+" //@ assert m(true) == 5; \n"
+" }\n"
+" public void m2() {\n"
+" //@ assert m(false) == 5; \n"
+" }\n"
+" public void m1a(boolean bb) {\n"
+" //@ assert m(bb) == 5; \n"
+" }\n"
+" public void m1b() {\n"
+" //@ assert m(true) == 7; \n"
+" }\n"
+"}"
,"/tt/TestJava.java:15: warning: The prover cannot establish an assertion (UndefinedCalledMethodPrecondition) in method m2",17
,"/tt/TestJava.java:7: warning: Associated declaration",30
,"/tt/TestJava.java:18: warning: The prover cannot establish an assertion (UndefinedCalledMethodPrecondition) in method m1a",17
,"/tt/TestJava.java:7: warning: Associated declaration",30
,"/tt/TestJava.java:21: warning: The prover cannot establish an assertion (Assert) in method m1b",9
);
}
}