View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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           * @see net.sourceforge.pmd.lang.java.ast.JavaParserVisitor#visit(ASTCompilationUnit, Object)
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 //        assertSame(primarySuffix, iter.next());
125         Node name = primaryPrefix.jjtGetChild(0);
126 //        assertSame(name, iter.next());
127         Node arguments = primarySuffix.jjtGetChild(0);
128 //        assertSame(arguments, iter.next());
129 //        assertFalse(iter.hasNext());
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 }