From fb72f526d3282678f5903ebe96b81163a7c9a6f9 Mon Sep 17 00:00:00 2001 From: Gregory Todd Williams Date: Wed, 20 Jan 2016 09:47:53 -0800 Subject: [PATCH] Added simple SPARQL parsing tests (#55). --- t/parser-sparql.t | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 t/parser-sparql.t diff --git a/t/parser-sparql.t b/t/parser-sparql.t new file mode 100644 index 00000000..fbd21583 --- /dev/null +++ b/t/parser-sparql.t @@ -0,0 +1,83 @@ +use v5.14; +use autodie; +use utf8; +use Test::Modern; +use Test::Exception; +use FindBin qw($Bin); +use File::Glob qw(bsd_glob); +use File::Spec; + +use Attean; +use Attean::RDF; +use AtteanX::SPARQL::Constants; +use Type::Tiny::Role; + +{ + my $parser = Attean->get_parser('SPARQL')->new(); + isa_ok($parser, 'AtteanX::Parser::SPARQL'); + my $type = $parser->handled_type; + can_ok($type, 'role'); + is($type->role, 'Attean::Algebra'); +} + +{ + my $data = "ASK {}"; + open(my $fh, '<', \$data); + my $parser = Attean->get_parser('SPARQL')->new(); + my $iter = $parser->parse_iter_from_io($fh); + does_ok($iter, 'Attean::API::Iterator'); + my $a = $iter->next; + does_ok($a, 'Attean::API::Algebra'); + isa_ok($a, 'Attean::Algebra::Ask'); +} + +{ + my $map = URI::NamespaceMap->new(); + my $parser = Attean->get_parser('SPARQL')->new( namespaces => $map ); + my $content = <<'END'; +PREFIX ex: +PREFIX foaf: +SELECT * WHERE { + ?s a foaf:Person . +} +END + my ($a) = $parser->parse_list_from_bytes($content); + is_deeply([sort $map->list_prefixes], [qw(ex foaf)]); + my $foaf = $map->namespace_uri('foaf'); + isa_ok($foaf, 'URI::Namespace'); + is($foaf->as_string, 'http://xmlns.com/foaf/0.1/'); + isa_ok($a, 'Attean::Algebra::Project') +} + +subtest 'escaping' => sub { + my $turtle = q[ASK { ex:p "\\"", '\\'', '\\u706b\\U0000661F' \\u007d]; + open(my $fh, '<:encoding(UTF-8)', \$turtle); + my $l = AtteanX::Parser::SPARQLLex->new(); + my $iter = $l->parse_iter_from_io($fh); + + expect($iter->next, KEYWORD, ['ASK']); + expect($iter->next, LBRACE, ['{'],); + expect($iter->next, IRI, ['s'], 'subject'); + expect($iter->next, PREFIXNAME, ['ex:', 'p'], 'predicate'); + expect($iter->next, STRING1D, ['"'], 'double quote'); + expect($iter->next, COMMA, [',']); + expect($iter->next, STRING1S, ["'"], 'single quote'); + expect($iter->next, COMMA, [',']); + expect($iter->next, STRING1S, ["火星"], 'unicode \\u and \\U escapes'); + expect($iter->next, RBRACE, ['}'], 'escaped closing brace'); +}; + + +done_testing(); + +sub expect { + my $token = shift; + my $type = shift; + my $values = shift; + my $name = shift // ''; + if (length($name)) { + $name = "${name}: "; + } + is($token->type, $type, "${name}token type"); + is_deeply($token->args, $values, "${name}token values"); +}