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