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