Skip to content

Commit 6b277fe

Browse files
committed
GH-5095 add tests to verify that startRdf and endRdf are called at the correct time
1 parent 2a998c3 commit 6b277fe

1 file changed

Lines changed: 112 additions & 17 deletions

File tree

core/rio/api/src/test/java/org/eclipse/rdf4j/rio/AbstractParserHandlingTest.java

Lines changed: 112 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package org.eclipse.rdf4j.rio;
1212

1313
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertFalse;
1415
import static org.junit.jupiter.api.Assertions.assertNotEquals;
1516
import static org.junit.jupiter.api.Assertions.assertTrue;
1617
import static org.junit.jupiter.api.Assertions.fail;
@@ -19,10 +20,12 @@
1920
import java.io.ByteArrayOutputStream;
2021
import java.io.InputStream;
2122
import java.io.OutputStream;
23+
import java.util.Collection;
2224
import java.util.Collections;
2325
import java.util.Date;
2426
import java.util.HashSet;
2527
import java.util.Locale;
28+
import java.util.Map;
2629

2730
import org.eclipse.rdf4j.model.BNode;
2831
import org.eclipse.rdf4j.model.IRI;
@@ -115,7 +118,7 @@ public abstract class AbstractParserHandlingTest {
115118

116119
private ParseErrorCollector testListener;
117120

118-
private Model testStatements;
121+
private TestStatementCollector testStatements;
119122

120123
/**
121124
* Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the
@@ -211,20 +214,90 @@ protected RDFWriter createWriter(OutputStream output) {
211214
}
212215

213216
/**
217+
*
214218
*/
215219
@BeforeEach
216220
public void setUp() {
217221
testParser = getParser();
218222

219223
testParser.setValueFactory(vf);
220224
testListener = new ParseErrorCollector();
221-
testStatements = new LinkedHashModel();
225+
testStatements = new TestStatementCollector(new LinkedHashModel());
222226

223227
testParser.setParseErrorListener(testListener);
224-
testParser.setRDFHandler(new StatementCollector(testStatements));
228+
testParser.setRDFHandler(testStatements);
229+
}
230+
231+
private class TestStatementCollector extends StatementCollector {
232+
233+
private boolean start;
234+
private boolean end;
235+
236+
public TestStatementCollector(Model testStatements) {
237+
super(testStatements);
238+
}
239+
240+
@Override
241+
public void clear() {
242+
super.clear();
243+
this.start = false;
244+
this.end = false;
245+
}
246+
247+
@Override
248+
public void startRDF() throws RDFHandlerException {
249+
assertFalse(start, "startRDF was called twice");
250+
assertFalse(end, "startRDF was called after endRDF");
251+
this.start = true;
252+
super.startRDF();
253+
}
254+
255+
@Override
256+
public void endRDF() throws RDFHandlerException {
257+
assertTrue(start, "startRDF was not called before endRDF");
258+
assertFalse(end, "endRDF was called twice");
259+
this.end = true;
260+
super.endRDF();
261+
}
262+
263+
@Override
264+
public void handleComment(String comment) throws RDFHandlerException {
265+
assertTrue(start, "startRDF was not called before handleComment");
266+
assertFalse(end, "endRDF was called before handleComment");
267+
super.handleComment(comment);
268+
}
269+
270+
@Override
271+
public void handleStatement(Statement st) {
272+
assertTrue(start, "startRDF was not called before handleStatement");
273+
assertFalse(end, "endRDF was called before handleStatement");
274+
super.handleStatement(st);
275+
}
276+
277+
@Override
278+
public void handleNamespace(String prefix, String uri) throws RDFHandlerException {
279+
assertTrue(start, "startRDF was not called before handleNamespace");
280+
assertFalse(end, "endRDF was called before handleNamespace");
281+
super.handleNamespace(prefix, uri);
282+
}
283+
284+
@Override
285+
public Collection<Statement> getStatements() {
286+
assertTrue(start, "startRDF was not called before getStatements");
287+
assertTrue(end, "endRDF was not called before getStatements");
288+
return super.getStatements();
289+
}
290+
291+
@Override
292+
public Map<String, String> getNamespaces() {
293+
assertTrue(start, "startRDF was not called before getStatements");
294+
assertTrue(end, "endRDF was not called before getStatements");
295+
return super.getNamespaces();
296+
}
225297
}
226298

227299
/**
300+
*
228301
*/
229302
@AfterEach
230303
public void tearDown() {
@@ -390,6 +463,9 @@ public void testUnknownDatatypeWithMessageWithFailCase1() throws Exception {
390463
}
391464

392465
assertErrorListener(0, 1, 0);
466+
// Since the parser failed it would not have called endRdf(), so we just overwrite the end variable so that
467+
// assertModel(...) doesn't fail
468+
testStatements.end = true;
393469
assertModel(new LinkedHashModel());
394470
}
395471

@@ -699,6 +775,9 @@ public void testUnknownLanguageWithMessageWithFailCase1() throws Exception {
699775
}
700776

701777
assertErrorListener(0, 1, 0);
778+
// Since the parser failed it would not have called endRdf(), so we just overwrite the end variable so that
779+
// assertModel(...) doesn't fail
780+
testStatements.end = true;
702781
assertModel(new LinkedHashModel());
703782
}
704783

