turtle-syntax 6.0.0

RDF Turtle parser
Documentation
use nquads_syntax::Parse;
use rdf_types::RdfDisplay;
use turtle_syntax::Parse as ParseNQuads;

struct Test {
	input: &'static str,
	expected_output: &'static str,
}

impl Test {
	pub fn run(self) {
		let ast = turtle_syntax::Document::parse_str(
			&std::fs::read_to_string(self.input).unwrap(),
			|span| span,
		)
		.unwrap();
		let mut generator = rdf_types::generator::Blank::new();
		let mut triples: Vec<_> = ast
			.build_triples(None, &mut generator)
			.unwrap()
			.into_iter()
			.map(|t| t.into_value().strip_all_but_predicate())
			.collect();
		triples.sort();
		triples.dedup();

		let mut expected_triples: Vec<_> = nquads_syntax::Document::parse_str(
			&std::fs::read_to_string(self.expected_output).unwrap(),
			|span| span,
		)
		.unwrap()
		.into_value()
		.into_iter()
		.map(|q| q.into_value().strip_all_but_predicate().into_triple().0)
		.collect();
		expected_triples.sort();

		let eq = triples == expected_triples;

		if !eq {
			for t in &triples {
				eprintln!("{} .", t.rdf_display())
			}
		}

		assert!(eq)
	}
}

macro_rules! positive_test {
	($($id:ident),*) => {
		$(
			#[test]
			fn $id () {
				Test {
					input: concat!("tests/positive/", stringify!($id) ,".ttl"),
					expected_output: concat!("tests/positive/", stringify!($id) ,".nq"),
				}.run()
			}
		)*
	};
}

positive_test! {
	p01,
	p02,
	p03,
	p04,
	p05,
	p06,
	p07,
	p08,
	p09,
	p10,
	p11,
	p12,
	p13,
	p14,
	p15,
	p16,
	p17,
	p18,
	p19,
	p20,
	p21,
	p22,
	p23,
	p24,
	p25,
	p26,
	p27,
	p28,
	p29
}