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 public Object visit(ASTImportDeclaration node, Object data) {
45 this.importDeclaration = node;
46 return super.visit(node, data);
47 }
48 public Object visit(ASTStatement node, Object data) {
49 this.statement = node;
50 return super.visit(node, data);
51 }
52 public Object visit(ASTPrimaryPrefix node, Object data) {
53 this.primaryPrefix = node;
54 return super.visit(node, data);
55 }
56 public Object visit(ASTPrimaryExpression node, Object data) {
57 this.primaryExpression = node;
58 return super.visit(node, data);
59 }
60 }
61
62 public void setUp() throws Exception {
63 try{
64 rule = new TestRule();
65 runTestFromString(TEST, rule, new Report());
66 } catch (Throwable xx) {
67 xx.printStackTrace();
68 fail();
69 }
70 }
71
72 public void testChildAxisIterator() {
73 DocumentNavigator nav = new DocumentNavigator();
74 Iterator iter =nav.getChildAxisIterator(rule.compilationUnit);
75 assertSame(rule.compilationUnit.jjtGetChild(0), iter.next());
76 assertSame(rule.compilationUnit.jjtGetChild(1), iter.next());
77 assertFalse(iter.hasNext());
78 }
79
80 public void testParentAxisIterator() {
81 DocumentNavigator nav = new DocumentNavigator();
82 Iterator iter =nav.getParentAxisIterator(rule.importDeclaration);
83 assertSame(rule.importDeclaration.jjtGetParent(), iter.next());
84 assertFalse(iter.hasNext());
85 }
86
87 public void testParentAxisIterator2() {
88 DocumentNavigator nav = new DocumentNavigator();
89 Iterator iter =nav.getParentAxisIterator(rule.compilationUnit);
90 assertFalse(iter.hasNext());
91 }
92
93 public void testDescendantAxisIterator() throws UnsupportedAxisException {
94 DocumentNavigator nav = new DocumentNavigator();
95 Iterator iter = nav.getDescendantAxisIterator(rule.statement);
96 Node statementExpression = rule.statement.jjtGetChild(0);
97 assertSame(statementExpression, iter.next());
98 Node primaryExpression = statementExpression.jjtGetChild(0);
99 assertSame(primaryExpression, iter.next());
100 Node primaryPrefix = primaryExpression.jjtGetChild(0);
101 assertSame(primaryPrefix, iter.next());
102 Node primarySuffix = primaryExpression.jjtGetChild(1);
103
104 Node name = primaryPrefix.jjtGetChild(0);
105
106 Node arguments = primarySuffix.jjtGetChild(0);
107
108
109 }
110
111 public void testDescendantAxisIterator2() throws UnsupportedAxisException {
112 DocumentNavigator nav = new DocumentNavigator();
113 Iterator iter = nav.getDescendantAxisIterator(rule.primaryPrefix);
114 Node name = rule.primaryPrefix.jjtGetChild(0);
115 assertSame(name, iter.next());
116 assertFalse(iter.hasNext());
117 }
118
119 public void testFollowingSiblingAxisIterator() {
120 DocumentNavigator nav = new DocumentNavigator();
121 Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
122 assertSame(rule.primaryExpression.jjtGetChild(1), iter.next());
123 assertFalse(iter.hasNext());
124 }
125
126 public void testFollowingSiblingAxisIterator2() {
127 DocumentNavigator nav = new DocumentNavigator();
128 Iterator iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
129 assertFalse(iter.hasNext());
130 }
131
132 public void testPrecedingSiblingAxisIterator() {
133 DocumentNavigator nav = new DocumentNavigator();
134 Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
135 assertSame(rule.primaryExpression.jjtGetChild(0), iter.next());
136 assertFalse(iter.hasNext());
137 }
138
139 public void testPrecedingSiblingAxisIterator2() {
140 DocumentNavigator nav = new DocumentNavigator();
141 Iterator iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
142 assertFalse(iter.hasNext());
143 }
144
145 public void testXPath() throws JaxenException {
146 BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
147 List matches = xPath.selectNodes(rule.statement);
148 assertEquals(6, matches.size());
149 }
150
151 public void testXPath2() throws JaxenException {
152 BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
153 List matches = xPath.selectNodes(rule.importDeclaration);
154 assertEquals(1, matches.size());
155 }
156
157
158 public static final String TEST =
159 "import java.io.*;" + PMD.EOL +
160 "public class Foo {" + PMD.EOL +
161 " public Foo() {" + PMD.EOL +
162 " try {" + PMD.EOL +
163 " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL +
164 " } catch (Exception e) {}" + PMD.EOL +
165 " try {" + PMD.EOL +
166 " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL +
167 " } catch (Exception e) {" + PMD.EOL +
168 " e.printStackTrace();" + PMD.EOL +
169 " // this shouldn't show up on the report" + PMD.EOL +
170 " }" + PMD.EOL +
171 " }" + PMD.EOL +
172 "}";}