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