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