package org.exist.xquery.functions.util; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import org.exist.storage.DBBroker; import org.exist.xmldb.DatabaseInstanceManager; import org.exist.xmldb.EXistResource; import org.exist.xmldb.LocalXMLResource; import org.exist.xquery.XPathException; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Resource; import org.xmldb.api.modules.XPathQueryService; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; /** * * @author jim.fuller@webcomposite.com */ public class EvalTest { private XPathQueryService service; private Collection root = null; private Database database = null; private Resource invokableQuery; private final static String INVOKABLE_QUERY_FILENAME = "invokable.xql"; private final static String INVOKABLE_QUERY_EXTERNAL_VAR_NAME = "some-value"; public EvalTest() { } @Before public void setUp() throws Exception { // initialize driver Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); root = DatabaseManager.getCollection("xmldb:exist://" + DBBroker.ROOT_COLLECTION, "admin", null); service = (XPathQueryService) root.getService("XQueryService", "1.0"); invokableQuery = root.createResource(INVOKABLE_QUERY_FILENAME, "BinaryResource"); invokableQuery.setContent( "declare variable $" + INVOKABLE_QUERY_EXTERNAL_VAR_NAME + " external;\n" + "<hello>{$" + INVOKABLE_QUERY_EXTERNAL_VAR_NAME + "}</hello>" ); ((EXistResource) invokableQuery).setMimeType("application/xquery"); root.storeResource(invokableQuery); } @After public void tearDown() throws Exception { root.removeResource(invokableQuery); DatabaseManager.deregisterDatabase(database); DatabaseInstanceManager dim = (DatabaseInstanceManager) root.getService("DatabaseInstanceManager", "1.0"); dim.shutdown(); // clear instance variables service = null; root = null; //System.out.println("tearDown PASSED"); } @Test public void testEval() throws XPathException { ResourceSet result = null; String r = ""; try { String query = "let $query := 'let $a := 1 return $a'\n" + "return\n" + "util:eval($query)"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("1", r); } catch (XMLDBException e) { System.out.println("testEval(): " + e); fail(e.getMessage()); } } @Test public void testEvalWithExternalVars() throws XPathException { ResourceSet result = null; String r = ""; try { String query = "let $value := 'world' return\n" + "\tutil:eval(xs:anyURI('/db/" + INVOKABLE_QUERY_FILENAME + "'), false(), (xs:QName('" + INVOKABLE_QUERY_EXTERNAL_VAR_NAME + "'), $value))"; result = service.query(query); LocalXMLResource res = (LocalXMLResource)result.getResource(0); Node n = res.getContentAsDOM(); assertEquals(n.getLocalName(), "hello"); assertEquals("world", n.getFirstChild().getNodeValue()); } catch (XMLDBException e) { System.out.println("testEval(): " + e); fail(e.getMessage()); } } @Test public void testEvalwithPI() throws XPathException { ResourceSet result = null; String r = ""; try { String query = "let $query := 'let $a := <test><?pi test?></test> return count($a//processing-instruction())'\n" + "return\n" + "util:eval($query)"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("1", r); } catch (XMLDBException e) { System.out.println("testEval(): " + e); fail(e.getMessage()); } } @Test public void testEvalInline() throws XPathException { ResourceSet result = null; String r = ""; try { String query = "let $xml := document{<test><a><b/></a></test>}\n" + "let $query := 'count(.//*)'\n" + "return\n" + "util:eval-inline($xml,$query)"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("3", r); } catch (XMLDBException e) { System.out.println("testEvalInline(): " + e); fail(e.getMessage()); } } @Test public void testEvalWithContextVariable() throws XPathException { ResourceSet result = null; String r = ""; try { String query = "let $xml := <test><a/><b/></test>\n" + "let $context := <static-context>\n" + "<variable name='xml'>{$xml}</variable>\n" + "</static-context>\n" + "let $query := 'count($xml//*) mod 2 = 0'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("true", r); } catch (XMLDBException e) { System.out.println("testEvalWithContextVariable(): " + e); fail(e.getMessage()); } } @Test public void testEvalSupplyingContext() throws XPathException { ResourceSet result = null; String r = "test"; try { String query = "let $xml := <test><a/></test>\n" + "let $context := <static-context>\n" + "<default-context>{$xml}</default-context>\n" + "</static-context>\n" + "let $query := 'count(.//*) mod 2 = 0'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("true", r); } catch (XMLDBException e) { System.out.println("testEvalSupplyingContext(): " + e); fail(e.getMessage()); } } @Test public void testEvalSupplyingContextAndVariable() throws XPathException { ResourceSet result = null; String r = "test"; try { String query = "let $xml := <test><a/></test>\n" + "let $context := <static-context>\n" + "<variable name='xml'>{$xml}</variable>\n" + "<default-context>{$xml}</default-context>\n" + "</static-context>\n" + "let $query := 'count($xml//*) + count(.//*)'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; result = service.query(query); r = (String) result.getResource(0).getContent(); assertEquals("3", r); } catch (XMLDBException e) { System.out.println("testEvalSupplyingContextAndVariable(): " + e); fail(e.getMessage()); } } }