View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.dfa;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertTrue;
8   import net.sourceforge.pmd.PMD;
9   import net.sourceforge.pmd.lang.Language;
10  import net.sourceforge.pmd.lang.dfa.DataFlowNode;
11  import net.sourceforge.pmd.lang.dfa.NodeType;
12  import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
13  import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
14  import net.sourceforge.pmd.lang.java.ast.ASTExpression;
15  import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
16  import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression;
17  import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator;
18  import net.sourceforge.pmd.lang.java.dfa.StatementAndBraceFinder;
19  import net.sourceforge.pmd.testframework.ParserTst;
20  
21  import org.junit.Test;
22  
23  
24  public class StatementAndBraceFinderTest extends ParserTst {
25  
26      @Test
27      public void testStatementExpressionParentChildLinks() throws Throwable {
28          ASTStatementExpression se = getOrderedNodes(ASTStatementExpression.class, TEST1).get(0);
29          ASTMethodDeclaration seParent = (ASTMethodDeclaration) ((DataFlowNode) se.getDataFlowNode().getParents().get(0)).getNode();
30          assertEquals(se, ((DataFlowNode) seParent.getDataFlowNode().getChildren().get(0)).getNode());
31          assertEquals(seParent, ((DataFlowNode) se.getDataFlowNode().getParents().get(0)).getNode());
32      }
33  
34      @Test
35      public void testVariableDeclaratorParentChildLinks() throws Throwable {
36          ASTVariableDeclarator vd = getOrderedNodes(ASTVariableDeclarator.class, TEST2).get(0);
37          ASTMethodDeclaration vdParent = (ASTMethodDeclaration) ((DataFlowNode) vd.getDataFlowNode().getParents().get(0)).getNode();
38          assertEquals(vd, ((DataFlowNode) vdParent.getDataFlowNode().getChildren().get(0)).getNode());
39          assertEquals(vdParent, ((DataFlowNode) vd.getDataFlowNode().getParents().get(0)).getNode());
40      }
41  
42      @Test
43      public void testIfStmtHasCorrectTypes() throws Throwable {
44          ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST3).get(0);
45          DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
46          assertTrue(dfn.isType(NodeType.IF_EXPR));
47          assertTrue(dfn.isType(NodeType.IF_LAST_STATEMENT_WITHOUT_ELSE));
48      }
49  
50      @Test
51      public void testWhileStmtHasCorrectTypes() throws Throwable {
52          ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST4).get(0);
53          DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
54          assertTrue(dfn.isType(NodeType.WHILE_EXPR));
55          assertTrue(dfn.isType(NodeType.WHILE_LAST_STATEMENT));
56      }
57  
58      @Test
59      public void testForStmtHasCorrectTypes() throws Throwable {
60          ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST5).get(0);
61          DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
62          assertTrue(dfn.isType(NodeType.FOR_INIT));
63          dfn = exp.getDataFlowNode().getFlow().get(3);
64          assertTrue(dfn.isType(NodeType.FOR_EXPR));
65          dfn = exp.getDataFlowNode().getFlow().get(4);
66          assertTrue(dfn.isType(NodeType.FOR_UPDATE));
67          assertTrue(dfn.isType(NodeType.FOR_BEFORE_FIRST_STATEMENT));
68          assertTrue(dfn.isType(NodeType.FOR_END));
69      }
70  
71      @Test(expected = RuntimeException.class)
72      public void testOnlyWorksForMethodsAndConstructors() {
73          StatementAndBraceFinder sbf = new StatementAndBraceFinder(Language.JAVA.getDefaultVersion().getLanguageVersionHandler().getDataFlowHandler());
74          sbf.buildDataFlowFor(new ASTMethodDeclaration(1));
75          sbf.buildDataFlowFor(new ASTConstructorDeclaration(1));
76          sbf.buildDataFlowFor(new ASTCompilationUnit(1));
77      }
78  
79      private static final String TEST1 =
80              "class Foo {" + PMD.EOL +
81              " void bar() {" + PMD.EOL +
82              "  x = 2;" + PMD.EOL +
83              " }" + PMD.EOL +
84              "}";
85  
86      private static final String TEST2 =
87              "class Foo {" + PMD.EOL +
88              " void bar() {" + PMD.EOL +
89              "  int x;" + PMD.EOL +
90              " }" + PMD.EOL +
91              "}";
92  
93      private static final String TEST3 =
94              "class Foo {" + PMD.EOL +
95              " void bar() {" + PMD.EOL +
96              "  if (x) {}" + PMD.EOL +
97              " }" + PMD.EOL +
98              "}";
99  
100     private static final String TEST4 =
101             "class Foo {" + PMD.EOL +
102             " void bar() {" + PMD.EOL +
103             "  while (x) {}" + PMD.EOL +
104             " }" + PMD.EOL +
105             "}";
106 
107     private static final String TEST5 =
108             "class Foo {" + PMD.EOL +
109             " void bar() {" + PMD.EOL +
110             "  for (int i=0; i<10; i++) {}" + PMD.EOL +
111             " }" + PMD.EOL +
112             "}";
113 
114     public static junit.framework.Test suite() {
115         return new junit.framework.JUnit4TestAdapter(StatementAndBraceFinderTest.class);
116     }
117 }