#!/usr/bin/perl use strict; use warnings; no warnings 'redefine'; use URI::file; use lib qw(. t); require "models.pl"; my @files = map { "data/$_" } qw(about.xrdf foaf.xrdf Flower-2.rdf); my @models = test_models( @files ); use Test::More; eval "use Test::JSON 0.03; use JSON 2.0;"; my $run_json_tests = (not $@) ? 1 : 0; my $tests_per_model = 7 + ($run_json_tests ? 6 : 0); plan tests => 1 + ($tests_per_model * scalar(@models)); use_ok( 'RDF::Query' ); foreach my $model (@models) { print "\n#################################\n"; print "### Using model: $model\n"; { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?homepage WHERE { ?person foaf:name "Gregory Todd Williams" . ?person foaf:homepage ?homepage . FILTER REGEX(STR(?homepage), "kasei") } LIMIT 1 END my $stream = $query->execute( $model ); ok( $stream->is_bindings, 'Bindings result' ); my $xml = $stream->as_xml; $xml =~ s/^.* http://kasei.us/about/foaf.xrdf#greg http://kasei.us/ END is( $xml, $expect, 'XML Bindings Results formatting' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: ASK { ?person foaf:name "Gregory Todd Williams" } END my $stream = $query->execute( $model ); ok( $stream->is_boolean, 'Boolean result' ); my $xml = $stream->as_xml; like( $xml, qr%true%sm, 'XML Boolean Results formatting' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX dc: CONSTRUCT { _:somebody foaf:name ?name; foaf:made ?thing } WHERE { ?thing dc:creator ?name } END my $stream = $query->execute( $model ); ok( $stream->is_graph, 'Graph result' ); my $xml = $stream->as_xml; # XXX remove eval when removing the TODO! no warnings 'uninitialized'; like( $xml, qr%name.*?>Greg Williams<%ms, 'XML Results formatting' ); like( $xml, qr%made\s+.*?rdf:resource="http://kasei\.us/pictures/2004/20040909-Ireland/images/DSC_5705\.jpg"%ms, 'XML Results formatting' ); } ### JSON Tests sub JSON::true; sub JSON::false; if ($run_json_tests) { { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?person ?homepage WHERE { ?person foaf:name "Gregory Todd Williams" . ?person foaf:homepage ?homepage . FILTER REGEX(STR(?homepage), "kasei") } ORDER BY ?homepage LIMIT 1 END my $stream = $query->execute( $model ); ok( $stream->is_bindings, 'Bindings result' ); my $js = $stream->as_json(); my $expect = { head => { vars => [qw(person homepage)] }, results => { ordered => JSON::true, distinct => JSON::false, bindings => [ { person => { type => 'uri', value => 'http://kasei.us/about/foaf.xrdf#greg' }, homepage => { type => 'uri', value => 'http://kasei.us/' }, } ], } }; is_valid_json( $js, 'valid json syntax' ); is_json( $js, to_json($expect), 'expected json results' ); } { my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: ASK { ?person foaf:name "Gregory Todd Williams" } END my $stream = $query->execute( $model ); ok( $stream->is_boolean, 'Boolean result' ); my $js = $stream->as_json; my $expect = { head => { vars => [] }, boolean => JSON::true, }; is_valid_json( $js, 'valid json syntax' ); is_json( $js, to_json($expect), 'expected json results' ); } } }