1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package test.net.sourceforge.pmd.jaxen;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.PMD;
8 import net.sourceforge.pmd.Report;
9 import net.sourceforge.pmd.ast.ASTCompilationUnit;
10 import net.sourceforge.pmd.ast.ASTImportDeclaration;
11 import net.sourceforge.pmd.ast.ASTPrimaryExpression;
12 import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
13 import net.sourceforge.pmd.ast.ASTStatement;
14 import net.sourceforge.pmd.ast.Node;
15 import net.sourceforge.pmd.jaxen.DocumentNavigator;
16 import org.jaxen.BaseXPath;
17 import org.jaxen.JaxenException;
18 import org.jaxen.UnsupportedAxisException;
19 import test.net.sourceforge.pmd.testframework.RuleTst;
20
21 import java.util.Iterator;
22 import java.util.List;
23
24 public class DocumentNavigatorTest extends RuleTst {
25
26
27 private TestRule rule;
28
29 private class TestRule extends AbstractRule {
30
31 private Node compilationUnit;
32 private Node importDeclaration;
33 private Node statement;
34 private Node primaryPrefix;
35 private Node primaryExpression;
36
37 /***
38 * @see net.sourceforge.pmd.ast.JavaParserVisitor#visit(ASTCompilationUnit, Object)
39 */
40 public Object visit(ASTCompilationUnit node, Object data) {
41 this.compilationUnit = node;
42 return super.visit(node, data);
43 }
44
45 public Object visit(ASTImportDeclaration node, Object data) {
46 this.importDeclaration = node;
47 return super.visit(node, data);
48 }
49
50 public Object visit(ASTStatement node, Object data) {
51 this.statement = node;
52 return super.visit(node, data);
53 }
54
55 public Object visit(ASTPrimaryPrefix node, Object data) {
56 this.primaryPrefix = node;
57 return super.visit(node, data);
58 }
59
60 public Object visit(ASTPrimaryExpression node, Object data) {
61 this.primaryExpression = node;
62 return super.visit(node, data);
63 }
64 }
65
66 public void setUp() throws Exception {
67 try {
68 rule = new TestRule();
69 runTestFromString(TEST, rule, new Report());
70 } catch (Throwable xx) {
71 xx.printStackTrace();
72 fail();
73 }
74 }
75
76 public void testChildAxisIterator() {
77 DocumentNavigator nav = new DocumentNavigator();
78 Iterator iter = nav.getChildAxisIterator(rule.compilationUnit);
79 assertSame(rule.compilationUnit.jjtGetChild(0), iter.next());
80 assertSame(rule.compilationUnit.jjtGetChild(1), iter.next());
81 assertFalse(iter.hasNext());
82 }
83
84 public void testParentAxisIterator() {
85 DocumentNavigator nav = new DocumentNavigator();
86 Iterator iter = nav.getParentAxisIterator(rule.importDeclaration);
87 assertSame(rule.importDeclaration.jjtGetParent(), iter.next());
88 assertFalse(iter.hasNext());
89 }
90
91 public void testParentAxisIterator2() {
92 DocumentNavigator nav = new DocumentNavigator();
93 Iterator iter = nav.getParentAxisIterator(rule.compilationUnit);
94 assertFalse(iter.hasNext());
95 }
96
97 public void testDescendantAxisIterator() throws UnsupportedAxisException {
98 DocumentNavigator nav = new DocumentNavigator();
99 Iterator iter = nav.getDescendantAxisIterator(rule.statement);
100 Node statementExpression = rule.statement.jjtGetChild(0);
101 assertSame(statementExpression, iter.next());
102 Node primaryExpression = statementExpression.jjtGetChild(0);
103 assertSame(primaryExpression, iter.next());
104 Node primaryPrefix = primaryExpression.jjtGetChild(0);
105 assertSame(primaryPrefix, iter.next());
106 Node primarySuffix = primaryExpression.jjtGetChild(1);
107
108 Node name = primaryPrefix.jjtGetChild(0);
109
110 Node arguments = primarySuffix.jjtGetChild(0);
111
112
113 }
114
115 public void testDescendantAxisIterator2() throws UnsupportedAxisException {
116 DocumentNavigator nav = new DocumentNavigator();
117 Iterator iter = nav.getDescendantAxisIterator(rule.primaryPrefix);
118 Node name = rule.primaryPrefix.jjtGetChild(0);
119 assertSame(name, iter.next());
120 assertFalse(iter.hasNext());
121 }
122
123 public void testFollowingSiblingAxisIterator() {
124 DocumentNavigator nav = new DocumentNavigator();
125 Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
126 assertSame(rule.primaryExpression.jjtGetChild(1), iter.next());
127 assertFalse(iter.hasNext());
128 }
129
130 public void testFollowingSiblingAxisIterator2() {
131 DocumentNavigator nav = new DocumentNavigator();
132 Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
133 assertFalse(iter.hasNext());
134 }
135
136 public void testPrecedingSiblingAxisIterator() {
137 DocumentNavigator nav = new DocumentNavigator();
138 Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
139 assertSame(rule.primaryExpression.jjtGetChild(0), iter.next());
140 assertFalse(iter.hasNext());
141 }
142
143 public void testPrecedingSiblingAxisIterator2() {
144 DocumentNavigator nav = new DocumentNavigator();
145 Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
146 assertFalse(iter.hasNext());
147 }
148
149 public void testXPath() throws JaxenException {
150 BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
151 List matches = xPath.selectNodes(rule.statement);
152 assertEquals(6, matches.size());
153 }
154
155 public void testXPath2() throws JaxenException {
156 BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
157 List matches = xPath.selectNodes(rule.importDeclaration);
158 assertEquals(1, matches.size());
159 }
160
161
162 public static final String TEST =
163 "import java.io.*;" + PMD.EOL +
164 "public class Foo {" + PMD.EOL +
165 " public Foo() {" + PMD.EOL +
166 " try {" + PMD.EOL +
167 " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL +
168 " } catch (Exception e) {}" + PMD.EOL +
169 " try {" + PMD.EOL +
170 " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL +
171 " } catch (Exception e) {" + PMD.EOL +
172 " e.printStackTrace();" + PMD.EOL +
173 " // this shouldn't show up on the report" + PMD.EOL +
174 " }" + PMD.EOL +
175 " }" + PMD.EOL +
176 "}";
177 }