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