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 }