/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.dfa; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.dfa.DataFlowNode; import net.sourceforge.pmd.lang.dfa.NodeType; import net.sourceforge.pmd.lang.java.JavaLanguageModule; import net.sourceforge.pmd.lang.java.ParserTst; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTExpression; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator; public class StatementAndBraceFinderTest extends ParserTst { @Test public void testStatementExpressionParentChildLinks() { ASTStatementExpression se = getOrderedNodes(ASTStatementExpression.class, TEST1).get(0); ASTMethodDeclaration seParent = (ASTMethodDeclaration) se.getDataFlowNode().getParents().get(0).getNode(); assertEquals(se, seParent.getDataFlowNode().getChildren().get(0).getNode()); assertEquals(seParent, se.getDataFlowNode().getParents().get(0).getNode()); } @Test public void testVariableDeclaratorParentChildLinks() { ASTVariableDeclarator vd = getOrderedNodes(ASTVariableDeclarator.class, TEST2).get(0); ASTMethodDeclaration vdParent = (ASTMethodDeclaration) vd.getDataFlowNode().getParents().get(0).getNode(); assertEquals(vd, vdParent.getDataFlowNode().getChildren().get(0).getNode()); assertEquals(vdParent, vd.getDataFlowNode().getParents().get(0).getNode()); } @Test public void testIfStmtHasCorrectTypes() { ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST3).get(0); DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2); assertTrue(dfn.isType(NodeType.IF_EXPR)); assertTrue(dfn.isType(NodeType.IF_LAST_STATEMENT_WITHOUT_ELSE)); } @Test public void testWhileStmtHasCorrectTypes() { ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST4).get(0); DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2); assertTrue(dfn.isType(NodeType.WHILE_EXPR)); assertTrue(dfn.isType(NodeType.WHILE_LAST_STATEMENT)); } @Test public void testForStmtHasCorrectTypes() { ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST5).get(0); DataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2); assertTrue(dfn.isType(NodeType.FOR_INIT)); dfn = exp.getDataFlowNode().getFlow().get(3); assertTrue(dfn.isType(NodeType.FOR_EXPR)); dfn = exp.getDataFlowNode().getFlow().get(4); assertTrue(dfn.isType(NodeType.FOR_UPDATE)); assertTrue(dfn.isType(NodeType.FOR_BEFORE_FIRST_STATEMENT)); assertTrue(dfn.isType(NodeType.FOR_END)); } @Test(expected = RuntimeException.class) public void testOnlyWorksForMethodsAndConstructors() { StatementAndBraceFinder sbf = new StatementAndBraceFinder(LanguageRegistry.getLanguage(JavaLanguageModule.NAME) .getDefaultVersion().getLanguageVersionHandler().getDataFlowHandler()); sbf.buildDataFlowFor(new ASTMethodDeclaration(1)); sbf.buildDataFlowFor(new ASTConstructorDeclaration(1)); sbf.buildDataFlowFor(new ASTCompilationUnit(1)); } private static final String TEST1 = "class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " x = 2;" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String TEST2 = "class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " int x;" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String TEST3 = "class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " if (x) {}" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String TEST4 = "class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " while (x) {}" + PMD.EOL + " }" + PMD.EOL + "}"; private static final String TEST5 = "class Foo {" + PMD.EOL + " void bar() {" + PMD.EOL + " for (int i=0; i<10; i++) {}" + PMD.EOL + " }" + PMD.EOL + "}"; }