[340934] Migrate XPath2 test suite to new API
Add tests for new API features
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java
index 2137c4e..8c347a1 100644
--- a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java
+++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/AbstractPsychoPathTest.java
@@ -399,7 +399,7 @@
 		
 	}
 
-	private XPath2Expression newXPath = null;
+	protected XPath2Expression newXPath = null;
 	private XPath oldXPath = null;
 	
 	protected XPath compileXPath( String xpath) throws XPathParserException, StaticError {
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java
index a021667..73496bc 100644
--- a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java
+++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java
@@ -62,7 +62,9 @@
 
 import java.math.BigInteger;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.Comparator;
+import java.util.TreeSet;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -73,7 +75,9 @@
 import org.eclipse.wst.xml.xpath2.processor.DynamicError;
 import org.eclipse.wst.xml.xpath2.processor.ResultSequence;
 import org.eclipse.wst.xml.xpath2.processor.ResultSequenceFactory;
+import org.eclipse.wst.xml.xpath2.processor.StaticError;
 import org.eclipse.wst.xml.xpath2.processor.XPathParserException;
+import org.eclipse.wst.xml.xpath2.processor.function.FnFunctionLibrary;
 import org.eclipse.wst.xml.xpath2.processor.internal.types.XSBoolean;
 import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDecimal;
 import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDouble;
@@ -2096,6 +2100,112 @@
 		   assertTrue(false);
 		}
 	}
+
+	public void testExprParsingBeginnigWithRootNode_new_API_bug338494() throws Exception {
+		useNewApi = true;
+		
+		// Bug 338494
+		bundle = Platform.getBundle("org.w3c.xqts.testsuite");
+		URL fileURL = bundle.getEntry("/TestSources/emptydoc.xml");
+		loadDOMDocument(fileURL);
+
+		// Get XML Schema Information for the Document
+		XSModel schema = getGrammar();
+		setupDynamicContext(schema);
+
+		// test simple case
+	    compileXPath("x/y//z");
+	    assertFalse("Not navigating to root", newXPath.isRootPathUsed());
+
+	    // test a)
+	    compileXPath("/a");
+	    assertTrue("/a means a at root, so root path should be true", newXPath.isRootPathUsed());
+
+	    // test b)
+	    compileXPath("//x");
+	    assertTrue("//x means x anywhere under root, so root path should be true", newXPath.isRootPathUsed());		    
+
+		// test c)
+	    compileXPath("/");
+	    assertTrue("/ is root, so root path should be true", newXPath.isRootPathUsed());		    
+		
+		// test d)
+	    compileXPath("x/y[/a]");
+	    assertTrue("a predicate refers to root, so root path should be true", newXPath.isRootPathUsed());		    
+
+	    // test e)
+	    compileXPath(".//x");
+	    assertFalse(".//x is just relative, so root path should be false", newXPath.isRootPathUsed());		    
+	}
+
+	public void testExpression_variables_API() throws Exception {
+		useNewApi = true;
+		setupDynamicContext(null);
+		
+		setVariable("x", ResultSequenceFactory.create_new());
+		String xpath = "count(subsequence($x/parent::*, 2)) eq (for $y in (1) return $y+1)";
+		compileXPath(xpath);
+	    assertTrue(newXPath.getFreeVariables().contains(new javax.xml.namespace.QName("x")));		    
+	    assertFalse(newXPath.getFreeVariables().contains(new javax.xml.namespace.QName("y")));		    
+	}
+
+	public void testExpression_functions_API() throws Exception {
+		useNewApi = true;
+		setupDynamicContext(null);
+		
+		String xpath = "count(subsequence(parent::*, 2)) eq (for $y in (1) return $y+1)";
+		compileXPath(xpath);
+	    javax.xml.namespace.QName fnCount = new javax.xml.namespace.QName(FnFunctionLibrary.XPATH_FUNCTIONS_NS, "count");
+
+	    assertTrue(newXPath.getResolvedFunctions().contains(fnCount));
+	    javax.xml.namespace.QName fnSubsequence = new javax.xml.namespace.QName(FnFunctionLibrary.XPATH_FUNCTIONS_NS, "subsequence");
+		
+	    assertTrue(newXPath.getResolvedFunctions().contains(fnSubsequence));
+	    assertEquals(2, newXPath.getResolvedFunctions().size());		    
+	}
+	
+	public void testNamespaceAxis() {
+		setupDynamicContext(null);
+		
+		String xpath = "count(namespace::*)";
+		try {
+			compileXPath(xpath);
+			fail("This should have failed since we don't support the namespace axis");
+		} catch (StaticError se) {
+			assertEquals("XPST0010", se.code());
+		}
+	}
+	
+	public void testExpression_axis_API() throws Exception {
+		useNewApi = true;
+		setupDynamicContext(null);
+		
+		String xpath = "count(subsequence(./parent::*, 2)) + count(ancestor-or-self::*)";
+		compileXPath(xpath);
+	    assertTrue(newXPath.getAxes().contains("parent"));		    
+	    assertTrue(newXPath.getAxes().contains("ancestor-or-self"));		    
+	    assertEquals(2, newXPath.getAxes().size());
+
+	    xpath = "(child::*, descendant::*, attribute::*, self::*, descendant-or-self::*, following-sibling::*,  following::*, parent::*," +
+	    "ancestor::*, preceding-sibling::*, preceding::*, ancestor-or-self::*)";
+
+	    compileXPath(xpath);
+	    assertEquals(new TreeSet(Arrays.asList(new Object[] {
+	    "child",
+	    "descendant",
+	    "attribute",
+	    "self",
+	    "descendant-or-self",
+
+	    "following-sibling",
+	    "following",
+	    "parent",
+
+	    "ancestor",
+	    "preceding-sibling",
+	    "preceding",
+	    "ancestor-or-self" })), newXPath.getAxes());
+	}
 	
 	public void testBug338999_Fnsubsequence() throws Exception {
 		// bug 338999