/* * 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.riot.lang; import java.io.StringReader ; import java.util.ArrayList ; import java.util.List ; import org.apache.jena.atlas.junit.BaseTest ; import org.apache.jena.atlas.lib.Pair ; import org.apache.jena.graph.Triple ; import org.apache.jena.riot.Lang ; import org.apache.jena.riot.RDFDataMgr ; import org.apache.jena.riot.system.StreamRDF ; import org.apache.jena.riot.tokens.Tokenizer ; import org.apache.jena.riot.tokens.TokenizerFactory ; import org.apache.jena.sparql.core.Quad ; import org.apache.jena.sparql.sse.SSE ; import org.junit.Test ; /** System-level testing of the parsers - testing the parser plumbing, not the language details */ public class TestParserFactory extends BaseTest { static class CatchParserOutput implements StreamRDF { List<Triple> triples = new ArrayList<>() ; List<Quad> quads = new ArrayList<>() ; List<Pair<String,String>> prefixes = new ArrayList<>() ; List<String> bases = new ArrayList<>() ; int startCalled = 0 ; int finishCalled = 0 ; @Override public void start() { startCalled++ ; } @Override public void triple(Triple triple) { triples.add(triple) ; } @Override public void quad(Quad quad) { quads.add(quad) ; } @Override public void base(String base) { bases.add(base) ; } @Override public void prefix(String prefix, String iri) { prefixes.add(Pair.create(prefix, iri)) ; } @Override public void finish() { finishCalled++ ; } } @Test public void ntriples_01() { { String s = "<http://base/x> <http://base/p> <http://base/q> ." ; CatchParserOutput sink = parseCapture(s, Lang.NT) ; assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(1, sink.triples.size()) ; assertEquals(0, sink.quads.size()) ; Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ; assertEquals(t, last(sink.triples)) ; } // Old style, deprecated. Tokenizer tokenizer = TokenizerFactory.makeTokenizerString("<x> <p> <q> .") ; CatchParserOutput sink = new CatchParserOutput() ; LangRIOT parser = RiotParsers.createParserNTriples(tokenizer, sink) ; parserSetup(parser) ; parser.parse(); assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(1, sink.triples.size()) ; assertEquals(0, sink.quads.size()) ; assertEquals(SSE.parseTriple("(<x> <p> <q>)"), last(sink.triples)) ; } @Test public void turtle_01() { { String s = "<x> <p> <q> ." ; CatchParserOutput sink = parseCapture(s, Lang.TTL) ; assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(1, sink.triples.size()) ; assertEquals(0, sink.quads.size()) ; Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ; assertEquals(t, last(sink.triples)) ; } // Old style, deprecated. Tokenizer tokenizer = TokenizerFactory.makeTokenizerString("<x> <p> <q> .") ; CatchParserOutput sink = new CatchParserOutput() ; LangRIOT parser = RiotParsers.createParserTurtle(tokenizer, "http://base/", sink) ; parserSetup(parser) ; parser.parse(); assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(1, sink.triples.size()) ; assertEquals(0, sink.quads.size()) ; assertEquals(SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)"), last(sink.triples)) ; } @Test public void nquads_01() { { String s = "<x> <p> <q> <g> ." ; CatchParserOutput sink = parseCapture(s, Lang.NQ) ; assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(0, sink.triples.size()) ; assertEquals(1, sink.quads.size()) ; Quad q = SSE.parseQuad("(<g> <x> <p> <q>)") ; assertEquals(q, last(sink.quads)) ; } // Old style, deprecated. Tokenizer tokenizer = TokenizerFactory.makeTokenizerString("<x> <p> <q> <g>.") ; CatchParserOutput sink = new CatchParserOutput() ; LangRIOT parser = RiotParsers.createParserNQuads(tokenizer, sink) ; parserSetup(parser) ; parser.parse(); assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(0, sink.triples.size()) ; assertEquals(1, sink.quads.size()) ; Quad q = SSE.parseQuad("(<g> <x> <p> <q>)") ; assertEquals(q, last(sink.quads)) ; } @Test public void trig_01() { String s = "{ <x> <p> <q> }" ; CatchParserOutput sink = parseCapture(s, Lang.TRIG) ; assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(0, sink.triples.size()) ; assertEquals(1, sink.quads.size()) ; Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ; Quad q = new Quad(Quad.tripleInQuad, t) ; assertEquals(q, last(sink.quads)) ; } @Test public void trig_02() { String s = "<g> { <x> <p> <q> }" ; CatchParserOutput sink = parseCapture(s, Lang.TRIG) ; assertEquals(1, sink.startCalled) ; assertEquals(1, sink.finishCalled) ; assertEquals(0, sink.triples.size()) ; assertEquals(1, sink.quads.size()) ; Quad q = SSE.parseQuad("(<http://base/g> <http://base/x> <http://base/p> <http://base/q>)") ; assertEquals(q, last(sink.quads)) ; } private CatchParserOutput parseCapture(String s, Lang lang) { CatchParserOutput sink = new CatchParserOutput() ; RDFDataMgr.parse(sink, new StringReader(s), "http://base/", lang) ; return sink ; } private static <T> T last(List<T> list) { if ( list.isEmpty() ) return null ; return list.get(list.size()-1) ; } private static void parserSetup(LangRIOT parser) { // ParserProfile profile = new ParserProfileBase(null) ; // parser.setProfile(profile) ; } }