/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.jaxen;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.Iterator;
import java.util.List;
import org.jaxen.BaseXPath;
import org.jaxen.JaxenException;
import org.jaxen.UnsupportedAxisException;
import org.junit.Before;
import org.junit.Test;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.ast.xpath.DocumentNavigator;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
import net.sourceforge.pmd.lang.java.ast.ASTStatement;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
import net.sourceforge.pmd.testframework.RuleTst;
public class DocumentNavigatorTest extends RuleTst {
private TestRule rule;
private class TestRule extends AbstractJavaRule {
private Node compilationUnit;
private Node importDeclaration;
private Node statement;
private Node primaryPrefix;
private Node primaryExpression;
/**
* @see net.sourceforge.pmd.lang.java.ast.JavaParserVisitor#visit(ASTCompilationUnit,
* Object)
*/
public Object visit(ASTCompilationUnit node, Object data) {
this.compilationUnit = node;
return super.visit(node, data);
}
public Object visit(ASTImportDeclaration node, Object data) {
this.importDeclaration = node;
return super.visit(node, data);
}
public Object visit(ASTStatement node, Object data) {
this.statement = node;
return super.visit(node, data);
}
public Object visit(ASTPrimaryPrefix node, Object data) {
this.primaryPrefix = node;
return super.visit(node, data);
}
public Object visit(ASTPrimaryExpression node, Object data) {
this.primaryExpression = node;
return super.visit(node, data);
}
}
@Before
public void setUp() throws Exception {
try {
rule = new TestRule();
runTestFromString(TEST, rule, new Report(),
LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion());
} catch (Throwable xx) {
xx.printStackTrace();
fail();
}
}
@Test
public void testChildAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getChildAxisIterator(rule.compilationUnit);
assertSame(rule.compilationUnit.jjtGetChild(0), iter.next());
assertSame(rule.compilationUnit.jjtGetChild(1), iter.next());
assertFalse(iter.hasNext());
}
@Test
public void testParentAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getParentAxisIterator(rule.importDeclaration);
assertSame(rule.importDeclaration.jjtGetParent(), iter.next());
assertFalse(iter.hasNext());
}
@Test
public void testParentAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getParentAxisIterator(rule.compilationUnit);
assertFalse(iter.hasNext());
}
@Test
public void testDescendantAxisIterator() throws UnsupportedAxisException {
DocumentNavigator nav = new DocumentNavigator();
Iterator<?> iter = nav.getDescendantAxisIterator(rule.statement);
Node statementExpression = rule.statement.jjtGetChild(0);
assertSame(statementExpression, iter.next());
Node primaryExpression = statementExpression.jjtGetChild(0);
assertSame(primaryExpression, iter.next());
Node primaryPrefix = primaryExpression.jjtGetChild(0);
assertSame(primaryPrefix, iter.next());
Node primarySuffix = primaryExpression.jjtGetChild(1);
// assertSame(primarySuffix, iter.next());
Node name = primaryPrefix.jjtGetChild(0);
// assertSame(name, iter.next());
Node arguments = primarySuffix.jjtGetChild(0);
// assertSame(arguments, iter.next());
// assertFalse(iter.hasNext());
}
@Test
public void testDescendantAxisIterator2() throws UnsupportedAxisException {
DocumentNavigator nav = new DocumentNavigator();
Iterator<?> iter = nav.getDescendantAxisIterator(rule.primaryPrefix);
Node name = rule.primaryPrefix.jjtGetChild(0);
assertSame(name, iter.next());
assertFalse(iter.hasNext());
}
@Test
public void testFollowingSiblingAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
assertSame(rule.primaryExpression.jjtGetChild(1), iter.next());
assertFalse(iter.hasNext());
}
@Test
public void testFollowingSiblingAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getFollowingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
assertFalse(iter.hasNext());
}
@Test
public void testPrecedingSiblingAxisIterator() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(1));
assertSame(rule.primaryExpression.jjtGetChild(0), iter.next());
assertFalse(iter.hasNext());
}
@Test
public void testPrecedingSiblingAxisIterator2() {
DocumentNavigator nav = new DocumentNavigator();
Iterator<Node> iter = nav.getPrecedingSiblingAxisIterator(rule.primaryExpression.jjtGetChild(0));
assertFalse(iter.hasNext());
}
@Test
public void testXPath() throws JaxenException {
BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
List<?> matches = xPath.selectNodes(rule.statement);
assertEquals(6, matches.size());
}
@Test
public void testXPath2() throws JaxenException {
BaseXPath xPath = new BaseXPath(".//*", new DocumentNavigator());
List<?> matches = xPath.selectNodes(rule.importDeclaration);
assertEquals(1, matches.size());
}
public static final String TEST = "import java.io.*;" + PMD.EOL + "public class Foo {" + PMD.EOL + " public Foo() {"
+ PMD.EOL + " try {" + PMD.EOL + " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL
+ " } catch (Exception e) {}" + PMD.EOL + " try {" + PMD.EOL
+ " FileReader fr = new FileReader(\"/dev/null\");" + PMD.EOL + " } catch (Exception e) {" + PMD.EOL
+ " e.printStackTrace();" + PMD.EOL + " // this shouldn't show up on the report" + PMD.EOL + " }"
+ PMD.EOL + " }" + PMD.EOL + "}";
}