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