@@ -917,12 +996,13 @@ public void testSkolemization() throws Exception {
917996

918997
assertErrorListener(0, 0, 0);
919998
// assertModel(expectedModel); // GH-2768 isomorphism is not maintained after skolemization
920-
assertNotEquals(new HashSet<>(expectedModel), new HashSet<>(testStatements)); // blank nodes not preserved
921-
assertTrue(Models.subjectBNodes(testStatements).isEmpty()); // skolemized
999+
assertNotEquals(new HashSet<>(expectedModel), new HashSet<>(testStatements.getStatements())); // blank nodes not
1000+
// preserved
1001+
assertTrue(Models.subjectBNodes(testStatements.getStatements()).isEmpty()); // skolemized
9221002
}
9231003

9241004
@Test
925-
public void testRDFStarCompatibility() throws Exception {
1005+
public void testRDFStarCompatibility1() throws Exception {
9261006
Model expectedModel = new LinkedHashModel();
9271007
Triple t1 = vf.createTriple(vf.createIRI("http://example.com/1"), vf.createIRI("http://example.com/2"),
9281008
vf.createLiteral("example", vf.createIRI("http://example.com/3")));
@@ -939,9 +1019,20 @@ public void testRDFStarCompatibility() throws Exception {
9391019
testParser.parse(input1, BASE_URI);
9401020
assertErrorListener(0, 0, 0);
9411021
assertModel(expectedModel);
1022+
}
9421023

943-
testListener.reset();
944-
testStatements.clear();
1024+
@Test
1025+
public void testRDFStarCompatibility2() throws Exception {
1026+
Model expectedModel = new LinkedHashModel();
1027+
Triple t1 = vf.createTriple(vf.createIRI("http://example.com/1"), vf.createIRI("http://example.com/2"),
1028+
vf.createLiteral("example", vf.createIRI("http://example.com/3")));
1029+
expectedModel.add(vf.createStatement(t1, DC.SOURCE, vf.createIRI("http://example.com/4")));
1030+
Triple t2 = vf.createTriple(t1, DC.DATE, vf.createLiteral(new Date()));
1031+
expectedModel.add(vf.createStatement(vf.createIRI("http://example.com/5"), DC.RELATION, t2));
1032+
Triple t3 = vf.createTriple(vf.createTriple(vf.createTriple(vf.createIRI("urn:a"), RDF.TYPE,
1033+
vf.createIRI("urn:b")), vf.createIRI("urn:c"), vf.createIRI("urn:d")), vf.createIRI("urn:e"),
1034+
vf.createIRI("urn:f"));
1035+
expectedModel.add(vf.createStatement(t3, vf.createIRI("urn:same"), t3));
9451036

9461037
// Turn off compatibility on parsing: formats with RDF-star support will produce RDF-star triples,
9471038
// non-RDF-star formats will produce IRIs of the kind urn:rdf4j:triple:xxx
@@ -952,22 +1043,26 @@ public void testRDFStarCompatibility() throws Exception {
9521043
if (testParser.getRDFFormat().supportsRDFStar()) {
9531044
assertModel(expectedModel);
9541045
} else {
955-
assertTrue(testStatements.contains(RDFStarUtil.toRDFEncodedValue(t1), DC.SOURCE,
956-
vf.createIRI("http://example.com/4")));
957-
assertTrue(testStatements.contains(vf.createIRI("http://example.com/5"), DC.RELATION,
958-
RDFStarUtil.toRDFEncodedValue(t2)));
959-
assertTrue(testStatements.contains(RDFStarUtil.toRDFEncodedValue(t3), vf.createIRI("urn:same"),
960-
RDFStarUtil.toRDFEncodedValue(t3)));
961-
assertEquals(3, testStatements.size());
1046+
assertTrue(testStatements.getStatements()
1047+
.contains(vf.createStatement(RDFStarUtil.toRDFEncodedValue(t1), DC.SOURCE,
1048+
vf.createIRI("http://example.com/4"))));
1049+
assertTrue(testStatements.getStatements()
1050+
.contains(vf.createStatement(vf.createIRI("http://example.com/5"), DC.RELATION,
1051+
RDFStarUtil.toRDFEncodedValue(t2))));
1052+
assertTrue(testStatements.getStatements()
1053+
.contains(vf.createStatement(RDFStarUtil.toRDFEncodedValue(t3), vf.createIRI("urn:same"),
1054+
RDFStarUtil.toRDFEncodedValue(t3))));
1055+
assertEquals(3, testStatements.getStatements().size());
9621056
}
9631057
}
9641058

9651059
private void assertModel(Model expectedModel) {
9661060
if (logger.isTraceEnabled()) {
9671061
logger.trace("Expected: {}", expectedModel);
968-
logger.trace("Actual: {}", testStatements);
1062+
logger.trace("Actual: {}", testStatements.getStatements());
9691063
}
970-
assertTrue(Models.isomorphic(expectedModel, testStatements), "Did not find expected statements");
1064+
assertTrue(Models.isomorphic(expectedModel, testStatements.getStatements()),
1065+
"Did not find expected statements");
9711066
}
9721067

9731068
private void assertErrorListener(int expectedWarnings, int expectedErrors, int expectedFatalErrors) {

0 commit comments

Comments
 (0)