From 517df6d59ef0c133c8312fbd4af46ce99a961693 Mon Sep 17 00:00:00 2001 From: Tpt Date: Wed, 18 Oct 2023 21:43:18 +0200 Subject: [PATCH] Testsuite: Makes use of mf:assumedTestBase --- testsuite/N3 | 2 +- testsuite/rdf-canon | 2 +- testsuite/rdf-tests | 2 +- testsuite/src/files.rs | 5 ++- testsuite/src/manifest.rs | 80 ++++++++++++++++++++++++--------------- testsuite/src/vocab.rs | 3 ++ 6 files changed, 59 insertions(+), 35 deletions(-) diff --git a/testsuite/N3 b/testsuite/N3 index 5fa35bf6..73f4e00c 160000 --- a/testsuite/N3 +++ b/testsuite/N3 @@ -1 +1 @@ -Subproject commit 5fa35bf602669a467cfd0ab24cc732fe49f2b927 +Subproject commit 73f4e00c15828f030749567f61cea2f5d7d9c59b diff --git a/testsuite/rdf-canon b/testsuite/rdf-canon index 9b3efebe..0503facf 160000 --- a/testsuite/rdf-canon +++ b/testsuite/rdf-canon @@ -1 +1 @@ -Subproject commit 9b3efebebe0e5338debfc4d3ddd02f6adf0a852c +Subproject commit 0503facfaa0825686afc1f533f487816de54d9b7 diff --git a/testsuite/rdf-tests b/testsuite/rdf-tests index aaa24e47..a0b910e0 160000 --- a/testsuite/rdf-tests +++ b/testsuite/rdf-tests @@ -1 +1 @@ -Subproject commit aaa24e4729a89bdee004bc3042814159eb689a19 +Subproject commit a0b910e0f2cff4d3a7e32f15ce0bfbc7db2768fb diff --git a/testsuite/src/files.rs b/testsuite/src/files.rs index fc7f5a20..d153ba74 100644 --- a/testsuite/src/files.rs +++ b/testsuite/src/files.rs @@ -34,9 +34,10 @@ pub fn load_to_graph( url: &str, graph: &mut Graph, format: RdfFormat, + base_iri: Option<&str>, ignore_errors: bool, ) -> Result<()> { - let parser = RdfParser::from_format(format).with_base_iri(url)?; + let parser = RdfParser::from_format(format).with_base_iri(base_iri.unwrap_or(url))?; for t in parser.parse_read(read_file(url)?) { match t { Ok(t) => { @@ -54,7 +55,7 @@ pub fn load_to_graph( pub fn load_graph(url: &str, format: RdfFormat, ignore_errors: bool) -> Result { let mut graph = Graph::new(); - load_to_graph(url, &mut graph, format, ignore_errors)?; + load_to_graph(url, &mut graph, format, None, ignore_errors)?; Ok(graph) } diff --git a/testsuite/src/manifest.rs b/testsuite/src/manifest.rs index 3a70442e..00a0f6a6 100644 --- a/testsuite/src/manifest.rs +++ b/testsuite/src/manifest.rs @@ -1,6 +1,6 @@ use crate::files::{guess_rdf_format, load_to_graph}; use crate::vocab::*; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use oxigraph::model::vocab::*; use oxigraph::model::*; use std::collections::VecDeque; @@ -273,46 +273,66 @@ impl TestManifest { return Ok(None); }; self.graph.clear(); - load_to_graph(&url, &mut self.graph, guess_rdf_format(&url)?, false)?; + load_to_graph(&url, &mut self.graph, guess_rdf_format(&url)?, None, false)?; let manifests = self .graph .subjects_for_predicate_object(rdf::TYPE, mf::MANIFEST) .collect::>(); if manifests.len() != 1 { - bail!("The file {url} should contain a single manifest"); + bail!("The file should contain a single manifest"); } - for manifest in manifests { - match self + let mut manifest = manifests[0]; + if let Some(base_iri) = self + .graph + .object_for_subject_predicate(manifest, mf::ASSUMED_TEST_BASE) + { + let Term::NamedNode(base_iri) = base_iri.into_owned() else { + bail!("Invalid base IRI: {base_iri}"); + }; + self.graph.clear(); + load_to_graph( + &url, + &mut self.graph, + guess_rdf_format(&url)?, + Some(base_iri.as_str()), + false, + )?; + manifest = self .graph - .object_for_subject_predicate(manifest, mf::INCLUDE) - { - Some(TermRef::BlankNode(list)) => { - self.manifests_to_do.extend( - RdfListIterator::iter(&self.graph, list.into()).filter_map(|m| match m { - Term::NamedNode(nm) => Some(nm.into_string()), - _ => None, - }), - ); - } - Some(_) => bail!("invalid tests list"), - None => (), + .subject_for_predicate_object(rdf::TYPE, mf::MANIFEST) + .context("no manifest found")?; + } + + match self + .graph + .object_for_subject_predicate(manifest, mf::INCLUDE) + { + Some(TermRef::BlankNode(list)) => { + self.manifests_to_do.extend( + RdfListIterator::iter(&self.graph, list.into()).filter_map(|m| match m { + Term::NamedNode(nm) => Some(nm.into_string()), + _ => None, + }), + ); } + Some(_) => bail!("invalid tests list"), + None => (), + } - // New tests - match self - .graph - .object_for_subject_predicate(manifest, mf::ENTRIES) - { - Some(TermRef::BlankNode(list)) => { - self.tests_to_do - .extend(RdfListIterator::iter(&self.graph, list.into())); - } - Some(term) => { - bail!("Invalid tests list. Got term {term}"); - } - None => (), + // New tests + match self + .graph + .object_for_subject_predicate(manifest, mf::ENTRIES) + { + Some(TermRef::BlankNode(list)) => { + self.tests_to_do + .extend(RdfListIterator::iter(&self.graph, list.into())); + } + Some(term) => { + bail!("Invalid tests list. Got term {term}"); } + None => (), } Ok(Some(())) } diff --git a/testsuite/src/vocab.rs b/testsuite/src/vocab.rs index 64327755..0fdc8f0d 100644 --- a/testsuite/src/vocab.rs +++ b/testsuite/src/vocab.rs @@ -43,6 +43,9 @@ pub mod mf { pub const ACTION: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#action", ); + pub const ASSUMED_TEST_BASE: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( + "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#assumedTestBase", + ); pub const RESULT: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#result", );