package org.basex.query;
import static org.junit.Assert.*;
import org.basex.*;
import org.basex.core.cmd.*;
import org.basex.io.*;
import org.basex.query.util.*;
import org.basex.query.value.item.*;
import org.basex.util.*;
import org.junit.Test;
/**
* Module tests.
*
* @author BaseX Team 2005-17, BSD License
* @author Leo Woerteler
*/
public final class ModuleTest extends SandboxTest {
/**
* Imports a built-in module.
*/
@Test
public void builtIn() {
query("import module namespace xquery = 'http://basex.org/modules/xquery'; 1");
}
/**
* Tests the {@link QueryContext#parseLibrary} method.
*/
@Test
public void module() {
try(QueryContext qc = new QueryContext(context)) {
qc.parseLibrary("module namespace m='foo'; declare function m:foo() { m:bar() }; ", "", null);
fail("Unknown function 'm:bar()' was not detected.");
} catch(final QueryException e) {
assertSame(QueryError.WHICHFUNC_X, e.error());
}
}
/**
* Tests the {@link QueryContext#parseLibrary} method.
* @throws Exception exception
*/
@Test
public void module2() throws Exception {
final IOFile a = new IOFile("src/test/resources/recmod/a.xqm");
try(QueryContext qc = new QueryContext(context)) {
qc.parseLibrary(Token.string(a.read()), a.path(), null);
}
}
/**
* Tests a repository import.
* @throws Exception exception
*/
@Test
public void repoFile() throws Exception {
// repository files
final IOFile repo = new IOFile(sandbox(), "repo");
repo.md();
write(new IOFile(repo, "a.xqm"), "module namespace a='a'; declare function a:a(){()};");
try(QueryContext qc = new QueryContext(context)) {
qc.parseMain("import module namespace a='a'; a:a()", null, null);
}
}
/**
* Tests circular dependencies.
* @throws Exception exception
*/
@Test
public void circularDeps() throws Exception {
// module files in same directory
final IOFile sandbox = sandbox();
final IOFile file = new IOFile(sandbox, "x.xq");
write(file, "import module namespace a='a'at'a.xqm'; ()");
write(new IOFile(sandbox, "a.xqm"), "module namespace a='a';"
+ "import module namespace b='b' at 'b.xqm'; declare function a:a(){()};");
write(new IOFile(sandbox, "b.xqm"), "module namespace b='b';"
+ "import module namespace a='a' at 'a.xqm'; declare function b:b(){a:a()};");
execute(new Run(file.path()));
// repository files
final IOFile repo = new IOFile(sandbox, "repo");
repo.md();
write(new IOFile(repo, "a.xqm"), "module namespace a='a';"
+ "import module namespace b='b'; declare function a:a(){()};");
write(new IOFile(repo, "b.xqm"), "module namespace b='b';"
+ "import module namespace a='a'; declare function b:b(){a:a()};");
try(QueryContext qc = new QueryContext(context)) {
qc.parseMain("import module namespace a='a'; ()", null, null);
}
}
/**
* Uses a URI resolver.
* @throws Exception exception
*/
@Test
public void uriResolver() throws Exception {
final String query = "import module namespace m='uri' at 'x.xq'; m:f()";
try(QueryProcessor qp = new QueryProcessor(query, context)) {
qp.uriResolver(new UriResolver() {
@Override
public IO resolve(final String path, final String uri, final Uri base) {
return new IOContent("module namespace m='uri'; declare function m:f() { 'OK' };");
}
});
assertEquals(qp.value().serialize().toString(), "OK");
}
}
}