/*
* eXist Open Source Native XML Database
* Copyright (C) 2009 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package org.exist.xquery.functions.validate;
import org.junit.*;
import static org.junit.Assert.*;
import org.exist.test.EmbeddedExistTester;
import org.exist.xquery.XPathException;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
/**
* Additional tests for the validation:jing() function with RNGs and XSDs
*
* @author jim.fuller@webcomposite.com
* @author dizzzz@exist-db.org
*/
public class AdditionalJingXsdRngTest extends EmbeddedExistTester {
@Test
public void testValidateXSDwithJing() {
LOG.info("start test");
ResourceSet result = null;
String r = "";
try {
String query = "let $v := <doc>\n" +
"\t<title>Title</title>\n" +
"\t<p>Some paragraph.</p>\n" +
" </doc>\n" +
"let $schema := <xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n" +
"\t\t elementFormDefault=\"qualified\">\n" +
"\t<xs:element name=\"doc\">\n" +
"\t <xs:complexType>\n" +
"\t <xs:sequence>\n" +
"\t <xs:element minOccurs=\"0\" ref=\"title\"/>\n" +
"\t <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"p\"/>\n" +
"\t </xs:sequence>\n" +
"\t </xs:complexType>\n" +
"\t</xs:element>\n" +
"\t<xs:element name=\"title\" type=\"xs:string\"/>\n" +
"\t<xs:element name=\"p\" type=\"xs:string\"/>\n" +
" </xs:schema>\n" +
"return\n" +
"\n" +
"\tvalidation:jing($v,$schema)";
result = xpxqService.query(query);
r = (String) result.getResource(0).getContent();
assertEquals("true", r);
} catch (XMLDBException e) {
LOG.error("testValidateXSDwithJing(): " + e.getMessage(), e);
fail(e.getMessage());
}
}
@Test
public void testValidateXSDwithJing_invalid() {
LOG.info("start test");
ResourceSet result = null;
String r = "";
try {
String query = "let $v := <doc>\n" +
"\t<title1>Title</title1>\n" +
"\t<p>Some paragraph.</p>\n" +
" </doc>\n" +
"let $schema := <xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n" +
"\t\t elementFormDefault=\"qualified\">\n" +
"\t<xs:element name=\"doc\">\n" +
"\t <xs:complexType>\n" +
"\t <xs:sequence>\n" +
"\t <xs:element minOccurs=\"0\" ref=\"title\"/>\n" +
"\t <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"p\"/>\n" +
"\t </xs:sequence>\n" +
"\t </xs:complexType>\n" +
"\t</xs:element>\n" +
"\t<xs:element name=\"title\" type=\"xs:string\"/>\n" +
"\t<xs:element name=\"p\" type=\"xs:string\"/>\n" +
" </xs:schema>\n" +
"return\n" +
"\n" +
"\tvalidation:jing($v,$schema)";
result = executeQuery(query);
r = (String) result.getResource(0).getContent();
assertEquals("false", r);
} catch (XMLDBException e) {
System.out.println("testValidateXSDwithJing_invalid(): " + e);
fail(e.getMessage());
}
}
@Test
public void testValidateRNGwithJing() throws XPathException {
LOG.info("start test");
ResourceSet result = null;
String r = "";
try {
String query = "let $v := <doc>\n" +
"\t<title>Title</title>\n" +
"\t<p>Some paragraph.</p>\n" +
" </doc>\n" +
"let $schema := <grammar xmlns=\"http://relaxng.org/ns/structure/1.0\">\n" +
" <start>\n" +
" <ref name=\"doc\"/>\n" +
" </start>\n" +
" <define name=\"doc\">\n" +
" <element name=\"doc\">\n" +
" <optional>\n" +
" <ref name=\"title\"/>\n" +
" </optional>\n" +
" <zeroOrMore>\n" +
" <ref name=\"p\"/>\n" +
" </zeroOrMore>\n" +
" </element>\n" +
" </define>\n" +
" <define name=\"title\">\n" +
" <element name=\"title\">\n" +
" <text/>\n" +
" </element>\n" +
" </define>\n" +
" <define name=\"p\">\n" +
" <element name=\"p\">\n" +
" <text/>\n" +
" </element>\n" +
" </define>\n" +
"</grammar>\n" +
"return\n" +
"\n" +
"\tvalidation:jing($v,$schema)";
result = executeQuery(query);
r = (String) result.getResource(0).getContent();
assertEquals("true", r);
} catch (XMLDBException e) {
LOG.error("testValidateRNGwithJing(): " + e.getMessage(), e);
fail(e.getMessage());
}
}
@Test
public void testValidateRNGwithJing_invalid() {
LOG.info("start test");
ResourceSet result = null;
String r = "";
try {
String query = "let $v := <doc>\n" +
"\t<title1>Title</title1>\n" +
"\t<p>Some paragraph.</p>\n" +
" </doc>\n" +
"let $schema := <grammar xmlns=\"http://relaxng.org/ns/structure/1.0\">\n" +
" <start>\n" +
" <ref name=\"doc\"/>\n" +
" </start>\n" +
" <define name=\"doc\">\n" +
" <element name=\"doc\">\n" +
" <optional>\n" +
" <ref name=\"title\"/>\n" +
" </optional>\n" +
" <zeroOrMore>\n" +
" <ref name=\"p\"/>\n" +
" </zeroOrMore>\n" +
" </element>\n" +
" </define>\n" +
" <define name=\"title\">\n" +
" <element name=\"title\">\n" +
" <text/>\n" +
" </element>\n" +
" </define>\n" +
" <define name=\"p\">\n" +
" <element name=\"p\">\n" +
" <text/>\n" +
" </element>\n" +
" </define>\n" +
"</grammar>\n" +
"return\n" +
"\n" +
"\tvalidation:jing($v,$schema)";
result = executeQuery(query);
r = (String) result.getResource(0).getContent();
assertEquals("false", r);
} catch (XMLDBException e) {
LOG.error("testValidateRNGwithJing_invalid(): " + e.getMessage(), e);
fail(e.getMessage());
}
}
@Test
@Ignore("Looks good, but memory issue")
public void repeatTests() {
for (int i = 0; i < 1000; i++) {
try {
System.out.println("nr=" + i);
testValidateRNGwithJing();
testValidateRNGwithJing_invalid();
testValidateXSDwithJing();
testValidateXSDwithJing_invalid();
} catch (Exception ex) {
fail(ex.getMessage());
ex.printStackTrace();
}
}
}
}