package org.jmlspecs.openjmltest.testcases; import org.jmlspecs.openjmltest.EscBase; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.ParameterizedWithNames; @RunWith(ParameterizedWithNames.class) public class escConstantFields extends EscBase { public escConstantFields(String options, String solver) { super(options,solver); } @Test public void testBasic() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final static int I = 1;\n" +" public final static int J = 1 + I;\n" +" //@ ensures J == 2;\n" +" public TestJava() { }\n" +" //@ ensures J == 2;\n" +" public void m() {}\n" +" //@ ensures J == 2;\n" +" static public void n() {}\n" +"}" ); } @Test public void testGhost() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ ghost public final static int I = 1;\n" +" //@ ghost public final static int J = 1 + I;\n" +" //@ ensures J == 2;\n" +" public TestJava() { }\n" +" //@ ensures J == 2;\n" +" public void m() {}\n" +" //@ ensures J == 2;\n" +" static public void n() {}\n" +"}" ); } @Test public void testFields() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final static int I = 1;\n" +" //@ ghost public final static int J = 1 + I;\n" // Does not need the invariant +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // final variables are not affected by assignable \everything +" //@ assert I == 1 && J == 2;\n" +" }\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // final variables are not affected by assignable \everything +" //@ assert I == 1 && J == 2;\n" +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +"}" ); } @Test public void testFieldsNotFinal() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public static int I = 1;\n" +" //@ ghost public static int J = 1 + I;\n" +" //@ public static invariant I == 1 && J == 2;\n" +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // reestablishes the static invariant +" //@ assert I == 1 && J == 2;\n" +" }\n" +" //@ ensures J == 2;\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // reestablished the static invariant +" //@ assert I == 1 && J == 2;\n" +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +"}" ); } @Test public void testFieldsNotConstant() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final static int I = z();\n" // FIXME - static initialization check should fail +" //@ ghost public final static int J = 1 + I;\n" +" //@ public static invariant I == 10 && J == 11;\n" +" public TestJava() { \n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" // reestablished the static invariant +" //@ assert I == 10 && J == 11;\n" +" }\n" +" public void m() {\n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" // reestablished the static invariant +" //@ assert I == 10 && J == 11;\n" +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +" static public int z() { return 10; }\n" +"}" ); } @Test public void testFieldsNotConstantWithHelper() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final static int I = z();\n" // FIXME - static initialization check should fail +" //@ ghost public final static int J = 1 + I;\n" +" //@ public static invariant I == 10 && J == 11;\n" +" public TestJava() { \n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" // reestablished the static invariant +" //@ assert I == 10 && J == 11;\n" +" }\n" +" public void m() {\n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" // reestablished the static invariant +" //@ assert I == 10 && J == 11;\n" +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +" /*@ helper */ static private int z() { return 10; }\n" +"}" ); } @Test public void testIFields() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final int I = 1;\n" +" //@ ghost public final int J = 1 + I;\n" +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" +" //@ assert I == 1 && J == 2;\n" +" }\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" +" //@ assert I == 1 && J == 2;\n" +" }\n" +" //@ assignable \\everything;\n" +" public void n() {}\n" +"}" ); } @Test public void testIFieldsS() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final int I = 1;\n" +" //@ ghost public final int J = 1 + I;\n" // Does not need the invariant +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // does not reestablish instance invariants +" //@ assert I == 1 && J == 2;\n" // but OK because final constant fields are not modified by \everything +" }\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" +" n();\n" // does not reestablish instance invariants +" //@ assert I == 1 && J == 2;\n" // but OK because final fields are not modified by \everything +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +"}" ); } @Test public void testIFieldsNotFinal() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public int I = 1;\n" +" //@ ghost public int J = 1 + I;\n" +" //@ public invariant I == 1 && J == 2;\n" +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" // OK +" n();\n" +" //@ assert I == 1 && J == 2;\n" // Should be OK because of invariant on n() +" }\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" // OK because of invariant +" n();\n" +" //@ assert I == 1 && J == 2;\n" // Should be OK because of invariant on n() +" }\n" +" //@ assignable \\everything;\n" +" public void n() {}\n" +"}" ); } @Test public void testIFieldsNotFinalS() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public int I = 1;\n" +" //@ ghost public int J = 1 + I;\n" +" //@ public invariant I == 1 && J == 2;\n" +" public TestJava() { \n" +" //@ assert I == 1 && J == 2;\n" // OK +" n();\n" +" //@ assert I == 1 && J == 2;\n" // Fails because n is static and so does not establish the invariant +" }\n" +" public void m() {\n" +" //@ assert I == 1 && J == 2;\n" // OK because of invariant +" n();\n" +" //@ assert I == 1 && J == 2;\n" // Fails because n is static and so does not establish the invariant +" }\n" +" //@ public normal_behavior assignable \\everything;\n" +" static public void n() {}\n" +"}" ,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (Assert) in method TestJava",10 ); } @Test public void testIFieldsNotConstant() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final int I = z();\n" +" //@ ghost public final int J = 1 + I;\n" +" //@ public invariant I == 10 && J == 11;\n" // FIXME - check that this is required +" public TestJava() { \n" +" //@ assert I == 10 && J == 11;\n" // OK because of invariant +" n();\n" +" //@ assert I == 10 && J == 11;\n" // Should be OK because of invariant on n() +" }\n" +" public void m() {\n" +" //@ assert I == 10 && J == 11;\n" // OK because of invariant +" n();\n" +" //@ assert I == 10 && J == 11;\n" // Should be OK because of invariant on n() +" }\n" +" //@ assignable \\everything;\n" +" public void n() {}\n" +" //@ public normal_behavior ensures \\result == 10;\n" +" static public int z() { return 10; }\n" +"}" ); } @Test public void testIFieldsNotConstantS() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final int I = z();\n" +" //@ ghost public final int J = 1 + I;\n" +" //@ public invariant I == 10 && J == 11;\n" +" public TestJava() { \n" +" //@ assert I == 10 && J == 11;\n" // OK because of invariant +" n();\n" +" //@ assert I == 10 && J == 11;\n" // Should be OK because final fields are not modified +" }\n" +" public void m() {\n" +" //@ assert I == 10 && J == 11;\n" // OK because of invariant +" n();\n" +" //@ assert I == 10 && J == 11;\n" // Should be OK because final fields are not modified +" }\n" +" //@ assignable \\everything;\n" +" static public void n() {}\n" +" //@ public normal_behavior ensures \\result == 10;\n" +" static public int z() { return 10; }\n" +"}" ); } @Test public void testIFieldsNotConstantWithHelper() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public final int I = z();\n" +" //@ ghost public final int J = 1 + I;\n" +" //@ public invariant I == 10 && J == 11;\n" +" public TestJava() { \n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" +" //@ assert I == 10 && J == 11;\n" +" }\n" +" public void m() {\n" +" //@ assert I == 10 && J == 11;\n" +" n();\n" +" //@ assert I == 10 && J == 11;\n" +" }\n" +" //@ assignable \\everything;\n" +" public void n() {}\n" +" //@ private normal_behavior ensures \\result == 10;\n" +" /*@ helper */ static private int z() { return 10; }\n" +"}" ); } }