    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 }