001: package test.net.sourceforge.pmd.dfa;
002:
003: import org.junit.Test;
004: import static org.junit.Assert.*;
005:
006: import net.sourceforge.pmd.PMD;
007: import net.sourceforge.pmd.ast.ASTCompilationUnit;
008: import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
009: import net.sourceforge.pmd.ast.ASTExpression;
010: import net.sourceforge.pmd.ast.ASTMethodDeclaration;
011: import net.sourceforge.pmd.ast.ASTStatementExpression;
012: import net.sourceforge.pmd.ast.ASTVariableDeclarator;
013: import net.sourceforge.pmd.dfa.DataFlowNode;
014: import net.sourceforge.pmd.dfa.IDataFlowNode;
015: import net.sourceforge.pmd.dfa.NodeType;
016: import net.sourceforge.pmd.dfa.StatementAndBraceFinder;
017: import test.net.sourceforge.pmd.testframework.ParserTst;
018:
019: public class StatementAndBraceFinderTest extends ParserTst {
020:
021: @Test
022: public void testStatementExpressionParentChildLinks()
023: throws Throwable {
024: ASTStatementExpression se = getOrderedNodes(
025: ASTStatementExpression.class, TEST1).get(0);
026: ASTMethodDeclaration seParent = (ASTMethodDeclaration) ((DataFlowNode) se
027: .getDataFlowNode().getParents().get(0)).getSimpleNode();
028: assertEquals(se, ((IDataFlowNode) seParent.getDataFlowNode()
029: .getChildren().get(0)).getSimpleNode());
030: assertEquals(seParent, ((IDataFlowNode) se.getDataFlowNode()
031: .getParents().get(0)).getSimpleNode());
032: }
033:
034: @Test
035: public void testVariableDeclaratorParentChildLinks()
036: throws Throwable {
037: ASTVariableDeclarator vd = getOrderedNodes(
038: ASTVariableDeclarator.class, TEST2).get(0);
039: ASTMethodDeclaration vdParent = (ASTMethodDeclaration) ((DataFlowNode) vd
040: .getDataFlowNode().getParents().get(0)).getSimpleNode();
041: assertEquals(vd, ((IDataFlowNode) vdParent.getDataFlowNode()
042: .getChildren().get(0)).getSimpleNode());
043: assertEquals(vdParent, ((IDataFlowNode) vd.getDataFlowNode()
044: .getParents().get(0)).getSimpleNode());
045: }
046:
047: @Test
048: public void testIfStmtHasCorrectTypes() throws Throwable {
049: ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST3)
050: .get(0);
051: IDataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
052: assertTrue(dfn.isType(NodeType.IF_EXPR));
053: assertTrue(dfn.isType(NodeType.IF_LAST_STATEMENT_WITHOUT_ELSE));
054: }
055:
056: @Test
057: public void testWhileStmtHasCorrectTypes() throws Throwable {
058: ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST4)
059: .get(0);
060: IDataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
061: assertTrue(dfn.isType(NodeType.WHILE_EXPR));
062: assertTrue(dfn.isType(NodeType.WHILE_LAST_STATEMENT));
063: }
064:
065: @Test
066: public void testForStmtHasCorrectTypes() throws Throwable {
067: ASTExpression exp = getOrderedNodes(ASTExpression.class, TEST5)
068: .get(0);
069: IDataFlowNode dfn = exp.getDataFlowNode().getFlow().get(2);
070: assertTrue(dfn.isType(NodeType.FOR_INIT));
071: dfn = exp.getDataFlowNode().getFlow().get(3);
072: assertTrue(dfn.isType(NodeType.FOR_EXPR));
073: dfn = exp.getDataFlowNode().getFlow().get(4);
074: assertTrue(dfn.isType(NodeType.FOR_UPDATE));
075: assertTrue(dfn.isType(NodeType.FOR_BEFORE_FIRST_STATEMENT));
076: assertTrue(dfn.isType(NodeType.FOR_END));
077: }
078:
079: @Test(expected=RuntimeException.class)
080: public void testOnlyWorksForMethodsAndConstructors() {
081: StatementAndBraceFinder sbf = new StatementAndBraceFinder();
082: sbf.buildDataFlowFor(new ASTMethodDeclaration(1));
083: sbf.buildDataFlowFor(new ASTConstructorDeclaration(1));
084: sbf.buildDataFlowFor(new ASTCompilationUnit(1));
085: }
086:
087: private static final String TEST1 = "class Foo {" + PMD.EOL
088: + " void bar() {" + PMD.EOL + " x = 2;" + PMD.EOL + " }"
089: + PMD.EOL + "}";
090:
091: private static final String TEST2 = "class Foo {" + PMD.EOL
092: + " void bar() {" + PMD.EOL + " int x;" + PMD.EOL + " }"
093: + PMD.EOL + "}";
094:
095: private static final String TEST3 = "class Foo {" + PMD.EOL
096: + " void bar() {" + PMD.EOL + " if (x) {}" + PMD.EOL
097: + " }" + PMD.EOL + "}";
098:
099: private static final String TEST4 = "class Foo {" + PMD.EOL
100: + " void bar() {" + PMD.EOL + " while (x) {}" + PMD.EOL
101: + " }" + PMD.EOL + "}";
102:
103: private static final String TEST5 = "class Foo {" + PMD.EOL
104: + " void bar() {" + PMD.EOL
105: + " for (int i=0; i<10; i++) {}" + PMD.EOL + " }"
106: + PMD.EOL + "}";
107:
108: public static junit.framework.Test suite() {
109: return new junit.framework.JUnit4TestAdapter(
110: StatementAndBraceFinderTest.class);
111: }
112: }
|