1   package test.net.sourceforge.pmd.dfa;
2   
3   import net.sourceforge.pmd.PMD;
4   import net.sourceforge.pmd.ast.ASTCompilationUnit;
5   import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
6   import net.sourceforge.pmd.ast.ASTExpression;
7   import net.sourceforge.pmd.ast.ASTMethodDeclaration;
8   import net.sourceforge.pmd.ast.ASTStatementExpression;
9   import net.sourceforge.pmd.ast.ASTVariableDeclarator;
10  import net.sourceforge.pmd.dfa.DataFlowNode;
11  import net.sourceforge.pmd.dfa.IDataFlowNode;
12  import net.sourceforge.pmd.dfa.NodeType;
13  import net.sourceforge.pmd.dfa.StatementAndBraceFinder;
14  import test.net.sourceforge.pmd.testframework.ParserTst;
15  
16  public class StatementAndBraceFinderTest extends ParserTst {
17  
18      public void testStatementExpressionParentChildLinks() throws Throwable {
19          ASTStatementExpression se = (ASTStatementExpression)getOrderedNodes(ASTStatementExpression.class, TEST1).get(0);
20          ASTMethodDeclaration seParent = (ASTMethodDeclaration)((DataFlowNode)se.getDataFlowNode().getParents().get(0)).getSimpleNode();
21          assertEquals(se, ((IDataFlowNode)seParent.getDataFlowNode().getChildren().get(0)).getSimpleNode());
22          assertEquals(seParent, ((IDataFlowNode)se.getDataFlowNode().getParents().get(0)).getSimpleNode());
23      }
24  
25      public void testVariableDeclaratorParentChildLinks() throws Throwable {
26          ASTVariableDeclarator vd = (ASTVariableDeclarator)getOrderedNodes(ASTVariableDeclarator.class, TEST2).get(0);
27          ASTMethodDeclaration vdParent = (ASTMethodDeclaration)((DataFlowNode)vd.getDataFlowNode().getParents().get(0)).getSimpleNode();
28          assertEquals(vd, ((IDataFlowNode)vdParent.getDataFlowNode().getChildren().get(0)).getSimpleNode());
29          assertEquals(vdParent, ((IDataFlowNode)vd.getDataFlowNode().getParents().get(0)).getSimpleNode());
30      }
31  
32      public void testIfStmtHasCorrectTypes() throws Throwable {
33          ASTExpression exp = (ASTExpression)getOrderedNodes(ASTExpression.class, TEST3).get(0);
34          IDataFlowNode dfn = (IDataFlowNode)exp.getDataFlowNode().getFlow().get(2);
35          assertTrue(dfn.isType(NodeType.IF_EXPR));
36          assertTrue(dfn.isType(NodeType.IF_LAST_STATEMENT_WITHOUT_ELSE));
37      }
38  
39      public void testWhileStmtHasCorrectTypes() throws Throwable {
40          ASTExpression exp = (ASTExpression)getOrderedNodes(ASTExpression.class, TEST4).get(0);
41          IDataFlowNode dfn = (IDataFlowNode)exp.getDataFlowNode().getFlow().get(2);
42          assertTrue(dfn.isType(NodeType.WHILE_EXPR));
43          assertTrue(dfn.isType(NodeType.WHILE_LAST_STATEMENT));
44      }
45  
46      public void testForStmtHasCorrectTypes() throws Throwable {
47          ASTExpression exp = (ASTExpression)getOrderedNodes(ASTExpression.class, TEST5).get(0);
48          IDataFlowNode dfn = (IDataFlowNode)exp.getDataFlowNode().getFlow().get(2);
49          assertTrue(dfn.isType(NodeType.FOR_INIT));
50          dfn = (IDataFlowNode)exp.getDataFlowNode().getFlow().get(3);
51          assertTrue(dfn.isType(NodeType.FOR_EXPR));
52          dfn = (IDataFlowNode)exp.getDataFlowNode().getFlow().get(4);
53          assertTrue(dfn.isType(NodeType.FOR_UPDATE));
54          assertTrue(dfn.isType(NodeType.FOR_BEFORE_FIRST_STATEMENT));
55          assertTrue(dfn.isType(NodeType.FOR_END));
56      }
57  
58      public void testOnlyWorksForMethodsAndConstructors() {
59          StatementAndBraceFinder sbf = new StatementAndBraceFinder();
60          try {
61              sbf.buildDataFlowFor(new ASTCompilationUnit(1));
62              fail("Should have failed!");
63          } catch (RuntimeException e) {
64              // cool
65          }
66          sbf.buildDataFlowFor(new ASTMethodDeclaration(1));
67          sbf.buildDataFlowFor(new ASTConstructorDeclaration(1));
68      }
69  
70      private static final String TEST1 =
71          "class Foo {" + PMD.EOL +
72          " void bar() {" + PMD.EOL +
73          "  x = 2;" + PMD.EOL +
74          " }" + PMD.EOL +
75          "}";
76  
77      private static final String TEST2 =
78          "class Foo {" + PMD.EOL +
79          " void bar() {" + PMD.EOL +
80          "  int x;" + PMD.EOL +
81          " }" + PMD.EOL +
82          "}";
83  
84      private static final String TEST3 =
85          "class Foo {" + PMD.EOL +
86          " void bar() {" + PMD.EOL +
87          "  if (x) {}" + PMD.EOL +
88          " }" + PMD.EOL +
89          "}";
90  
91      private static final String TEST4 =
92          "class Foo {" + PMD.EOL +
93          " void bar() {" + PMD.EOL +
94          "  while (x) {}" + PMD.EOL +
95          " }" + PMD.EOL +
96          "}";
97  
98      private static final String TEST5 =
99          "class Foo {" + PMD.EOL +
100         " void bar() {" + PMD.EOL +
101         "  for (int i=0; i<10; i++) {}" + PMD.EOL +
102         " }" + PMD.EOL +
103         "}";
104 }