package org.basex.query; import static org.junit.Assert.*; import org.basex.*; import org.basex.util.*; /** * This class contains some methods for performing advanced query tests. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public abstract class AdvancedQueryTest extends SandboxTest { /** * Checks if a query yields the specified string. * @param query query string * @param expected expected query result */ protected static void query(final String query, final Object expected) { final String res = query(query).replaceAll("(\r?\n|\r) *", "\n"); final String exp = expected.toString(); assertEquals("Wrong result:\n[Q] " + query + "\n[E] \u00bb" + exp + "\u00ab\n[F] \u00bb" + res + "\u00ab\n", exp, res); } /** * Creates a transform expression from a given input, modification and return clause. * @param input input XML fragment, target of the updating expression * @param modification updating expression, make sure to address all target nodes via * the $input variable, i.e. delete node $input/a * @param ret return clause * @return the query formulated with a transform expression */ protected static String transform(final String input, final String modification, final String ret) { return "copy $input := " + input + ' ' + "modify (" + modification + ") " + "return (" + (ret.isEmpty() ? "$input" : ret) + ')'; } /** * Creates a transform expression from a given input and modification clause. * * @param input input XML fragment, target of the updating expression * @param modification updating expression, make sure to address all target nodes via * the $input variable, i.e. delete node $input/a * @return the query formulated with a transform expression */ protected static String transform(final String input, final String modification) { return transform(input, modification, ""); } /** * Checks if a query yields the specified result. * @param query query string * @param result query result */ protected static void contains(final String query, final String result) { final String res = normNL(query(query)); if(!res.contains(result)) fail("Result does not contain \"" + result + "\":\n" + query + "\n[E] " + result + "\n[F] " + res); } /** * Checks if a query yields the specified error code. * @param query query string * @param error expected error */ protected static void error(final String query, final QueryError... error) { try { final String res = eval(query); final TokenBuilder tb = new TokenBuilder("Query did not fail:\n"); tb.add(query).add("\n[E] Error: "); for(final QueryError e : error) tb.add(' ').add(e.qname().prefixId()); fail(tb.add("\n[F] ").add(res).toString()); } catch(final QueryIOException ex) { check(query, ex.getCause(), error); } catch(final QueryException ex) { check(query, ex, error); } catch(final Exception ex) { Util.stack(ex); fail("Unexpected exception: " + ex); } } /** * Checks if an exception yields one of the specified error codes. * @param query query * @param ex resulting query exception * @param errors expected errors */ protected static void check(final String query, final QueryException ex, final QueryError... errors) { boolean found = false; final QueryError err = ex.error(); for(final QueryError e : errors) found |= err != null ? err == e : e.qname().eq(ex.qname()); if(!found) { final TokenBuilder tb = new TokenBuilder("\n"); if(query != null) tb.add("Query: ").add(query).add("\n"); tb.add("Error(s): "); if(err != null) { int c = 0; for(final QueryError er : errors) tb.add(c++ == 0 ? "" : "/").add(er.name()); ex.printStackTrace(); fail(tb.add("\nResult: ").add(err.name() + " (" + ex.getLocalizedMessage() + ')'). toString()); } else { int c = 0; for(final QueryError er : errors) tb.add(c++ == 0 ? "" : "/").add(er.qname().local()); fail(tb.add("\nResult: ").add(ex.qname().string()).toString()); } } } /** * Returns serialization parameters. * @param arg serialization arguments * @return parameter string */ protected static String serialParams(final String arg) { return "<serialization-parameters " + "xmlns='http://www.w3.org/2010/xslt-xquery-serialization'>" + arg + "</serialization-parameters>"; } }