All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.rdf4j.rio.nquads.AbstractNQuadsParserUnitTest Maven / Gradle / Ivy

There is a newer version: 5.1.0
Show newest version
/*******************************************************************************
 * Copyright (c) 2015 Eclipse RDF4J contributors, Aduna, and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *******************************************************************************/
package org.eclipse.rdf4j.rio.nquads;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;

import org.eclipse.rdf4j.model.BNode;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Resource;
import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.vocabulary.RDF;
import org.eclipse.rdf4j.rio.ParseLocationListener;
import org.eclipse.rdf4j.rio.RDFHandlerException;
import org.eclipse.rdf4j.rio.RDFParseException;
import org.eclipse.rdf4j.rio.RDFParser;
import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
import org.eclipse.rdf4j.rio.helpers.BasicParserSettings;
import org.eclipse.rdf4j.rio.helpers.NTriplesParserSettings;
import org.eclipse.rdf4j.rio.helpers.StatementCollector;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * JUnit test for the N-Quads parser that uses the tests that are available
 * online.
 */
public abstract class AbstractNQuadsParserUnitTest {

	/*-----------*
	 * Constants *
	 *-----------*/

	private static String NQUADS_TEST_URL = "http://www.w3.org/2000/10/rdf-tests/rdfcore/ntriples/test.nt";

	private static String NQUADS_TEST_FILE = "/testcases/nquads/test1.nq";

	private static String NTRIPLES_TEST_URL = "http://www.w3.org/2000/10/rdf-tests/rdfcore/ntriples/test.nt";

	private static String NTRIPLES_TEST_FILE = "/testcases/ntriples/test.nt";

	private RDFParser parser;

	private TestRDFHandler rdfHandler;

	@Before
	public void setUp()
		throws Exception
	{
		parser = createRDFParser();
		rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(this.rdfHandler);
	}

	@After
	public void tearDown()
		throws Exception
	{
		parser = null;
	}

	/*---------*
	 * Methods *
	 *---------*/

	public void testNQuadsFile()
		throws Exception
	{
		RDFParser nquadsParser = createRDFParser();
		nquadsParser.setRDFHandler(new AbstractRDFHandler() {});

		InputStream in = AbstractNQuadsParserUnitTest.class.getResourceAsStream(NQUADS_TEST_FILE);
		try {
			nquadsParser.parse(in, NQUADS_TEST_URL);
		}
		catch (RDFParseException e) {
			fail("NQuadsParser failed to parse N-Quads test document: " + e.getMessage());
		}
		finally {
			in.close();
		}
	}

	/**
	 * The N-Quads parser must be able to parse the N-Triples test file without error.
	 */
	public void testNTriplesFile()
		throws Exception
	{
		RDFParser nquadsParser = createRDFParser();
		nquadsParser.setRDFHandler(new AbstractRDFHandler() {});

		InputStream in = AbstractNQuadsParserUnitTest.class.getResourceAsStream(NTRIPLES_TEST_FILE);
		try {
			nquadsParser.parse(in, NTRIPLES_TEST_URL);
		}
		catch (RDFParseException e) {
			fail("NQuadsParser failed to parse N-Triples test document: " + e.getMessage());
		}
		finally {
			in.close();
		}
	}

