/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.jena.sparql.resultset; import java.io.ByteArrayInputStream; import org.junit.Assert; import org.apache.jena.atlas.lib.StrUtils; import org.apache.jena.query.ResultSet ; import org.apache.jena.query.ResultSetFactory ; import org.apache.jena.sparql.ARQException ; import org.apache.jena.sparql.resultset.CSVInput ; import org.apache.jena.sparql.resultset.ResultSetException ; import org.apache.jena.sparql.resultset.TSVInput ; import org.junit.Test; public class TestResultSetFormat2 { @Test public void resultset_tsv_01() { // Empty Header Row (no variables), no rows. parseTSV("\n"); } @Test public void resultset_tsv_02() { // No vars, one row. String x = "\n\n"; parseTSV(x); } @Test public void resultset_tsv_03() { // One var, one row empty (unbound) String x = "?x\n\n"; parseTSV(x); } @Test public void resultset_tsv_04() { // One var, no rows. String x = "?x\n"; parseTSV(x); } @Test public void resultset_tsv_05() { // One var, one rows. String x = "?x\n'a'\n"; parseTSV(x); } @Test public void resultset_tsv_06() { // Two vars, one row empty other than the tab separator which is // required // when two or more variables are present String x = "?x\t?y\n\t\n"; parseTSV(x); } @Test public void resultset_tsv_07() { // Three vars, one row of no values String x = "?x\t?y\t?z\n\t\t"; parseTSV(x); } // various values @Test public void resultset_tsv_08() { String x = "?x\n<http://example/foo>\n"; parseTSV(x); } @Test public void resultset_tsv_09() { String x = "?x\n_:abc\n"; parseTSV(x); } @Test public void resultset_tsv_11() { String x = "?x\n123\n"; parseTSV(x); } @Test public void resultset_tsv_12() { // We allow leading white space. String x = "?x\n 123\n"; parseTSV(x); } @Test public void resultset_tsv_13() { // We allow trailing white space. String x = "?x\n123 \n"; parseTSV(x); } @Test public void resultset_tsv_14() { // We allow trailing white space. String x = "?x\n<http://example/> \n"; parseTSV(x); } @Test public void resultset_tsv_boolean_01() { // true is valid String x = "?_askResult\ntrue"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_02() { // true is valid regardless of case String x = "?_askResult\nTRUE"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_03() { // true is valid regardless of case String x = "?_askResult\ntRuE"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_04() { // yes is valid String x = "?_askResult\nyes"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_05() { // yes is valid regardless of case String x = "?_askResult\nYES"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_06() { // yes is valid regardless of case String x = "?_askResult\nyEs"; parseTSVAsBoolean(x, true); } @Test public void resultset_tsv_boolean_07() { // false is valid String x = "?_askResult\nfalse"; parseTSVAsBoolean(x, false); } @Test public void resultset_tsv_boolean_08() { // false is valid regardless of case String x = "?_askResult\nFALSE"; parseTSVAsBoolean(x, false); } @Test public void resultset_tsv_boolean_09() { // false is valid regardless of case String x = "?_askResult\nfAlSe"; parseTSVAsBoolean(x, false); } @Test public void resultset_tsv_boolean_10() { // no is valid String x = "?_askResult\nno"; parseTSVAsBoolean(x, false); } @Test public void resultset_tsv_boolean_11() { // no is valid regardless of case String x = "?_askResult\nNO"; parseTSVAsBoolean(x, false); } @Test public void resultset_tsv_boolean_12() { // no is valid regardless of case String x = "?_askResult\nnO"; parseTSVAsBoolean(x, false); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_01() { // Two vars, row of 3 values. String x = "?x\t?y\n'a'\t'b'\t'c'"; parseTSV(x); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_02() { // Two vars, row of 1 value only. String x = "?x\t?y\n'a'"; parseTSV(x); } @Test(expected = ARQException.class) public void resultset_bad_tsv_03() { // No input parseTSV(""); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_04() { // Two vars but a completely empty row (should contain a tab) String x = "?x\t?y\n\n"; parseTSV(x); } // various values - broken @Test(expected = ResultSetException.class) public void resultset_bad_tsv_05() { String x = "?x\n<http://example/"; parseTSV(x); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_06() { String x = "?x\n<http://example/ white space >"; parseTSV(x); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_07() { String x = "?x\n<<<<http://example/>>>>"; parseTSV(x); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_08() { String x = "?x\n_:abc def"; parseTSV(x); } @Test(expected = ResultSetException.class) public void resultset_bad_tsv_09() { String x = "x\n<http://example.com>"; parseTSV(x); } @Test(expected = ARQException.class) public void resultset_bad_tsv_boolean_01() { // Not in allowed set of true yes false no String x = "?_askResults\nblah"; parseTSVAsBoolean(x, false); } @Test(expected = ARQException.class) public void resultset_bad_tsv_boolean_02() { // Missing header String x = "true"; parseTSVAsBoolean(x, false); } @Test(expected = ARQException.class) public void resultset_bad_tsv_boolean_03() { // Missing boolean String x = "?_askResult\n"; parseTSVAsBoolean(x, false); } @Test(expected = ARQException.class) public void resultset_bad_tsv_boolean_04() { // A normal result set header String x = "?x\n"; parseTSVAsBoolean(x, false); } @Test(expected = ARQException.class) public void resultset_bad_tsv_boolean_05() { // A normal result set header String x = "?x\t?y\n"; parseTSVAsBoolean(x, false); } @Test public void resultset_csv_01() { // Normal header String x = "x,y\n"; parseCSV(x); } @Test public void resultset_csv_02() { // Header with variable names using CSV field encoding i.e. surrounded by quotes String x = "\"x\",\"y\"\n"; parseCSV(x); } @Test public void resultset_json_01() { //@formatter:off String input = StrUtils.strjoinNL("{\"head\":{\"vars\":[\"s\"]},", " \"results\": {", " \"bindings\":[", " {\"s\":{\"type\":\"uri\",\"value\":\"http://rdf.myexperiment.org/ontologies/snarm/Policy\"}}", " ]", " },", " \"warnings\": [\"parser warning: Variable o was bound but is unused in the query on line 1\",", " \"parser warning: Variable p was bound but is unused in the query on line 1\"]", " })", " }"); //@formatter:on parseJSON(input); } @Test(expected = ResultSetException.class) public void resultset_json_02() { //@formatter:off String input = StrUtils.strjoinNL("{\"head\":{\"vars\":[\"s\"]},", " \"results\": {", " \"bindings\":[", " {\"s\":{\"type\":\"uri\"}}", " ]", " },", " \"warnings\": [\"parser warning: Variable o was bound but is unused in the query on line 1\",", " \"parser warning: Variable p was bound but is unused in the query on line 1\"]", " })", " }"); //@formatter:on // No value for URI is illegal parseJSON(input); } @Test(expected = ResultSetException.class) public void resultset_json_03() { String input = "{\"head\":{\"vars\":[\"s\"]}}"; // Missing results is illegal parseJSON(input); } @Test(expected = ResultSetException.class) public void resultset_json_04() { String input = "{\"results\":{}}"; // Missing head is illegal parseJSON(input); } private void parseTSV(String x) { byte[] b = StrUtils.asUTF8bytes(x); ByteArrayInputStream in = new ByteArrayInputStream(b); ResultSet rs2 = ResultSetFactory.fromTSV(in); while (rs2.hasNext()) { rs2.nextBinding(); } } private void parseCSV(String x) { byte[] b = StrUtils.asUTF8bytes(x); ByteArrayInputStream in = new ByteArrayInputStream(b); ResultSet rs2 = CSVInput.fromCSV(in); while (rs2.hasNext()) { rs2.nextBinding(); } } private void parseJSON(String input) { byte[] b = StrUtils.asUTF8bytes(input); ByteArrayInputStream in = new ByteArrayInputStream(b); ResultSet rs = ResultSetFactory.fromJSON(in); while (rs.hasNext()) { rs.nextBinding(); } } private void parseTSVAsBoolean(String x, boolean expected) { byte[] b = StrUtils.asUTF8bytes(x); ByteArrayInputStream in = new ByteArrayInputStream(b); boolean actual = TSVInput.booleanFromTSV(in); Assert.assertEquals(expected, actual); } }