package org.jmlspecs.openjmltest.testcases; import org.jmlspecs.openjmltest.TCBase; import org.junit.Test; public class statements extends TCBase { @Override public void setUp() throws Exception { // noCollectDiagnostics = true; // jmldebug = true; super.setUp(); } @Test public void testFor() { helpTCF("A.java"," class A { void m() { \n //@ loop_invariant i>=0; decreasing -i; \n for (int i=0; i<10; i++) {} \n}}" ); } @Test public void testForWithModifies() { helpTCF("A.java"," class A { int k; void m() { \n //@ modifies k; loop_invariant i>=0; decreasing -i;\n for (int i=0; i<10; i++) {} \n}}" ); } @Test public void testForWithModifies2() { helpTCF("A.java"," class A { void m() { \n //@ modifies x; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: cannot find symbol\n symbol: variable x\n location: class A",15 ); } @Test public void testForWithModifies2a() { helpTCF("A.java"," class A { int j; void m() { \n //@ modifies j; \n for (int i=0; i<10; i++) {} \n}}" ); } @Test public void testForWithModifies3() { helpTCF("A.java"," class A { void m() { \n //@ modifies \\nothing; \n for (int i=0; i<10; i++) {} \n}}" ); } @Test public void testForWithModifies4() { helpTCF("A.java"," class A { void m() { \n //@ modifies \\everything; \n for (int i=0; i<10; i++) {} \n}}" ); } @Test public void testForWithModifies5() { helpTCF("A.java"," class A { void m() { \n //@ modifies ; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: Use \\nothing to denote an empty list of locations in an assignable clause",15 ); } @Test public void testForWithModifies6() { helpTCF("A.java"," class A { int k; void m() { \n //@ modifies k[; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: illegal start of expression",17 ,"/A.java:2: An invalid expression or succeeding token near here",17 ); } @Test public void testForWithModifies6a() { helpTCF("A.java"," class A { int k; void m() { \n //@ modifies k.; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: Expected an identifier or star after the dot",17 ); } @Test public void testForWithModifies7() { helpTCF("A.java"," class A { int k; void m() { \n //@ modifies k k k; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: Missing comma or otherwise ill-formed type name",17 ,"/A.java:2: Missing comma or otherwise ill-formed type name",19 ); } @Test public void testForWithModifies8() { helpTCF("A.java"," class A { int k; void m() { \n //@ modifies k,,; \n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: Incorrectly formed or terminated store-reference near here",17 ,"/A.java:2: Incorrectly formed or terminated store-reference near here",18 ); } @Test public void testForEach() { helpTCF("A.java"," class A { void m(java.util.List list) { \n //@ loop_invariant o != null; decreasing 6; \n for (Object o: list) {} \n}}" ); } @Test public void testWhile() { helpTCF("A.java"," class A { void m() { int i = 0; \n //@ loop_invariant i>=0; decreasing i; \n while (i>=0) {} \n}}" ); } @Test public void testFor2() { helpTCF("A.java"," class A { void m() { \n //@ loop_invariant j;\n for (int i=0; i<10; i++) {} \n}}" ,"/A.java:2: cannot find symbol\n symbol: variable j\n location: class A",21 ); } @Test public void testLoop() { helpTCF("A.java"," class A { void m() { \n //@ loop_invariant j;\n int a = 0; \n}}" ,"/A.java:2: Loop specifications must immediately precede a while or for statement",6 ); } @Test public void testLoop2() { helpTCF("A.java"," class A { boolean j; void m() { \n //@ loop_invariant j;\n \n}}" ,"/A.java:2: Loop specifications must immediately precede a while or for statement",6 ); } @Test public void testLoop3() { helpTCF("A.java"," class A { boolean j; void m() { \n //@ loop_invariant j;\n j=true; \n}}" ,"/A.java:2: Loop specifications must immediately precede a while or for statement",6 ); } @Test public void testAssert() { helpTCF("A.java"," class A { Object o; void m() { \n /*@ assume true; assert o==o;*/\n \n}}" ); } @Test public void testAssert1() { helpTCF("A.java"," class A { Object o; void m() { \n //@ assume true: \"a\"; \n//@ assert false: \"b\";\n \n}}" ); } @Test public void testAssert2() { helpTCF("A.java"," class A { Object o; void m() { \n /*@ assume 0; assert o;*/\n \n}}" ,"/A.java:2: incompatible types: int cannot be converted to boolean",13 ,"/A.java:2: incompatible types: java.lang.Object cannot be converted to boolean",23 ); } @Test public void testAssert3() { helpTCF("A.java"," class A { Object o; void m() { \n /*@ assume ; assert ;*/\n \n}}" ,"/A.java:2: illegal start of expression",13 ,"/A.java:2: illegal start of expression",22 ); } @Test public void testAssert4() { helpTCF("A.java"," class A { Object o; void m() { \n /*@ assume true assert false;*/\n \n}}" ,"/A.java:2: Incorrectly formed or terminated assume statement near here",18 ); } @Test public void testUnreachable() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ unreachable; \n i = 0; \n}}" ); } @Test public void testUnreachable1() { expectedExit = 0; helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ unreachable \n i = 0; \n}}" ,"/A.java:2: warning: Inserting missing semicolon at the end of a UNREACHABLE statement",16 ); } @Test public void testSet() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; set j = 1; \n i = 0; \n}}" ); } @Test public void testSet1() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; set j = 1 \n i = 0; \n}}" ,"/A.java:2: ';' expected",28 ); } @Test public void testSet2() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; set if (true) {}; \n i = 0; \n}}" ,"/A.java:2: A set or debug statement may only contain assignments or method calls",23 ); } @Test public void testSet3() { helpTCF("A.java"," class A { boolean o; void m() { int i; \n //@ ghost boolean j; set j = (o <==> \\old(o)); \n i = 0; \n}}" ); } @Test public void testDebug() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; debug m(); \n i = 0; \n}}" ); } @Test public void testDebug1() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; debug m() \n i = 0; \n}}" ,"/A.java:2: ';' expected",28 ); } @Test public void testDebug2() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; debug while (true) {}; \n i = 0; \n}}" ,"/A.java:2: A set or debug statement may only contain assignments or method calls",25 ); } @Test public void testDecl() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; final ghost int k = 0; \n i = 0; \n}}" ); } @Test public void testDec2() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ ghost int j; ghost final int k = 0; \n i = 0; \n}}" ); } @Test public void testSpecs1() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ refining ensures i ==0; \n i = 0; \n}}" ); } @Test public void testSpecs2() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ refining normal_behavior ensures i ==0; also behavior ensures i >= 0; \n i = 0; \n}}" ); } @Test public void testSpecs3() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ refining also ensures i ==0; \n i = 0; \n}}" ,"/A.java:2: An also token may not follow a refining token",15 ); } @Test public void testSpecs4() { helpTCF("A.java"," class A { Object o; void m() { int i; \n //@ refining public behavior ensures i ==0; \n i = 0; \n}}" ,"/A.java:2: No modifiers are allowed in the body of a refining statement",15 ); } @Test public void testSynchronized1() { helpTCF("A.java"," class A { Object o; void m() { int i; \n synchronized (this) { i = 0; } \n}}" ); } @Test public void testSynchronized2() { helpTCF("A.java"," class A { Object o; void m() { int i; \n synchronized (this) { i = 0; } \n}}" ); } @Test public void testSynchronized3() { helpTCF("A.java"," class A { Object o; synchronized void m() { int i; \n { i = 0; } \n}}" ); } @Test public void testSynchronized() { helpTCF("A.java"," public class A { void m() { \n synchronized (this) { ; } \n}}" ); } @Test public void testSynchronized4() { // Bug 3316767 helpTCF("A.java"," public class A { void m() { \n synchronized (this) { } \n}}" ); } @Test public void testEmptyBlock() { // Bug 3316853 helpTCF("A.java"," public class A { void m() { { } } { { } } static { { } } }" ); } // TODO - need tests for hence_by; test for local specification cases; tests for pure methods in expressions }