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 }