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