package org.jmlspecs.openjmltest.testcases; import org.jmlspecs.openjmltest.EscBase; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.ParameterizedWithNames; // FIXME - these were old tests - are they duplicates? should we use them? @RunWith(ParameterizedWithNames.class) public class escArithmeticModes extends EscBase { // public escArithmeticModes() { // super("",isWindows?null:"cvc4"); // } public escArithmeticModes(String options, String solver) { super(options,solver); } // FIXME - the -custom option fails significantly when escdebug and -trace are on // FIXME = significant failures in boogie and newesc @Override public void setUp() throws Exception { //noCollectDiagnostics = true; super.setUp(); main.addOptions("-nullableByDefault"); // Because the tests were written this way //main.addOptions("-trace"); //JmlEsc.escdebug = true; //org.jmlspecs.openjml.provers.YicesProver.showCommunication = 3; //print = true; } @Test public void testNeg() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" public int m(int i) {\n" +" int k = -i;\n" +" return k; \n" +" }\n" +"}\n" ,"/tt/TestJava.java:4: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method m",13 ); } @Test public void testNegNeg() { helpTCX("tt.TestJava","package tt; \n" +"public class TestJava { \n" +" //@ requires i >= 0;\n" +" public int m(int i) {\n" +" int k = -(-i);\n" +" return k; \n" +" }\n" +"}\n" ); } @Test public void testNegJava() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*;\n" +"public class TestJava { \n" +" /*@ code_java_math */ public int m(int i) {\n" +" int k = -i;\n" +" return k; \n" +" }\n" +"}\n" ); } @Test public void testNegSafe() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*; \n" +"@CodeSafeMath public class TestJava { \n" +" public int m(int i) {\n" +" int k = -i;\n" +" return k; \n" +" }\n" +"}\n" ,"/tt/TestJava.java:4: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method m",13 ); } @Test public void testNegMath() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*;\n" +"@CodeBigintMath public class TestJava { \n" +" public int m(int i) {\n" +" int k = -i;\n" +" return k; \n" +" }\n" +"}\n" ); } @Test public void testSumSafe() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*; \n" +"@CodeSafeMath public class TestJava { \n" +" public int m(int i) {\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int ma(int i) {\n" +" //@ assume i <= 0x3FFFFFFF;\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int mb(int i) {\n" +" //@ assume i >= (int)(0xC0000000);\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int mc(int i) {\n" +" //@ assume i <= 0x3FFFFFFF;\n" +" //@ assume i >= (int)(0xC0000000);\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int mm(int i, int j) {\n" +" //@ assume (i < 0) != (j < 0);\n" +" int k = i + j;\n" +" return k; \n" +" }\n" +"}\n" ,anyorder(seq("/tt/TestJava.java:4: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method m: underflow in int sum",15) ,seq("/tt/TestJava.java:4: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method m: overflow in int sum",15)) ,"/tt/TestJava.java:9: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method ma: underflow in int sum",15 ,"/tt/TestJava.java:14: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method mb: overflow in int sum",15 ); } @Test public void testSumJava() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*; \n" +"@CodeJavaMath public class TestJava { \n" +" public int m(int i) {\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int mb(int i) {\n" +" //@ assume i >= 0;\n" +" int k = i + i;\n" +" //@ assert k >= 0;\n" // FIXME - this should fail +" return k; \n" +" }\n" +" public int mm(int i, int j) {\n" +" int k = i + j;\n" +" return k; \n" +" }\n" +"}\n" ); } @Test public void testSumMath() { helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*; \n" +"@CodeBigintMath public class TestJava { \n" +" public int m(int i) {\n" +" int k = i + i;\n" +" return k; \n" +" }\n" +" public int mb(int i) {\n" +" //@ assume i >= 0;\n" +" int k = i + i;\n" +" //@ assert k >= 0;\n" +" return k; \n" +" }\n" +" public int mm(int i, int j) {\n" +" int k = i + j;\n" +" return k; \n" +" }\n" +"}\n" ); } @Test public void testDivSafe() { main.addOptions("-logic=AUFNIA"); helpTCX("tt.TestJava","package tt; import org.jmlspecs.annotation.*; \n" +"@CodeSafeMath public class TestJava { \n" +" public int m(int i, int j) {\n" +" int k = i/j;\n" +" return k; \n" +" }\n" +"}\n" ,anyorder( seq("/tt/TestJava.java:4: warning: The prover cannot establish an assertion (ArithmeticOperationRange) in method m: overflow in int divide",14) ,seq("/tt/TestJava.java:4: warning: The prover cannot establish an assertion (PossiblyDivideByZero) in method m",14) ) ); } }