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 }