use criterion::{criterion_group, criterion_main, Criterion};
use oxigraph::sparql::*;
use oxigraph_testsuite::files::read_file_to_string;
use oxigraph_testsuite::manifest::TestManifest;

criterion_group!(sparql, sparql_w3c_syntax_bench);

criterion_main!(sparql);

fn sparql_w3c_syntax_bench(c: &mut Criterion) {
    let manifest_urls = vec![
        "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/manifest-syntax.ttl",
        "http://www.w3.org/2009/sparql/docs/tests/data-sparql11/manifest-sparql11-query.ttl",
    ];
    let queries: Vec<_> = TestManifest::new(manifest_urls)
        .flat_map(|test| {
            let test = test.unwrap();
            if test.kind == "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest"
                || test.kind
                == "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest11" {
                test.action.map(|query| (read_file_to_string(&query).unwrap(), query))
            } else {
                None
            }
        })
        .collect();

    c.bench_function("query parser", |b| {
        b.iter(|| {
            for (query, base) in &queries {
                Query::parse(query, Some(base)).unwrap();
            }
        })
    });
}