	/**
	 * Tests the correct behavior with incomplete input.
	 */
	@Test
	public void testIncompleteParsingWithoutPeriod()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"   ".getBytes());
		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when not inserting a trailing period at the end of a statement.");
		}
		catch (RDFParseException rdfpe) {
			// FIXME: Enable this test when first line number is 1 in parser
			// instead of -1
			// Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(44, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the behaviour with non-whitespace characters after a period character without a context.
	 * 
	 * @throws RDFHandlerException
	 * @throws IOException
	 * @throws RDFParseException
	 */
	@Test
	public void testNonWhitespaceAfterPeriodNoContext()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"x\"^^ .  ".getBytes());
		try {
			parser.parse(bais, "http://base-uri");
			Assert.fail("Expected exception when there is non-whitespace characters after a period.");
		}
		catch (RDFParseException rdfpe) {
			Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(44, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the behaviour with non-whitespace characters after a period character without a context.
	 * 
	 * @throws RDFHandlerException
	 * @throws IOException
	 * @throws RDFParseException
	 */
	@Test
	public void testNonWhitespaceAfterPeriodWithContext()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"x\"^^  .  ".getBytes());
		try {
			parser.parse(bais, "http://base-uri");
			Assert.fail("Expected exception when there is non-whitespace characters after a period.");
		}
		catch (RDFParseException rdfpe) {
			Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(44, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the correct behaviour with no context.
	 */
	@Test
	public void testParseNoContext()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"   .".getBytes());
		parser.parse(bais, "http://base-uri");
	}

	/**
	 * Tests parsing of empty lines and comments.
	 */
	@Test
	public void testParseEmptyLinesAndComments()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \n\n\n# This is a comment\n\n#this is another comment.".getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		Assert.assertEquals(rdfHandler.getStatements().size(), 0);
	}

	/**
	 * Tests basic N-Quads parsing.
	 */
	@Test
	public void testParseBasic()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"    .".getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		Assert.assertThat(rdfHandler.getStatements().size(), is(1));
		final Statement statement = rdfHandler.getStatements().iterator().next();
		Assert.assertEquals("http://www.v/dat/4b", statement.getSubject().stringValue());
		Assert.assertEquals("http://www.w3.org/20/ica#dtend", statement.getPredicate().stringValue());
		Assert.assertTrue(statement.getObject() instanceof IRI);
		Assert.assertEquals("http://sin/value/2", statement.getObject().stringValue());
		Assert.assertEquals("http://sin.siteserv.org/def/", statement.getContext().stringValue());
	}

	/**
	 * Tests basic N-Quads parsing with blank node.
	 */
	@Test
	public void testParseBasicBNode()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"_:a123456768   .".getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		Assert.assertThat(rdfHandler.getStatements().size(), is(1));
		final Statement statement = rdfHandler.getStatements().iterator().next();
		Assert.assertTrue(statement.getSubject() instanceof BNode);
		Assert.assertEquals("http://www.w3.org/20/ica#dtend", statement.getPredicate().stringValue());
		Assert.assertTrue(statement.getObject() instanceof IRI);
		Assert.assertEquals("http://sin/value/2", statement.getObject().stringValue());
		Assert.assertEquals("http://sin.siteserv.org/def/", statement.getContext().stringValue());
	}

	/**
	 * Tests basic N-Quads parsing with literal.
	 */
	@Test
	public void testParseBasicLiteral()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"_:a123456768  \"2010-05-02\" .".getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		Assert.assertThat(rdfHandler.getStatements().size(), is(1));
		final Statement statement = rdfHandler.getStatements().iterator().next();
		Assert.assertTrue(statement.getSubject() instanceof BNode);
		Assert.assertEquals("http://www.w3.org/20/ica#dtend", statement.getPredicate().stringValue());
		Assert.assertTrue(statement.getObject() instanceof Literal);
		Assert.assertEquals("2010-05-02", statement.getObject().stringValue());
		Assert.assertEquals("http://sin.siteserv.org/def/", statement.getContext().stringValue());
	}

	/**
	 * Tests N-Quads parsing with literal and language.
	 */
	@Test
	public void testParseBasicLiteralLang()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"2010-05-02\"@en .".getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		final Statement statement = rdfHandler.getStatements().iterator().next();
		Assert.assertEquals("http://www.v/dat/4b2-21", statement.getSubject().stringValue());
		Assert.assertEquals("http://www.w3.org/20/ica#dtend", statement.getPredicate().stringValue());
		Assert.assertTrue(statement.getObject() instanceof Literal);
		Literal object = (Literal)statement.getObject();
		Assert.assertEquals("2010-05-02", object.stringValue());
		Assert.assertEquals("en", object.getLanguage().orElse(null));
		Assert.assertEquals(RDF.LANGSTRING, object.getDatatype());
		Assert.assertEquals("http://sin.siteserv.org/def/", statement.getContext().stringValue());
	}

	/**
	 * Tests N-Quads parsing with literal and datatype.
	 */
	@Test
	public void testParseBasicLiteralDatatype()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				(" " + " "
						+ "\"2010\"^^ "
						+ ".").getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.parse(bais, "http://test.base.uri");
		final Statement statement = rdfHandler.getStatements().iterator().next();
		Assert.assertEquals("http://www.v/dat/4b2-21", statement.getSubject().stringValue());
		Assert.assertEquals("http://www.w3.org/20/ica#dtend", statement.getPredicate().stringValue());
		Assert.assertTrue(statement.getObject() instanceof Literal);
		Literal object = (Literal)statement.getObject();
		Assert.assertEquals("2010", object.stringValue());
		Assert.assertFalse(object.getLanguage().isPresent());
		Assert.assertEquals("http://www.w3.org/2001/XMLSchema#integer", object.getDatatype().toString());
		Assert.assertEquals("http://sin.siteserv.org/def/", statement.getContext().stringValue());
	}

	/**
	 * Tests N-Quads parsing with literal and datatype using a prefix, which is illegal in NQuads, but legal
	 * in N3/Turtle that may otherwise look like NQuads
	 */
	@Test
	public void testParseBasicLiteralDatatypePrefix()
		throws RDFHandlerException, IOException
	{

		final ByteArrayInputStream bais = new ByteArrayInputStream(
				(" " + " " + "\"2010\"^^xsd:integer "
						+ ".").getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when passing in a datatype using an N3 style prefix");
		}
		catch (RDFParseException rdfpe) {
			Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(69, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the correct support for literal escaping.
	 */
	@Test
	public void testLiteralEscapeManagement1()
		throws RDFHandlerException, IOException, RDFParseException
	{
		TestParseLocationListener parseLocationListener = new TestParseLocationListener();
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setParseLocationListener(parseLocationListener);
		parser.setRDFHandler(rdfHandler);

		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"\\\\\"  .".getBytes());
		parser.parse(bais, "http://base-uri");

		rdfHandler.assertHandler(1);
		// parseLocationListener.assertListener(1, 40);
		// FIXME: Enable column numbers when parser supports them
		parseLocationListener.assertListener(1, 1);
	}

	/**
	 * Tests the correct support for literal escaping.
	 */
	@Test
	public void testLiteralEscapeManagement2()
		throws RDFHandlerException, IOException, RDFParseException
	{
		TestParseLocationListener parseLocationListener = new TestParseLocationListener();
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setParseLocationListener(parseLocationListener);
		parser.setRDFHandler(rdfHandler);

		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"Line text 1\\nLine text 2\"  .".getBytes());
		parser.parse(bais, "http://base-uri");

		rdfHandler.assertHandler(1);
		final Value object = rdfHandler.getStatements().iterator().next().getObject();
		Assert.assertTrue(object instanceof Literal);
		final String literalContent = ((Literal)object).getLabel();
		Assert.assertEquals("Line text 1\nLine text 2", literalContent);
	}

	/**
	 * Tests the correct decoding of UTF-8 encoded chars in URIs.
	 */
	@Test
	public void testURIDecodingManagement()
		throws RDFHandlerException, IOException, RDFParseException
	{
		TestParseLocationListener parseLocationListener = new TestParseLocationListener();
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setParseLocationListener(parseLocationListener);
		parser.setRDFHandler(rdfHandler);

		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"    .".getBytes());
		parser.parse(bais, "http://base-uri");

		rdfHandler.assertHandler(1);
		final Statement statement = rdfHandler.getStatements().iterator().next();

		final Resource subject = statement.getSubject();
		Assert.assertTrue(subject instanceof IRI);
		final String subjectURI = subject.toString();
		Assert.assertEquals("http://s/はむ", subjectURI);

		final Resource predicate = statement.getPredicate();
		Assert.assertTrue(predicate instanceof IRI);
		final String predicateURI = predicate.toString();
		Assert.assertEquals("http://p/はむ", predicateURI);

		final Value object = statement.getObject();
		Assert.assertTrue(object instanceof IRI);
		final String objectURI = object.toString();
		Assert.assertEquals("http://o/はむ", objectURI);

		final Resource graph = statement.getContext();
		Assert.assertTrue(graph instanceof IRI);
		final String graphURI = graph.toString();
		Assert.assertEquals("http://g/はむ", graphURI);
	}

	@Test
	public void testUnicodeLiteralDecoding()
		throws RDFHandlerException, IOException, RDFParseException
	{
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		final String INPUT_LITERAL_PLAIN = "[は]";
		final String INPUT_LITERAL_ENCODED = "[\\u306F]";
		final String INPUT_STRING = String.format("  \"%s\"  .",
				INPUT_LITERAL_ENCODED);
		final ByteArrayInputStream bais = new ByteArrayInputStream(INPUT_STRING.getBytes());
		parser.parse(bais, "http://base-uri");

		rdfHandler.assertHandler(1);
		final Literal obj = (Literal)rdfHandler.getStatements().iterator().next().getObject();
		Assert.assertEquals(INPUT_LITERAL_PLAIN, obj.getLabel());
	}

	@Test
	public void testWrongUnicodeEncodedCharFail()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"\\u123X\"  .".getBytes());
		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when an incorrect unicode character is included");
		}
		catch (RDFParseException rdfpe) {
			Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(30, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the correct support for EOS exception.
	 */
	@Test
	public void testEndOfStreamReached()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				"  \"\\\"  .".getBytes());
		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when a literal is not closed");
		}
		catch (RDFParseException rdfpe) {
			// FIXME: Enable this test when first line number is 1 in parser
			// instead of -1
			// Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(39, rdfpe.getColumnNumber());
		}
	}

	/**
	 * Tests the parser with all cases defined by the NQuads grammar.
	 */
	@Test
	public void testParserWithAllCases()
		throws IOException, RDFParseException, RDFHandlerException
	{
		TestParseLocationListener parseLocationListerner = new TestParseLocationListener();
		// SpecificTestRDFHandler rdfHandler = new SpecificTestRDFHandler();
		parser.setParseLocationListener(parseLocationListerner);
		parser.setRDFHandler(rdfHandler);

		BufferedReader br = new BufferedReader(new InputStreamReader(
				AbstractNQuadsParserUnitTest.class.getResourceAsStream("/testcases/nquads/test1.nq")));
		parser.parse(br, "http://test.base.uri");

		rdfHandler.assertHandler(6);
		parseLocationListerner.assertListener(9, 1);
	}

	/**
	 * Tests parser with real data.
	 */
	@Test
	public void testParserWithRealData()
		throws IOException, RDFParseException, RDFHandlerException
	{
		TestParseLocationListener parseLocationListener = new TestParseLocationListener();
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setParseLocationListener(parseLocationListener);
		parser.setRDFHandler(rdfHandler);

		parser.parse(AbstractNQuadsParserUnitTest.class.getResourceAsStream("/testcases/nquads/test2.nq"),
				"http://test.base.uri");

		rdfHandler.assertHandler(400);
		parseLocationListener.assertListener(401, 1);
	}

	@Test
	public void testStatementWithInvalidLiteralContentAndIgnoreValidation()
		throws RDFHandlerException, IOException, RDFParseException
	{
		// Note: Float declare as int.
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				(" "
						+ " "
						+ "\"1380.0\"^^ "
						+ " .").getBytes());
		parser.getParserConfig().set(BasicParserSettings.VERIFY_DATATYPE_VALUES, false);
		parser.getParserConfig().set(BasicParserSettings.FAIL_ON_UNKNOWN_DATATYPES, false);
		parser.parse(bais, "http://base-uri");
	}

	@Test
	public void testStatementWithInvalidLiteralContentAndStrictValidation()
		throws RDFHandlerException, IOException, RDFParseException
	{
		// Note: Float declare as int.
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				(" "
						+ " "
						+ "\"1380.0\"^^ "
						+ " .").getBytes());
		parser.getParserConfig().set(BasicParserSettings.VERIFY_DATATYPE_VALUES, true);
		parser.getParserConfig().set(BasicParserSettings.FAIL_ON_UNKNOWN_DATATYPES, true);
		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when passing in a datatype using an N3 style prefix");
		}
		catch (RDFParseException rdfpe) {
			// FIXME: Fix line numbers for validation errors during the line
			// Assert.assertEquals(1, rdfpe.getLineNumber());
			// FIXME: Enable column numbers when parser supports them
			// Assert.assertEquals(152, rdfpe.getColumnNumber());
		}
	}

	@Test
	public void testStatementWithInvalidDatatypeAndIgnoreValidation()
		throws RDFHandlerException, IOException, RDFParseException
	{
		verifyStatementWithInvalidDatatype(false);
	}

	@Test
	public void testStatementWithInvalidDatatypeAndVerifyValidation()
		throws RDFHandlerException, IOException, RDFParseException
	{
		try {
			verifyStatementWithInvalidDatatype(true);
			fail("Did not find expected exception");
		}
		catch (RDFParseException rdfpe) {
			// FIXME: Fix line numbers for validation errors during the line
			// Assert.assertEquals(1, rdfpe.getLineNumber());
		}
	}

	@Test
	public void testStopAtFirstErrorStrictParsing()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				("    .\n"
						+ "                                     .\n" + // Line
						// with
						// error.
						"    .\n").getBytes());

		parser.getParserConfig().set(NTriplesParserSettings.FAIL_ON_NTRIPLES_INVALID_LINES, false);

		try {
			parser.parse(bais, "http://test.base.uri");
			Assert.fail("Expected exception when encountering an invalid line");
		}
		catch (RDFParseException rdfpe) {
			Assert.assertEquals(2, rdfpe.getLineNumber());
			// Assert.assertEquals(50, rdfpe.getColumnNumber());
		}
	}

	@Test
	public void testStopAtFirstErrorTolerantParsing()
		throws RDFHandlerException, IOException, RDFParseException
	{
		final ByteArrayInputStream bais = new ByteArrayInputStream(
				("    .\n"
						+ "                                     .\n" + // Line
						// with
						// error.
						"    .\n").getBytes());
		final TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);

		parser.getParserConfig().set(NTriplesParserSettings.FAIL_ON_NTRIPLES_INVALID_LINES, false);
		parser.getParserConfig().addNonFatalError(NTriplesParserSettings.FAIL_ON_NTRIPLES_INVALID_LINES);

		parser.parse(bais, "http://base-uri");
		rdfHandler.assertHandler(2);
		final Collection statements = rdfHandler.getStatements();
		int i = 0;
		for (Statement nextStatement : statements) {
			Assert.assertEquals("http://s" + i, nextStatement.getSubject().stringValue());
			Assert.assertEquals("http://p" + i, nextStatement.getPredicate().stringValue());
			Assert.assertEquals("http://o" + i, nextStatement.getObject().stringValue());
			Assert.assertEquals("http://g" + i, nextStatement.getContext().stringValue());
			i++;
		}
	}

	private void verifyStatementWithInvalidDatatype(boolean useDatatypeVerification)
		throws RDFHandlerException, IOException, RDFParseException
	{
		TestRDFHandler rdfHandler = new TestRDFHandler();
		parser.setRDFHandler(rdfHandler);
		parser.getParserConfig().set(BasicParserSettings.VERIFY_DATATYPE_VALUES, useDatatypeVerification);
		parser.getParserConfig().set(BasicParserSettings.FAIL_ON_UNKNOWN_DATATYPES, useDatatypeVerification);
		if (!useDatatypeVerification) {
			parser.getParserConfig().addNonFatalError(BasicParserSettings.VERIFY_DATATYPE_VALUES);
			parser.getParserConfig().addNonFatalError(BasicParserSettings.FAIL_ON_UNKNOWN_DATATYPES);
		}

		final ByteArrayInputStream bais = new ByteArrayInputStream(
				(" "
						+ " "
						+ "\"1380.0\"^^ "
						+ " .").getBytes());
		parser.parse(bais, "http://base-uri");
		rdfHandler.assertHandler(1);
	}

	private class TestParseLocationListener implements ParseLocationListener {

		private long lastRow, lastCol;

		public void parseLocationUpdate(long r, long c) {
			lastRow = r;
			lastCol = c;
		}

		private void assertListener(int row, int col) {
			Assert.assertEquals("Unexpected last row", row, lastRow);
			Assert.assertEquals("Unexpected last col", col, lastCol);
		}

	}

	private class TestRDFHandler extends StatementCollector {

		private boolean started = false;

		private boolean ended = false;

		@Override
		public void startRDF()
			throws RDFHandlerException
		{
			super.startRDF();
			started = true;
		}

		@Override
		public void endRDF()
			throws RDFHandlerException
		{
			super.endRDF();
			ended = true;
		}

		public void assertHandler(int expected) {
			Assert.assertTrue("Never started.", started);
			Assert.assertTrue("Never ended.", ended);
			Assert.assertEquals("Unexpected number of statements.", expected, getStatements().size());
		}
	}

	@Test
	public void testSupportedSettings()
		throws Exception
	{
		assertEquals(12, parser.getSupportedSettings().size());
	}

	protected abstract RDFParser createRDFParser();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy