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