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