package com.occamlab.te.parsers;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class SchematronValidatingParserTest {
private static DocumentBuilder docBuilder;
@BeforeClass
public static void setUpClass() throws ParserConfigurationException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
docBuilder = dbf.newDocumentBuilder();
}
@Test
public void validateAbbreviatedContentPhase() throws SAXException,
IOException {
Document doc = docBuilder.parse(this.getClass().getResourceAsStream(
"/capabilities-pycsw.xml"));
SchematronValidatingParser validator = new SchematronValidatingParser();
NodeList errList = validator.validate(doc, "/sch/csw-capabilities.sch",
"AbbreviatedContentPhase");
assertEquals("Unexpected number of errors.", 3, errList.getLength());
}
@Test
public void validateDefaultPhase() throws SAXException, IOException {
Document doc = docBuilder.parse(this.getClass().getResourceAsStream(
"/capabilities-pycsw.xml"));
SchematronValidatingParser validator = new SchematronValidatingParser();
NodeList errList = validator.validate(doc, "/sch/csw-capabilities.sch",
null);
assertEquals("Unexpected number of errors.", 1, errList.getLength());
}
@Test
public void validateVersionNegotiationFailedPhase() throws SAXException,
IOException {
Document doc = docBuilder.parse(this.getClass().getResourceAsStream(
"/exception.xml"));
SchematronValidatingParser validator = new SchematronValidatingParser();
NodeList errList = validator.validate(doc, "/sch/ExceptionReport.sch",
"VersionNegotiationFailedPhase");
assertEquals("Unexpected number of errors.", 0, errList.getLength());
}
@Test
public void parseDocumentOk() throws Exception {
Writer strWriter = new StringWriter();
PrintWriter writer = new PrintWriter(strWriter);
StringBuilder xml = new StringBuilder(
"<tep:schemas xmlns:tep='http://www.occamlab.com/te/parsers'>");
xml.append("<tep:schema type='resource' phase='VersionNegotiationFailedPhase'>");
xml.append("/sch/ExceptionReport.sch");
xml.append("</tep:schema></tep:schemas>");
Document instr = docBuilder.parse(new InputSource(new StringReader(xml
.toString())));
Document doc = docBuilder.parse(this.getClass().getResourceAsStream(
"/exception.xml"));
SchematronValidatingParser parser = new SchematronValidatingParser();
Document result = parser.parse(doc, instr.getDocumentElement(), writer);
assertNotNull(result);
assertTrue("Unexpected error messages.", strWriter.toString().isEmpty());
}
@Test
public void parseInputStreamExpectViolations() throws Exception {
Writer strWriter = new StringWriter();
PrintWriter writer = new PrintWriter(strWriter);
StringBuilder xml = new StringBuilder(
"<tep:schemas xmlns:tep='http://www.occamlab.com/te/parsers'>");
xml.append("<tep:schema type='resource' phase='#ALL'>");
xml.append("/sch/csw-capabilities.sch");
xml.append("</tep:schema></tep:schemas>");
Document instr = docBuilder.parse(new InputSource(new StringReader(xml
.toString())));
InputStream input = this.getClass().getResourceAsStream(
"/capabilities-pycsw.xml");
SchematronValidatingParser parser = new SchematronValidatingParser();
Document result = parser.parse(input, instr.getDocumentElement(),
writer);
assertNull(result);
assertFalse("Expected error messages.", strWriter.toString().isEmpty());
}
}