package org.basex.tests.w3c;
import java.util.*;
import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.query.value.node.*;
import org.basex.util.*;
/**
* QT3TS Report builder.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public final class QT3TSReport {
/** Dependencies. */
private static final String[][] DEPENDENCIES = {
{ "calendar", "CB", "true" },
{ "default-language", "fr-CA", "false" },
{ "default-language", "en", "true" },
{ "feature", "collection-stability", "true" },
{ "feature", "directory-as-collection-uri", "true" },
{ "feature", "fn-format-integer-CLDR", "true" },
{ "feature", "fn-load-xquery-module", "true" },
{ "feature", "fn-transform-XSLT30", "true" },
{ "feature", "fn-transform-XSLT", "true" },
{ "feature", "higherOrderFunctions", "true" },
{ "feature", "infoset-dtd", "true" },
{ "feature", "moduleImport", "true" },
{ "feature", "namespace-axis", "true" },
{ "feature", "non_empty_sequence_collection", "true" },
{ "feature", "non_unicode_codepoint_collation", "true" },
{ "feature", "schema-location-hint", "false" },
{ "feature", "schemaImport", "false" },
{ "feature", "schemaValidation", "false" },
{ "feature", "serialization", "true" },
{ "feature", "simple-uca-fallback", "true" },
{ "feature", "staticTyping", "false" },
{ "feature", "typedData", "false" },
{ "feature", "xpath-1.0-compatibility", "true" },
{ "format-integer-sequence", "Α", "true" },
{ "format-integer-sequence", "α", "true" },
{ "format-integer-sequence", "١", "true" },
{ "format-integer-sequence", "①", "true" },
{ "format-integer-sequence", "⑴", "true" },
{ "format-integer-sequence", "⒈", "true" },
{ "format-integer-sequence", "一", "true" },
{ "format-integer-sequence", "ﯴ", "true" },
{ "language", "de", "true" },
{ "language", "en", "true" },
{ "language", "fr", "true" },
{ "language", "it", "true" },
{ "language", "xib", "true" },
{ "limits", "year_lt_0", "true" },
{ "unicode-normalization-form", "NFD", "true" },
{ "unicode-normalization-form", "NFKD", "true" },
{ "unicode-normalization-form", "NFKC", "true" },
{ "unicode-normalization-form", "FULLY-NORMALIZED", "false" },
{ "unicode-version", "5.2", "true" },
{ "unicode-version", "6.0", "true" },
{ "unicode-version", "6.2", "true" },
{ "xml-version", "1.0", "true" },
{ "xml-version", "1.1", "false" },
{ "xml-version", "1.0:4-", "false" },
{ "xml-version", "1.0:5+ 1.1", "true" }
};
/** URI of test suite. */
private static final String URI = "http://www.w3.org/2012/08/qt-fots-results";
/** List of test sets and test cases (test sets only consist of a name; test cases
* consist of a name and a result (pass/fail). */
private final ArrayList<String[]> tests = new ArrayList<>();
/**
* Adds the name of a test set.
* @param name name of test set
*/
public void addSet(final String name) {
tests.add(new String[] { name });
}
/**
* Adds the name and result of a test case.
* @param name name of test case
* @param ok success flag
*/
public void addTest(final String name, final boolean ok) {
tests.add(new String[] { name, ok ? "pass" : "fail" });
}
/**
* Creates a report.
* @param ctx database context
* @return report stream
* @throws Exception exception
*/
public byte[] create(final Context ctx) throws Exception {
final String dquery = "replace(string(current-date()),'\\+.*','')";
final String date = new XQuery(dquery).execute(ctx);
final FElem root = element("test-suite-result");
// submission element
final FElem submission = element("submission", root);
submission.add("anonymous", "false");
final FElem created = element("created", submission);
created.add("by", Prop.AUTHOR);
created.add("email", "cg@basex.org");
created.add("organization", Prop.ENTITY);
created.add("on", date);
final FElem testRun = element("test-run", submission);
testRun.add("test-suite-version", "CVS");
testRun.add("date-run", date);
element("notes", submission);
// product element
final FElem product = element("product", root);
product.add("vendor", Prop.ENTITY);
product.add("name", Prop.NAME);
product.add("version", Prop.VERSION);
product.add("released", "true");
product.add("open-source", "true");
product.add("language", "XQ31");
// dependency element
for(final String[] deps : DEPENDENCIES) {
final FElem dependency = element("dependency", product);
dependency.add("type", deps[0]);
dependency.add("value", deps[1]);
dependency.add("satisfied", deps[2]);
}
// test-set elements
FElem ts = null;
for(final String[] test : tests) {
if(test.length == 1) {
ts = element("test-set", root);
ts.add("name", test[0]);
} else {
final FElem tc = element("test-case", ts);
tc.add("name", test[0]);
tc.add("result", test[1]);
}
}
return root.serialize().finish();
}
/**
* Creates a root element.
* @param name name of element
* @return element node
*/
private static FElem element(final String name) {
return new FElem(name, URI).declareNS();
}
/**
* Creates an element.
* @param name name of element
* @param parent parent node
* @return element node
*/
private static FElem element(final String name, final FElem parent) {
final FElem elem = new FElem(name, URI);
parent.add(elem);
return elem;
}
}