use ll_sparql_parser::{parse, parse_query, parse_update};
fn render(
input: &str,
tree: ll_sparql_parser::SyntaxNode,
errors: Vec<impl std::fmt::Debug>,
) -> String {
assert_eq!(tree.text().to_string(), input, "parse tree is not lossless");
let mut out = format!("{tree:#?}");
if !errors.is_empty() {
out.push_str("---\n");
for error in &errors {
out.push_str(&format!("{error:?}\n"));
}
}
out
}
fn check_query(input: &str) -> String {
let (tree, errors) = parse_query(input);
render(input, tree, errors)
}
fn check_update(input: &str) -> String {
let (tree, errors) = parse_update(input);
render(input, tree, errors)
}
fn check_auto(input: &str) -> String {
let (tree, errors) = parse(input);
render(input, tree, errors)
}
#[test]
fn select_simple() {
insta::assert_snapshot!(check_query("SELECT * WHERE { ?s ?p ?o }"));
}
#[test]
fn select_with_prefix() {
insta::assert_snapshot!(check_query(
"PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nSELECT ?name WHERE { ?person foaf:name ?name }"
));
}
#[test]
fn insert_data() {
insta::assert_snapshot!(check_update(r#"INSERT DATA { <a> <b> "c" . }"#));
}
#[test]
fn auto_detect_ask() {
insta::assert_snapshot!(check_auto("ASK { ?s ?p ?o }"));
}
#[test]
fn error_recovery_incomplete_select() {
insta::assert_snapshot!(check_query("SELECT ?s WHERE { ?s"));
}
#[test]
fn error_recovery_garbage() {
insta::assert_snapshot!(check_query("SELECT } WHERE ?? {"));
}
#[test]
fn error_recovery_incomplete_select_clause() {
insta::assert_snapshot!(check_query("SELECT ?a ? WHERE { }"));
}