| /* 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()); | |
| } | |
| } |