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;
// Tests the rules about which specification cases are enforced by a method's implementation
@RunWith(ParameterizedWithNames.class)
public class escvisibility extends EscBase {
public escvisibility(String option, String solver) {
super(option, solver);
}
@Override
public void setUp() throws Exception {
//noCollectDiagnostics = true;
super.setUp();
main.addOptions("-no-purityCheck");
String z = java.io.File.pathSeparator;
String testspecpath = "$A"+z+"$B";
main.addOptions("-classpath", testspecpath);
main.addOptions("-sourcepath", testspecpath);
main.addOptions("-specspath", testspecpath);
main.addOptions("-quiet");
//JmlEsc.escdebug = true;
//org.jmlspecs.openjml.provers.YicesProver.showCommunication = 3;
//print = true;
main.addOptions("-jmltesting");
}
// Invariant inherited from same package
@Test
public void testPrivate() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" private boolean b = false; public boolean bb = true;\n"
+" //@ private invariant b; \n"
+" //@ ensures bb;\n"
+" public void change() { b = false; }"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() throws Exception {\n"
+" change();\n"
+" }\n"
+"}"
);
}
@Test
public void testPublic() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public boolean b = true;\n"
+" //@ public invariant b; \n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() throws Exception {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:4: warning: Associated declaration",14
);
}
@Test
public void testProtected() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" protected boolean b = true;\n"
+" //@ protected invariant b; \n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() throws Exception {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:4: warning: Associated declaration",17
);
}
@Test
public void testPackage() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" boolean b = true;\n"
+" //@ invariant b; \n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() throws Exception {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:4: warning: Associated declaration",7
);
}
// Invariant in same class
@Test
public void testPrivate2() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" private boolean b = true;\n"
+" //@ private invariant b; \n"
+" public void m1() {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:6: warning: Associated declaration",15
);
}
@Test
public void testPublic2() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public boolean b = true;\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ public invariant b; \n"
+" public void m1() {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:6: warning: Associated declaration",14
);
}
@Test
public void testProtected2() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" protected boolean b = true;\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ protected invariant b; \n"
+" public void m1() {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:6: warning: Associated declaration",17
);
}
@Test
public void testPackage2() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" boolean b = true;\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ invariant b; \n"
+" public void m1() {\n"
+" b = false;\n"
+" }\n"
+"}"
,"/tt/TestJava.java:7: warning: The prover cannot establish an assertion (InvariantExit) in method m1",15
,"/tt/TestJava.java:6: warning: Associated declaration",7
);
}
// Inherited method spec in same package
@Test
public void testPrivate3() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ private normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
);
}
@Test
public void testPublic3() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ public normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",30
);
}
@Test
public void testProtected3() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ protected normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",33
);
}
@Test
public void testPackage3() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",23
);
}
// Inherited lightweight method spec in same package
@Test
public void testPrivate3a() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ ensures false;\n"
+" private void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
);
}
@Test
public void testPublic3a() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",8
);
}
@Test
public void testProtected3a() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ ensures false;\n"
+" protected void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",8
);
}
@Test
public void testPackage3a() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" //@ ensures false;\n"
+" void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:3: warning: Associated declaration",8
);
}
// Inherited method spec in same class
@Test
public void testPrivate4() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ private normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:7: warning: Associated declaration",31
);
}
@Test
public void testPublic4() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ public normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:7: warning: Associated declaration",30
);
}
@Test
public void testProtected4() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ protected normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:7: warning: Associated declaration",33
);
}
@Test
public void testPackage4() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava extends Parent { \n"
+" //@ normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:8: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tt/TestJava.java:7: warning: Associated declaration",23
);
}
// Inherited method specs from a different package
@Test
public void testPrivate5() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ private normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
);
}
@Test
public void testPublic5() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ public normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:3: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tx/Parent.java:2: warning: Associated declaration",30
);
}
@Test
public void testProtected5() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ protected normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:3: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tx/Parent.java:2: warning: Associated declaration",33
);
}
@Test
public void testPackage5() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ normal_behavior ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
);
}
// Inherited lightweight method specs from a different package
@Test
public void testPrivate6() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ ensures false;\n"
+" private void m1() {\n"
+" }\n"
+"}"
);
}
@Test
public void testPublic6() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ ensures false;\n"
+" public void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:3: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tx/Parent.java:2: warning: Associated declaration",8
);
}
@Test
public void testProtected6() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ ensures false;\n"
+" protected void m1() {\n"
+" }\n"
+"}"
,"/tt/TestJava.java:3: warning: The prover cannot establish an assertion (Postcondition) in method m1",15
,"/tx/Parent.java:2: warning: Associated declaration",8
);
}
@Test
public void testPackage6() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX2("tt.TestJava","package tt; \n"
+"public class TestJava extends tx.Parent { \n"
+" public void m1() {\n"
+" }\n"
+"}",
"tx.Parent","package tx; public class Parent {\n"
+" //@ ensures false;\n"
+" void m1() {\n"
+" }\n"
+"}"
);
}
// Not-inherited method spec
@Test
public void testPublic7() {
main.addOptions("-method", "tt.TestJava.m1");
addMockJavaFile("tx/B.java","package tx; public class B {\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}"
);
helpTCX("tt.TestJava","package tt; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" tx.B.m1();"
+" }\n"
+"}"
,"/tt/TestJava.java:4: warning: The prover cannot establish an assertion (Precondition) in method m1",13
,"/tx/B.java:2: warning: Associated declaration",8
);
}
@Test
public void testPrivate8() {
main.addOptions("-method", "tt.TestJava.m1");
addMockJavaFile("tx/B.java","package tx; public class B {\n"
+" //@ private normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}"
);
helpTCX("tt.TestJava","package tt; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" tx.B.m1();"
+" }\n"
+"}"
);
}
@Test
public void testPublic8() {
main.addOptions("-method", "tt.TestJava.m1");
addMockJavaFile("tx/B.java","package tx; public class B {\n"
+" //@ public normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}"
);
helpTCX("tt.TestJava","package tt; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" tx.B.m1();"
+" }\n"
+"}"
,"/tt/TestJava.java:4: warning: The prover cannot establish an assertion (Precondition) in method m1",13
,"/tx/B.java:3: warning: Associated declaration",8
);
}
@Test
public void testProtected8() {
main.addOptions("-method", "tt.TestJava.m1");
addMockJavaFile("tx/B.java","package tx; public class B {\n"
+" //@ protected normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}"
);
helpTCX("tt.TestJava","package tt; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" tx.B.m1();"
+" }\n"
+"}"
);
}
@Test
public void testPackage8() {
main.addOptions("-method", "tt.TestJava.m1");
addMockJavaFile("tx/B.java","package tx; public class B {\n"
+" //@ normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}"
);
helpTCX("tt.TestJava","package tt; \n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" tx.B.m1();"
+" }\n"
+"}"
);
}
@Test
public void testPrivate9() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class B { \n"
+" //@ private normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" B.m1();"
+" }\n"
+"}"
);
}
@Test
public void testPublic9() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class B { \n"
+" //@ public normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" B.m1();"
+" }\n"
+"}"
,"/tt/TestJava.java:10: warning: The prover cannot establish an assertion (Precondition) in method m1",11
,"/tt/TestJava.java:4: warning: Associated declaration",8
);
}
@Test
public void testProtected9() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class B { \n"
+" //@ protected normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" B.m1();"
+" }\n"
+"}"
,"/tt/TestJava.java:10: warning: The prover cannot establish an assertion (Precondition) in method m1",11
,"/tt/TestJava.java:4: warning: Associated declaration",8
);
}
@Test
public void testPackage9() {
main.addOptions("-method", "tt.TestJava.m1");
helpTCX("tt.TestJava","package tt; \n"
+"class B { \n"
+" //@ normal_behavior\n"
+" //@ requires false;\n"
+" static public void m1() {\n"
+" }\n"
+"}\n"
+"public class TestJava { \n"
+" public void m1() {\n"
+" B.m1();"
+" }\n"
+"}"
,"/tt/TestJava.java:10: warning: The prover cannot establish an assertion (Precondition) in method m1",11
,"/tt/TestJava.java:4: warning: Associated declaration",8
);
}
}