/* * Copyright 2008 Fedora Commons, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mulgara.protocol; // JUnit import junit.framework.*; // Java 2 standard packages import java.io.ByteArrayOutputStream; import java.net.URI; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; // Locally written packages import org.mulgara.query.AnswerImpl; import org.mulgara.query.BooleanAnswer; import org.mulgara.query.Variable; import org.mulgara.query.rdf.BlankNodeImpl; import org.mulgara.query.rdf.LiteralImpl; import org.mulgara.query.rdf.URIReferenceImpl; import org.mulgara.util.ResultSetRow; import org.mulgara.util.MemoryResultSet; /** * Test case for {@link StreamedSparqlXMLAnswer}. * * @created Jul 8, 2008 * @author Paula Gearon * @copyright © 2008 <a href="http://www.fedora-commons.org/">Fedora Commons</a> */ public class StreamedSparqlXMLAnswerUnitTest extends TestCase { /** * Test instance. * <table> * <thead> * <tr><th>x</th> <th>y</th></tr> * </thead> * <tbody> * <tr><td>X1</td><td>Y1</td></tr> * <tr><td>X2</td><td>Y2</td></tr> * </tbody> * </table> */ private AnswerImpl answer; private AnswerImpl empty; private Map<String,String> namesp = new HashMap<String,String>(); private ByteArrayOutputStream output; private ByteArrayOutputStream outputb; private ByteArrayOutputStream outputa; private static final URI REL_URI = URI.create("rel/uri"); private static final String NAME1 = "ns1"; private static final String NAME2 = "ns2"; private static final URI NS1 = URI.create("http://mulgara.org/test/ns1"); private static final URI NS2 = URI.create("http://mulgara.org/test/ns2"); /** * Constructs a new answer test with the given name. * @param name the name of the test */ public StreamedSparqlXMLAnswerUnitTest(String name) { super(name); } /** * Hook for test runner to obtain a test suite from. * @return The test suite */ public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testEmptyConstructor")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testEmptyConstructorPretty")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testBooleanAnswer")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testBooleanAnswerPretty")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testPrettyPrint")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testCompactPrint")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testPrettyPrintVariations")); suite.addTest(new StreamedSparqlXMLAnswerUnitTest("testCompactPrintVariations")); return suite; } /** * Default text runner. * @param args The command line arguments */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /** * Tests an empty answer. * @throws Exception On error */ public void testEmptyConstructor() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(empty, output); a.setPrettyPrint(false); a.emit(); assertEquals(getEmpty(), output.toString()); } /** * Tests an empty answer. * @throws Exception On error */ public void testEmptyConstructorPretty() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(empty, output); a.emit(); assertEquals(getEmptyP(), output.toString()); a.setPrettyPrint(false); output.reset(); a.emit(); assertEquals(getEmpty(), output.toString()); } /** * Tests a boolean answer. * @throws Exception On error */ public void testBooleanAnswer() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(true, output); a.setPrettyPrint(false); a.emit(); assertEquals(getTrue(), output.toString()); a = new StreamedSparqlXMLAnswer(new BooleanAnswer(true), output); a.setPrettyPrint(false); output.reset(); a.emit(); assertEquals(getTrue(), output.toString()); } /** * Tests a boolean answer. * @throws Exception On error */ public void testBooleanAnswerPretty() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(true, output); a.emit(); assertEquals(getTrueP(), output.toString()); a.setPrettyPrint(false); output.reset(); a.emit(); assertEquals(getTrue(), output.toString()); } /** * Test main structure. */ public void testPrettyPrint() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(answer, output); a.emit(); assertEquals(getAnswerP(), output.toString()); } /** * Test main structure. */ public void testCompactPrint() throws Exception { StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(answer, output); a.setPrettyPrint(false); a.emit(); assertEquals(getAnswer(), output.toString()); } /** * Tests the variations of answers. * @throws Exception On error */ public void testCompactPrintVariations() throws Exception { StreamedSparqlXMLAnswer e = new StreamedSparqlXMLAnswer(empty, REL_URI, output); StreamedSparqlXMLAnswer b = new StreamedSparqlXMLAnswer(true, REL_URI, outputb); StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(answer, REL_URI, outputa); e.setPrettyPrint(false); b.setPrettyPrint(false); a.setPrettyPrint(false); // No namespaces, no schema, meta set e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(null, false, true), output.toString()); assertEquals(getTrue(null, false, true), outputb.toString()); assertEquals(getAnswer(null, false, true), outputa.toString()); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(null, true, true), output.toString()); assertEquals(getTrue(null, true, true), outputb.toString()); assertEquals(getAnswer(null, true, true), outputa.toString()); e.addNamespace(NAME1, NS1); e.addNamespace(NAME2, NS2); b.addNamespace(NAME1, NS1); b.addNamespace(NAME2, NS2); a.addNamespace(NAME1, NS1); a.addNamespace(NAME2, NS2); // Namespaces set, schema set, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(namesp, true, true), output.toString()); assertEquals(getTrue(namesp, true, true), outputb.toString()); assertEquals(getAnswer(namesp, true, true), outputa.toString()); e.useW3CSchema(false); b.useW3CSchema(false); a.useW3CSchema(false); // Namespaces set, no schema, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(namesp, false, true), output.toString()); assertEquals(getTrue(namesp, false, true), outputb.toString()); assertEquals(getAnswer(namesp, false, true), outputa.toString()); e = new StreamedSparqlXMLAnswer(empty, output); b = new StreamedSparqlXMLAnswer(true, outputb); a = new StreamedSparqlXMLAnswer(answer, outputa); e.setPrettyPrint(false); b.setPrettyPrint(false); a.setPrettyPrint(false); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(null, true, false), output.toString()); assertEquals(getTrue(null, true, false), outputb.toString()); assertEquals(getAnswer(null, true, false), outputa.toString()); e.addNamespace(NAME1, NS1); e.addNamespace(NAME2, NS2); b.addNamespace(NAME1, NS1); b.addNamespace(NAME2, NS2); a.addNamespace(NAME1, NS1); a.addNamespace(NAME2, NS2); // Namespaces set, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(namesp, true, false), output.toString()); assertEquals(getTrue(namesp, true, false), outputb.toString()); assertEquals(getAnswer(namesp, true, false), outputa.toString()); e.useW3CSchema(false); b.useW3CSchema(false); a.useW3CSchema(false); // Namespaces set, no schema, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(namesp, false, false), output.toString()); assertEquals(getTrue(namesp, false, false), outputb.toString()); assertEquals(getAnswer(namesp, false, false), outputa.toString()); e.clearNamespaces(); b.clearNamespaces(); a.clearNamespaces(); // No Namespaces, no schema, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(null, false, false), output.toString()); assertEquals(getTrue(null, false, false), outputb.toString()); assertEquals(getAnswer(null, false, false), outputa.toString()); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmpty(null, true, false), output.toString()); assertEquals(getTrue(null, true, false), outputb.toString()); assertEquals(getAnswer(null, true, false), outputa.toString()); } /** * Tests the variations of answers. * @throws Exception On error */ public void testPrettyPrintVariations() throws Exception { StreamedSparqlXMLAnswer e = new StreamedSparqlXMLAnswer(empty, REL_URI, output); StreamedSparqlXMLAnswer b = new StreamedSparqlXMLAnswer(true, REL_URI, outputb); StreamedSparqlXMLAnswer a = new StreamedSparqlXMLAnswer(answer, REL_URI, outputa); e.setPrettyPrint(true); b.setPrettyPrint(true); a.setPrettyPrint(true); // No namespaces, no schema, meta set e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(null, false, true), output.toString()); assertEquals(getTrueP(null, false, true), outputb.toString()); assertEquals(getAnswerP(null, false, true), outputa.toString()); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(null, true, true), output.toString()); assertEquals(getTrueP(null, true, true), outputb.toString()); assertEquals(getAnswerP(null, true, true), outputa.toString()); e.addNamespace(NAME1, NS1); e.addNamespace(NAME2, NS2); b.addNamespace(NAME1, NS1); b.addNamespace(NAME2, NS2); a.addNamespace(NAME1, NS1); a.addNamespace(NAME2, NS2); // Namespaces set, schema set, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(namesp, true, true), output.toString()); assertEquals(getTrueP(namesp, true, true), outputb.toString()); assertEquals(getAnswerP(namesp, true, true), outputa.toString()); e.useW3CSchema(false); b.useW3CSchema(false); a.useW3CSchema(false); // Namespaces set, no schema, meta set output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(namesp, false, true), output.toString()); assertEquals(getTrueP(namesp, false, true), outputb.toString()); assertEquals(getAnswerP(namesp, false, true), outputa.toString()); e = new StreamedSparqlXMLAnswer(empty, output); b = new StreamedSparqlXMLAnswer(true, outputb); a = new StreamedSparqlXMLAnswer(answer, outputa); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(null, true, false), output.toString()); assertEquals(getTrueP(null, true, false), outputb.toString()); assertEquals(getAnswerP(null, true, false), outputa.toString()); e.addNamespace(NAME1, NS1); e.addNamespace(NAME2, NS2); b.addNamespace(NAME1, NS1); b.addNamespace(NAME2, NS2); a.addNamespace(NAME1, NS1); a.addNamespace(NAME2, NS2); // Namespaces set, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(namesp, true, false), output.toString()); assertEquals(getTrueP(namesp, true, false), outputb.toString()); assertEquals(getAnswerP(namesp, true, false), outputa.toString()); e.useW3CSchema(false); b.useW3CSchema(false); a.useW3CSchema(false); // Namespaces set, no schema, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(namesp, false, false), output.toString()); assertEquals(getTrueP(namesp, false, false), outputb.toString()); assertEquals(getAnswerP(namesp, false, false), outputa.toString()); e.clearNamespaces(); b.clearNamespaces(); a.clearNamespaces(); // No Namespaces, no schema, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(null, false, false), output.toString()); assertEquals(getTrueP(null, false, false), outputb.toString()); assertEquals(getAnswerP(null, false, false), outputa.toString()); e.useW3CSchema(true); b.useW3CSchema(true); a.useW3CSchema(true); // No namespaces, schema set, no meta output.reset(); outputb.reset(); outputa.reset(); e.emit(); b.emit(); a.emit(); assertEquals(getEmptyP(null, true, false), output.toString()); assertEquals(getTrueP(null, true, false), outputb.toString()); assertEquals(getAnswerP(null, true, false), outputa.toString()); } /** * Populate the test answer. * @throws Exception Error setting up the ResultSet */ protected void setUp() throws Exception { MemoryResultSet trs1 = new MemoryResultSet(new String[] { "x", "y" }); ResultSetRow row; row = new ResultSetRow(trs1); row.setObject("x", new LiteralImpl("X1")); row.setObject("y", new URIReferenceImpl(URI.create("urn:y1"))); trs1.addRow(row); row = new ResultSetRow(trs1); row.setObject("x", new LiteralImpl("X2", "en")); row.setObject("y", new BlankNodeImpl(42)); trs1.addRow(row); answer = new AnswerImpl(trs1); List<Variable> variables = Arrays.asList(new Variable[] { new Variable("x") }); empty = new AnswerImpl(variables); namesp.put(NAME1, NS1.toString()); namesp.put(NAME2, NS2.toString()); output = new ByteArrayOutputStream(); outputb = new ByteArrayOutputStream(); outputa = new ByteArrayOutputStream(); } /** * Clean up the test answer. */ public void tearDown() { answer.close(); empty.close(); } ///////////////////////////// // start of getEmpty variants ///////////////////////////// private static String getEmpty() { return getEmpty(null, false, false); } private static String getEmptyP() { return getEmptyP(null, false, false); } private static String getEmpty(Map<String,String> ns, boolean schema, boolean meta) { return getCommonStart(ns, schema, meta) + EMPTY_BODY; } private static String getEmptyP(Map<String,String> ns, boolean schema, boolean meta) { return getCommonStartP(ns, schema, meta) + EMPTY_BODY_P; } //////////////////////////// // start of getTrue variants //////////////////////////// private static String getTrue() { return getTrue(null, false, false); } private static String getTrueP() { return getTrueP(null, false, false); } private static String getTrue(Map<String,String> ns, boolean schema, boolean meta) { return getCommonStart(ns, schema, meta) + TRUE_BODY; } private static String getTrueP(Map<String,String> ns, boolean schema, boolean meta) { return getCommonStartP(ns, schema, meta) + TRUE_BODY_P; } ////////////////////////////// // start of getAnswer variants ////////////////////////////// private static String getAnswer() { return getAnswer(null, false, false); } private static String getAnswerP() { return getAnswerP(null, false, false); } private static String getAnswer(Map<String,String> ns, boolean schema, boolean meta) { return getShortCommonStart(ns, schema) + ANSWER_VARS + getMeta(meta) + ANSWER_BODY; } private static String getAnswerP(Map<String,String> ns, boolean schema, boolean meta) { return getShortCommonStartP(ns, schema) + ANSWER_VARS_P + getMetaP(meta) + ANSWER_BODY_P; } //////////////// // common header //////////////// private static String getCommonStart(Map<String,String> ns, boolean schema, boolean meta) { return getShortCommonStart(ns, schema) + getMeta(meta); } private static String getCommonStartP(Map<String,String> ns, boolean schema, boolean meta) { return getShortCommonStartP(ns, schema) + getMetaP(meta); } private static String getShortCommonStart(Map<String,String> ns, boolean schema) { String result = DOC_HEAD + SPARQL_HEAD; if (ns != null) { for (String k: ns.keySet()) result += " " + k + "=\"" + ns.get(k) + "\""; } if (schema) result += " " + SPARQL_HEAD_ATTR; result += ">" + EMPTY_HEAD; return result; } private static String getShortCommonStartP(Map<String,String> ns, boolean schema) { String result = DOC_HEAD + SPARQL_HEAD; if (ns != null) { for (String k: ns.keySet()) result += "\n" + SPARQL_HEAD_INDENT + k + "=\"" + ns.get(k) + "\""; } if (schema) result += "\n" + SPARQL_HEAD_INDENT + SPARQL_HEAD_ATTR; result += ">\n " + EMPTY_HEAD + "\n"; return result; } private static String getMeta(boolean meta) { return meta ? HEAD_META : ""; } private static String getMetaP(boolean meta) { return meta ? HEAD_META_INDENT + HEAD_META + "\n" : ""; } static final String DOC_HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; static final String SPARQL_HEAD = "<sparql xmlns=\"http://www.w3.org/2005/sparql-results#\""; static final String SPARQL_HEAD_ATTR = "xsi:schemaLocation=\"http://www.w3.org/2007/SPARQL/result.xsd\""; static final String SPARQL_HEAD_INDENT = " "; static final String HEAD_META = "<link href=\"" + REL_URI + "\"/>"; static final String HEAD_META_INDENT = " "; static final String EMPTY_HEAD = "<head>"; static final String EMPTY_BODY = "</head><results></results></sparql>"; static final String EMPTY_BODY_P = " </head>\n" + " <results>\n" + " </results>\n" + "</sparql>"; static final String TRUE_BODY = "</head><boolean>true</boolean></sparql>"; static final String TRUE_BODY_P = " </head>\n" + " <boolean>true</boolean>\n" + "</sparql>"; static final String ANSWER_VARS = "<variable name=\"x\"/><variable name=\"y\"/>"; static final String ANSWER_BODY = "</head>" + "<results>" + "<result><binding name=\"x\"><literal>X1</literal></binding>" + "<binding name=\"y\"><uri>urn:y1</uri></binding></result>" + "<result><binding name=\"x\"><literal xml:lang=\"en\">X2</literal></binding>" + "<binding name=\"y\"><bnode>_node42</bnode></binding></result>" + "</results>" + "</sparql>"; static final String ANSWER_VARS_P = " <variable name=\"x\"/>\n" + " <variable name=\"y\"/>\n"; static final String ANSWER_BODY_P = " </head>\n" + " <results>\n" + " <result>\n" + " <binding name=\"x\">\n" + " <literal>X1</literal>\n" + " </binding>\n" + " <binding name=\"y\">\n" + " <uri>urn:y1</uri>\n" + " </binding>\n" + " </result>\n" + " <result>\n" + " <binding name=\"x\">\n" + " <literal xml:lang=\"en\">X2</literal>\n" + " </binding>\n" + " <binding name=\"y\">\n" + " <bnode>_node42</bnode>\n" + " </binding>\n" + " </result>\n" + " </results>\n" + "</sparql>"; }