package org.jmlspecs.openjmltest.testcases; import org.jmlspecs.openjml.Utils; import org.jmlspecs.openjmltest.TCBase; import org.junit.Ignore; import org.junit.Test; public class purity extends TCBase { @Override public void setUp() throws Exception { // noCollectDiagnostics = true; // jmldebug = true; useSystemSpecs = true; super.setUp(); main.addOptions("-purityCheck=true"); } /** Test scanning something very simple */ @Test public void testPure() { helpTC(" class A { /*@ pure */ boolean m() { return true; } \n //@ invariant m(); \n}" ); } /** Test scanning something very simple */ @Test public void testPure2() { expectedExit = 0; helpTC(" class A { boolean m() { return true; } \n //@ invariant m(); \n}" ,"/TEST.java:2: warning: A non-pure method is being called where it is not permitted: A.m()",17 ); } @Test public void testSpecFile() { addMockFile("$A/A.jml","public class A { /*@pure*/ int m(); //@ invariant m() == 0; \n}"); helpTCF("A.java","public class A { int m() { return 0; } \n }" ); } @Test public void testSpecFile2() { expectedExit = 0; addMockFile("$A/A.jml","public class A { int m(); //@ invariant m() == 0; \n}"); helpTCF("A.java","public class A { int m() { return 0; } \n }" ,"/$A/A.jml:1: warning: A non-pure method is being called where it is not permitted: A.m()",44 ); } @Test public void testSpecFile3() { expectedExit = 0; addMockFile("$A/A.jml","public class A { /*@ pure */ int m(); //@ invariant m() == 0; \n}"); helpTCF("A.java","public class A { int m() { return 0; } \n }" ); } @Test public void testSpecFile3a() { expectedExit = 0; addMockFile("$A/A.jml","public class A { int m(); //@ invariant m() == 0; \n}"); helpTCF("A.java","public class A { int m() { return 0; } \n }" ,"/$A/A.jml:1: warning: A non-pure method is being called where it is not permitted: A.m()",44 ); } @Test public void testPureAssign() { helpTC(" class A { boolean b,bb; \n //@ invariant (b=bb); \n}" ,"/TEST.java:2: Assignments are not allowed where pure expressions are expected",18 ); } @Test public void testPureAssignOp() { helpTC(" class A { int b,bb; \n //@ invariant (b+=bb)==0; \n}" ,"/TEST.java:2: Assignments are not allowed where pure expressions are expected",18 ); } @Test public void testPureIncrement() { helpTC(" class A { int b,bb; \n //@ invariant 0==(++b); \n}" ,"/TEST.java:2: Increment and decrement operators are not allowed where pure expressions are expected",20 ); } @Test public void testPureIncrement2() { helpTC(" class A { int b,bb; \n //@ invariant 0==(b++); \n}" ,"/TEST.java:2: Increment and decrement operators are not allowed where pure expressions are expected",21 ); } @Test public void testPureDecrement() { helpTC(" class A { int b,bb; \n //@ invariant 0==(--b); \n}" ,"/TEST.java:2: Increment and decrement operators are not allowed where pure expressions are expected",20 ); } @Test public void testPureDecrement2() { helpTC(" class A { int b,bb; \n //@ invariant 0==(b--); \n}" ,"/TEST.java:2: Increment and decrement operators are not allowed where pure expressions are expected",21 ); } /** Test a method in a pure class */ @Test public void testPureClass() { helpTC(" class A extends B { \n //@ invariant mm(); \n} /*@ pure */ class B { boolean mm() { return true; } }" ); } /** Test that pure is not inherited */ @Test public void testPureClass2() { expectedExit = 0; helpTC(" class A extends B { boolean mm() { return true; } \n //@ invariant mm(); \n} /*@ pure */ class B { boolean mm() { return true; } }" ,"/TEST.java:2: warning: A non-pure method is being called where it is not permitted: A.mm()",18 ); } /** Test that pure from enclosing class does not apply */ // FIXME - this is a question for JML @Test public void testPureClass3() { expectedExit = 0; helpTC(" /*@ pure */ class A { static class B { //@ invariant mm(); \n boolean mm() { return true; } }\n } " ,"/TEST.java:1: warning: A non-pure method is being called where it is not permitted: A.B.mm()",59 ); } @Test public void testCollection() { expectedExit = 0; helpTC(" class A { /*@ pure */ public int m(java.util.Vector v) { return v.size(); }\n } " ); } @Test public void testCollection2() { expectedExit = 0; helpTC(" class A { public void m(java.util.Vector v) { //@ assert 0 == v.size(); }\n } " ); } }