package org.jmlspecs.openjmltest.testcases; import org.jmlspecs.openjml.JmlTree.*; import org.jmlspecs.openjmltest.ParseBase; import org.junit.Test; import com.sun.tools.javac.tree.JCTree.*; /** Tests that the parser creates the correct tokens for some simple * compilation unit tests, in particular for refines and import statements. * @author David Cok * */ public class compilationUnit extends ParseBase { @Override public void setUp() throws Exception { // noCollectDiagnostics = true; // jmldebug = true; super.setUp(); } /** Quickie test of some pure Java code */ @Test public void testSomeJava() { checkCompilationUnit("package t; \nclass A{}", JmlCompilationUnit.class,0, JCIdent.class, 8, JmlClassDecl.class, 12, JCModifiers.class, -1); checkMessages(); } /** One refines clause with no package or imports */ @Test public void testRefines() { checkCompilationUnit("/*@ refines \"A.xxx\"; */ class A{}", JmlCompilationUnit.class,4, JCErroneous.class, 4, JmlClassDecl.class, 24, JCModifiers.class, -1); checkMessages("/TEST.java:1: Unexpected or misspelled JML token: refines",5); } /** Tests a star import */ @Test public void testImports() { checkCompilationUnit("import java.io.*; class A{}", JmlCompilationUnit.class, 0,0,28, JmlImport.class, 0,0,17, JCFieldAccess.class, 7,14,16, JCFieldAccess.class, 7,11,14, JCIdent.class, 7,7,11, JmlClassDecl.class, 19,19,28, JCModifiers.class, -1,-1,-1); checkMessages(); } /** Tests a static star import */ @Test public void testImports2() { checkCompilationUnit("import static java.io.*; class A{}", JmlCompilationUnit.class, 0,0,35, JmlImport.class, 0,0,24, JCFieldAccess.class, 14,21,23, JCFieldAccess.class, 14,18,21, JCIdent.class, 14,14,18, JmlClassDecl.class, 26,26,35, JCModifiers.class, -1,-1,-1); checkMessages(); } /** Tests a static non-star import */ @Test public void testImports3() { checkCompilationUnit("import static java.io.File; class A{}", JmlCompilationUnit.class, 0,0,38, JmlImport.class, 0,0,27, JCFieldAccess.class, 14,21,26, JCFieldAccess.class, 14,18,21, JCIdent.class, 14,14,18, JmlClassDecl.class, 29,29,38, JCModifiers.class, -1,-1,-1); checkMessages(); } /** Tests a non-star import with modifier */ @Test public void testImports4() { checkCompilationUnit("import java.io.File; public class A{}", JmlCompilationUnit.class, 0,0,38, JmlImport.class, 0,0,20, JCFieldAccess.class, 7,14,19, JCFieldAccess.class, 7,11,14, JCIdent.class, 7,7,11, JmlClassDecl.class, 22,29,38, JCModifiers.class, 22,22,28); checkMessages(); } /** Tests a non-star import with 2 modifiers */ @Test public void testImports5() { checkCompilationUnit("import java.io.File; public protected class A{}", JmlCompilationUnit.class, 0,0,48, JmlImport.class, 0,0,20, JCFieldAccess.class, 7,14,19, JCFieldAccess.class, 7,11,14, JCIdent.class, 7,7,11, JmlClassDecl.class, 22,39,48, JCModifiers.class, 22,22,38); checkMessages(); } /** Tests parsing an annotation */ @Test public void testAnnotation() { checkCompilationUnit("@org.jmlspecs.annotation.Pure class A {}", JmlCompilationUnit.class, 0,0,40, JmlClassDecl.class, 0,30,40, JCModifiers.class, 0,0,29, JmlAnnotation.class, 0,0,29, JCFieldAccess.class, 1,24,29, JCFieldAccess.class, 1,13,24, JCFieldAccess.class, 1,4,13, JCIdent.class, 1,1,4 ); checkMessages(); } /** Tests parsing an annotation and modifier */ @Test public void testAnnotation1() { checkCompilationUnit("@org.jmlspecs.annotation.Pure public class A {}", JmlCompilationUnit.class, 0,0,47, JmlClassDecl.class, 0,37,47, JCModifiers.class, 0,0,36, JmlAnnotation.class, 0,0,29, JCFieldAccess.class, 1,24,29, JCFieldAccess.class, 1,13,24, JCFieldAccess.class, 1,4,13, JCIdent.class, 1,1,4 ); checkMessages(); } /** Tests parsing an annotation and modifier and annotation */ @Test public void testAnnotation1a() { checkCompilationUnit("@org.jmlspecs.annotation.Pure public @org.jmlspecs.annotation.NonNull class A {}", JmlCompilationUnit.class, 0,0,80, JmlClassDecl.class, 0,70,80, JCModifiers.class, 0,0,69, JmlAnnotation.class, 0,0,29, JCFieldAccess.class, 1,24,29, JCFieldAccess.class, 1,13,24, JCFieldAccess.class, 1,4,13, JCIdent.class, 1,1,4, JmlAnnotation.class, 37,37,69, JCFieldAccess.class, 38,61,69, JCFieldAccess.class, 38,50,61, JCFieldAccess.class, 38,41,50, JCIdent.class, 38,38,41 ); checkMessages(); } /** Tests parsing a traditional JML annotation */ @Test public void testAnnotation2() { checkCompilationUnit("/*@ pure */ class A {}", JmlCompilationUnit.class, 4,4,22, JmlClassDecl.class, 4,12,22, JCModifiers.class, 4,4,11, // FIXME - would like this to be 8 JmlAnnotation.class, 4,4,8, JCFieldAccess.class, 4,4,8, JCFieldAccess.class, 4,4,8, JCFieldAccess.class, 4,4,8, JCIdent.class, 4,4,8 ); checkMessages(); } @Test public void testRefining() { checkCompilationUnit("class A { void m() { /*@ refining requires true; ensures true; */ m(); }}", JmlCompilationUnit.class, 0,0,73, JmlClassDecl.class, 0,0,73, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 10,15,72, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 10,10,14, JmlBlock.class, 19,19,72, JmlStatementSpec.class, 25, 25, 62, JmlMethodSpecs.class, 34, 34, 62, JmlSpecificationCase.class, 34,34,62, JCModifiers.class, -1,-1,-1, JmlMethodClauseExpr.class, 34,34,48, JCLiteral.class, 43,43,47, JmlMethodClauseExpr.class, 49,49,62, JCLiteral.class, 57,57,61, JCExpressionStatement.class, 66,66,70, JCMethodInvocation.class, 66,67,69, JCIdent.class, 66,66,67 ); checkMessages(); } @Test public void testRefining2() { checkCompilationUnit("class A { void m() { /*@ requires true; ensures true; */ m(); }}", JmlCompilationUnit.class, 0,0,73, JmlClassDecl.class, 0,0,73, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 10,15,72, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 10,10,14, JmlBlock.class, 19,19,72, JmlStatementSpec.class, 34,34, 62, JmlMethodSpecs.class, 34, 34, 62, JmlSpecificationCase.class, 34,34,62, JCModifiers.class, -1,-1,-1, JmlMethodClauseExpr.class, 34,34,48, JCLiteral.class, 43,43,47, JmlMethodClauseExpr.class, 49,49,62, JCLiteral.class, 57,57,61, JCExpressionStatement.class, 66,66,70, JCMethodInvocation.class, 66,67,69, JCIdent.class, 66,66,67 ); checkMessages(); } @Test public void testRequires() { checkCompilationUnit("class A { /*@ requires true; requires \\not_specified; */ void m(int i) {}}", JmlCompilationUnit.class, 0,0,74, JmlClassDecl.class, 0,0,74, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 57,62,73, JmlMethodSpecs.class, 14,14,53, JmlSpecificationCase.class, 14,14,53, JCModifiers.class, -1,-1,-1, JmlMethodClauseExpr.class, 14,14,28, JCLiteral.class, 23,23,27, JmlMethodClauseExpr.class, 29,29,53, JmlSingleton.class, 38,38,52, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 57,57,61, // The method name is not an AST JmlVariableDecl.class, 64,68,69, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 64,64,67, // The parameter name is a Name, not an AST JmlBlock.class, 71,71,73 ); checkMessages(); } @Test public void testEnsures() { checkCompilationUnit("class A { /*@ ensures true; ensures \\not_specified; */ void m() {}}", JmlCompilationUnit.class, 0,0,69, JmlClassDecl.class, 0,0,69, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 57,62,68, JmlMethodSpecs.class, 14,14,53, JmlSpecificationCase.class, 14,14,53, JCModifiers.class, -1,-1,-1, JmlMethodClauseExpr.class, 14,14,28, JCLiteral.class, 23,23,27, JmlMethodClauseExpr.class, 29,29,53, JmlSingleton.class, 38,38,52, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 57,57,61, // The method name is a Name, not an AST JmlBlock.class, 66,66,68 ); checkMessages(); } @Test public void testCallable() { checkCompilationUnit("class A { /*@ callable \\nothing ; */ void m() {}}", JmlCompilationUnit.class, 0,0,51, JmlClassDecl.class, 0,0,51, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 39,44,50, // FIXME - specs are not inside the method decl JmlMethodSpecs.class, 14,14,35, JmlSpecificationCase.class, 14,14,35, JCModifiers.class, -1,-1,-1, JmlMethodClauseCallable.class, 14,14,35, JmlStoreRefKeyword.class, 23,23,31, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 39,39,43, JmlBlock.class, 48,48,50 ); checkMessages(); } @Test public void testCallable2() { checkCompilationUnit("class A { /*@ callable \\everything; */ void m() {}}", JmlCompilationUnit.class, 0,0,51, JmlClassDecl.class, 0,0,51, JCModifiers.class, -1,-1,-1, JmlMethodDecl.class, 39,44,50, // FIXME - specs are not inside the method decl JmlMethodSpecs.class, 14,14,35, JmlSpecificationCase.class, 14,14,35, JCModifiers.class, -1,-1,-1, JmlMethodClauseCallable.class, 14,14,35, JmlStoreRefKeyword.class, 23,23,34, JCModifiers.class, -1,-1,-1, JCPrimitiveTypeTree.class, 39,39,43, JmlBlock.class, 48,48,50 ); checkMessages(); } // FIXME - add all other constructs: multiple classes, interfaces, enums, extends, implements, declarations, clauses, method constructs, method clauses, nowarn }