blob: 664e46e3100808c7181d19ade2158d91d45397f2 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package xmlcursor.xquery.detailed;
import org.apache.xmlbeans.*;
import org.junit.Ignore;
import org.junit.Test;
import test.xbean.xmlcursor.xQueryInput.EmpT;
import tools.util.JarUtil;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class XQueryTest {
@Test
@Ignore("XQuery on Cursor is invalid")
public void testSimple() throws XmlException, IOException {
String xq = "for $e in //employee where $e/name='Bob' return $e ";
String xq1 = "for $e in //employee return $e ";
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlObject o = XmlObject.Factory.parse(input);
XmlCursor c = o.newCursor();
XmlCursor c1 = c.execQuery(xq);
c1.toFirstContentToken();
assertEquals("<employee>\n" +
"\t\t<name>Bob</name>\n" +
"\t\t<ssn>1000</ssn>\n" +
"\t</employee>", c1.xmlText());
XmlObject[] res = o.execQuery(xq);
EmpT employeeType = (EmpT) res[0];
assertEquals("Bob", employeeType.getName());
}
@Test
public void testObjConstruction() throws XmlException, IOException {
String query = JarUtil.getResourceFromJar("xbean/xmlcursor/xquery/Constructor.xq");
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlObject o = XmlObject.Factory.parse(input);
//via Object
XmlObject[] reslt = o.execQuery(query);
assertEquals(3, reslt.length);
assertEquals("<person><name>Bob</name></person>",
reslt[0].xmlText());
assertEquals("<person><name>Beth</name></person>",
reslt[1].xmlText());
assertEquals("<person><name>NotBob</name></person>",
reslt[2].xmlText());
XmlCursor c = o.newCursor();
//via Cursor
/*XmlCursor c1=c.execQuery(query);
c1.toFirstContentToken();
assertEquals("<person><name>Bob</name></person>",
c1.xmlText() );
c1.toNextSibling();
assertEquals("<person><name>Beth</name></person>",
c1.xmlText() );
c1.dispose();
c.dispose();
*/
int i = 0;
while (i++ < 2) {
//via Cursor--new
XmlCursor c1 = c.execQuery(query);
//c.dispose();
assertEquals(XmlCursor.TokenType.STARTDOC, c1.currentTokenType());
assertEquals(XmlCursor.TokenType.START, c1.toNextToken());
assertEquals("<person><name>Bob</name></person>",
c1.xmlText());
// assertTrue(c1.toNextSelection());
assertTrue(c1.toNextSibling());
assertEquals("<person><name>Beth</name></person>",
c1.xmlText());
//assertTrue(c1.toNextSelection());
assertTrue(c1.toNextSibling());
assertEquals("<person><name>NotBob</name></person>",
c1.xmlText());
c1.dispose();
}
c.dispose();
}
@Test
public void testJoin() throws XmlException, IOException {
String query = JarUtil.getResourceFromJar("xbean/xmlcursor/xquery/Join.xq");
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlObject o = XmlObject.Factory.parse(input);
XmlCursor c = o.newCursor();
XmlCursor c1 = c.execQuery(query);
// assertEquals(3, c1.getSelectionCount());
c1.toFirstContentToken();
assertEquals("<result>" +
"<ssn>1000</ssn>,\n" +
"\t\t<name>Bob</name>,\n" +
"\t\t<name>NotBob</name>" +
"</result>",
c1.xmlText());
/* assertEquals("<xml-fragment>" +
"<result>" +
"<ssn>1000</ssn>,\n" +
"\t\t<name>Bob</name>,\n" +
"\t\t<name>NotBob</name>" +
"</result>" +
"<result><ssn>1001</ssn>,\n" +
"\t\t<name>Beth</name>,\n" +
"\t\t</result>" +
"<result><ssn>1000</ssn>,\n" +
"\t\t<name>NotBob</name>,\n" +
"\t\t<name>Bob</name>" +
"</result>" +
"</xml-fragment>",
c1.xmlText() ); */
c1.dispose();
c.dispose();
XmlObject[] res = o.execQuery(query);
assertEquals(3, res.length);
}
@Test
public void testTextSequenceRootObject() throws XmlException, IOException {
//String query = "$this//text()";
String query = ".//text()";
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlObject o = XmlObject.Factory.parse(input);
XmlObject[] res = o.execQuery(query);
assertEquals(19, res.length);
input.close();
}
@Test
@Ignore("Cursor support for //text() is invalid")
public void testTextSequenceRootCursor() throws XmlException, IOException {
String query = ".//text()";
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlObject o = XmlObject.Factory.parse(input);
XmlCursor c = o.newCursor();
XmlCursor c1 = c.execQuery(query);
assertEquals(XmlCursor.TokenType.TEXT,c1.toNextToken());
// assertEquals()
//assertEquals(19, c1.getSelectionCount());
c.dispose();//make sure this doesn't screw things up
while (c1.toNextSibling())
assertEquals(XmlCursor.TokenType.TEXT, c1.currentTokenType());
c1.toStartDoc();
assertEquals("<xml-fragment>Bob</xml-fragment>",
c1.xmlText());
c1.dispose();
c.dispose();
}
@Test
@Ignore("still bugged")
public void testDocumentFunc() throws XmlException, IOException {
//String query = "<result>{$this},{count(//employee)}</result>";
String query = "<result>{.},{count(//employee)}</result>";
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlCursor c = XmlObject.Factory.parse(input).newCursor();
XmlCursor c1 = c.execQuery(query);
assertEquals("",
c1.xmlText());
c1.dispose();
c.dispose();
}
@Test
public void testTextAtOddPlaces() throws Exception {
//String query = "<result>{$this},{count(//employee)}</result>";
String query = "<result>{.},{count(//employee)}</result>";
String input = "<foo><a><b>text</b>more text</a></foo>";
XmlObject o = XmlObject.Factory.parse(input);
XmlCursor c = o.newCursor();
XmlObject[] res = o.execQuery("//a");
assertEquals("<a><b>text</b>more text</a>", res[0].xmlText());
XmlCursor cur = c.execQuery("//a");
// assertEquals(1, cur.getSelectionCount());
cur.toFirstContentToken();
assertEquals("<a><b>text</b>more text</a>", cur.xmlText());
}
@Test
@Ignore
public void testMultiDocJoin() throws XmlException, IOException {
String query = JarUtil.getResourceFromJar("xbean/xmlcursor/xquery/2DocJoin.xq");
InputStream input = JarUtil.getResourceFromJarasStream("xbean/xmlcursor/XQueryInput.xml");
XmlCursor c = XmlObject.Factory.parse(input).newCursor();
XmlCursor c1 = c.execQuery(query);
assertEquals("",
c1.xmlText());
c1.dispose();
c.dispose();
}
@Test
public void testFunction() throws Exception {
String query =
" declare function local:summary($emps as element(employee)*) \n" +
" as element(dept)*\n" +
"{\n" +
" for $d in fn:distinct-values($emps/deptno)\n" +
" let $e := $emps[deptno = $d]\n" +
" return\n" +
" <dept>\n" +
" <deptno>{$d}</deptno>\n" +
" <headcount> {fn:count($e)} </headcount>\n" +
" <payroll> {fn:sum($e/salary)} </payroll>\n" +
" </dept>\n" +
"};\n" +
"\n" +
//"local:summary($this//employee[location = \"Denver\"])";
"local:summary(.//employee[location = \"Denver\"])";
String xml =
" <list>" +
"<employee>" +
"<location>Denver</location>" +
"<deptno>7</deptno>" +
"<salary>20</salary>" +
"</employee>" +
"<employee>" +
"<location>Seattle</location>" +
"<deptno>6</deptno>" +
"<salary>30</salary>" +
"</employee>" +
"<employee>" +
"<location>Denver</location>" +
"<deptno>5</deptno>" +
"<salary>40</salary>" +
"</employee>" +
"<employee>" +
"<location>Denver</location>" +
"<deptno>7</deptno>" +
"<salary>10</salary>" +
"</employee>" +
"</list>";
XmlObject o = XmlObject.Factory.parse(xml);
XmlObject[] res = o.execQuery(query);
assertEquals(2, res.length);
assertEquals("<dept><deptno>7</deptno><headcount>2</headcount><payroll>30</payroll></dept>",
res[0].xmlText());
assertEquals("<dept><deptno>5</deptno><headcount>1</headcount><payroll>40</payroll></dept>",
res[1].xmlText());
XmlCursor c = o.newCursor();
XmlCursor c1 = c.execQuery(query);
c1.toFirstContentToken();
assertEquals(res[0].xmlText(),
c1.xmlText());
c1.dispose();
c.dispose();
}
@Test
public void testType() throws Exception {
String xml = "<a><b></b><b></b></a>";
String query = "count(//b)";
XmlObject o = XmlObject.Factory.parse(xml);
XmlObject[] res = o.execQuery(query);
XmlLong result = (XmlLong) res[0];
assertEquals("2", result.getStringValue());
assertEquals(2, result.getLongValue());
}
@Test
public void testQueryComment() throws Exception {
String xml = "<a><b></b><b></b></a>";
String query = "(:comment:) count(//b)";
XmlObject o = XmlObject.Factory.parse(xml);
XmlObject[] res = o.execQuery(query);
XmlLong result = (XmlLong) res[0];
assertEquals("2", result.getStringValue());
assertEquals(2, result.getLongValue());
}
@Test
@Ignore
public void testStandaloneFunction() throws Exception {
String query =
"<results>\n" +
" {fn:not(xs:unsignedShort(\"65535\"))}\n" +
" </results>";
XmlObject o = XmlObject.Factory.newInstance();
XmlObject[] res = o.execQuery(query);
XmlLong result = (XmlLong) res[0];
assertEquals("2", result.getStringValue());
assertEquals(2, result.getLongValue());
}
}