use Test::More tests => 22; use Test::Exception; use strict; use warnings; no warnings 'redefine'; use RDF::Trine qw(iri statement); use_ok('RDF::Trine::Serializer::RDFXML'); { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/predicate' => [ {'type' => 'literal','value' => 'Foo'}, {'type' => 'uri','value' => 'http://example.com/bar'}, 'baz@en' ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; Foo baz END { my $xml = $serializer->serialize_model_to_string($model); is($xml, $expect, 'serialize_model_to_string 1'); } { my $iter = $model->as_stream; my $xml = $serializer->serialize_iterator_to_string($iter); is($xml, $expect, 'serialize_iterator_to_string 1'); } } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ './doc' => { './predicate' => [ {'type' => 'literal','value' => 'Foo'}, {'type' => 'uri','value' => './bar'}, 'baz@en' ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new( base_uri => 'http://example.org/'); my $expect = <<"END"; Foo baz END { my $xml = $serializer->serialize_model_to_string($model); is($xml, $expect, 'serialize_model_to_string 1'); } } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:b' => { 'http://example.com/ns#description' => ['quux'], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $xml = $serializer->serialize_model_to_string($model); is($xml, <<"END", 'serialize_model_to_string 2: simple literal'); quux END } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:a' => { 'http://example.com/ns#title' => [ 'foo', {type => 'literal', value => 'bar', datatype => 'http://www.w3.org/2001/XMLSchema#string'}, ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $xml = $serializer->serialize_model_to_string($model); is($xml, <<"END", 'serialize_model_to_string 3: datatype literal'); bar foo END } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:b' => { 'http://example.com/ns#description' => [{type=>'uri', value=>'_:a'}], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $xml = $serializer->serialize_model_to_string($model); is($xml, <<"END", 'serialize_model_to_string 4: blank object'); END } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/alice' => { 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' => [{ type => 'resource', value => 'http://xmlns.com/foaf/0.1/Person' }], 'http://purl.org/net/inkel/rdf/schemas/lang/1.1#masters' => ['en'], 'http://xmlns.com/foaf/0.1/name' => [ 'Alice', {'type' => 'literal','value' => 'Alice', language => 'en' } ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; en Alice END my $xml = $serializer->serialize_model_to_string($model); is($xml, $expect, 'serialize_model_to_string 5: multiple namespaces'); } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:b' => { 'http://example.com/' => [{type=>'uri', value=>'_:a'}], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); throws_ok { my $xml = $serializer->serialize_model_to_string($model); } 'RDF::Trine::Error::SerializationError', "serializing bad predicates throws exception (uri ends with '/')"; } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:b' => { 'http://example.com/123' => [{type=>'uri', value=>'_:a'}], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); throws_ok { my $xml = $serializer->serialize_model_to_string($model); warn $xml; } 'RDF::Trine::Error::SerializationError', "serializing bad predicates throws exception (local part starts with digits)"; } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/predicate' => [ {'type' => 'literal','value' => 'Foo'}, {'type' => 'uri','value' => 'http://example.com/bar'}, 'baz@en' ], }, 'http://example.com/bar' => { 'http://example.com/predicate' => [ {'type' => 'literal','value' => 'Bar'}, ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; Bar Foo baz END { my $xml = $serializer->serialize_model_to_string($model); is($xml, $expect, 'serialize_model_to_string 1'); } { my $iter = $model->as_stream; my $xml = $serializer->serialize_iterator_to_string($iter); is($xml, $expect, 'serialize_iterator_to_string 1'); } } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/maker' => [ {'type' => 'uri','value' => '_:a'}, ], }, '_:a' => { 'http://example.com/name' => [ {'type' => 'literal','value' => 'Alice', 'lang' => 'en'}, ], 'http://example.com/homepage' => [ {'type' => 'uri', 'value' => 'http://example.com/' }, ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; Alice END my $iter = $model->bounded_description( iri('http://example.com/doc') ); my $xml = $serializer->serialize_iterator_to_string( $iter ); is($xml, $expect, 'serialize bounded description 1'); } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/maker' => [ {'type' => 'uri','value' => '_:a'}, ], 'http://example.com/creator' => [ {'type' => 'uri','value' => '_:a'}, ], }, '_:a' => { 'http://example.com/name' => [ {'type' => 'literal','value' => 'Alice', 'lang' => 'en'}, ], 'http://example.com/homepage' => [ {'type' => 'uri', 'value' => 'http://example.com/' }, ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; Alice END my $iter = $model->bounded_description( iri('http://example.com/doc') ); my $xml = $serializer->serialize_iterator_to_string( $iter ); is($xml, $expect, 'serialize bounded description 2'); } { my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/maker' => [ {'type' => 'uri','value' => '_:a'}, ], 'http://example.com/creator' => [ {'type' => 'uri','value' => '_:a'}, ], }, '_:a' => { 'http://example.com/name' => [ {'type' => 'literal','value' => 'Alice', 'lang' => 'en'}, ], 'http://example.com/homepage' => [ {'type' => 'uri', 'value' => 'http://example.com/' }, ], }, }); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; END my $iter = $model->bounded_description( iri('http://example.com/unknown') ); my $xml = $serializer->serialize_iterator_to_string( $iter ); is($xml, $expect, 'serialize bounded description with unknown node'); } { my $model = RDF::Trine::Model->temporary_model(); my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $expect = <<"END"; END my $xml = $serializer->serialize_model_to_string($model); is($xml, $expect, 'serialize_model_to_string with empty model'); } { my $serializer = RDF::Trine::Serializer::RDFXML->new( namespaces => { ex => 'http://example.com/' } ); my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/maker' => [ {'type' => 'uri','value' => '_:a'}, ], }, '_:a' => { 'http://example.com/name' => [ {'type' => 'literal','value' => 'Alice', 'lang' => 'en'}, ], 'http://example.com/homepage' => [ {'type' => 'uri', 'value' => 'http://example.com/' }, ], }, }); my $expect = <<"END"; Alice END my $iter = $model->bounded_description( iri('http://example.com/doc') ); my $xml = $serializer->serialize_iterator_to_string( $iter ); is($xml, $expect, 'xmlns namespaces 1'); } { my $serializer = RDF::Trine::Serializer::RDFXML->new( namespaces => { foaf => 'http://xmlns.com/foaf/0.1/', rdfs => "http://www.w3.org/2000/01/rdf-schema#", lang => "http://purl.org/net/inkel/rdf/schemas/lang/1.1#", } ); my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ '_:a' => { 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' => [{type => 'uri', value => 'http://xmlns.com/foaf/0.1/Person'}], 'http://xmlns.com/foaf/0.1/name' => ['Eve'], 'http://purl.org/net/inkel/rdf/schemas/lang/1.1#masters' => ['en','fr'], 'http://www.w3.org/2000/01/rdf-schema#seeAlso' => [{type => 'uri', value => 'http://eve.example.com/'}], }, }); my $xml = $serializer->serialize_model_to_string($model); like( $xml, qr[xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:lang="http://purl.org/net/inkel/rdf/schemas/lang/1.1#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"]sm, 'xmlns sorted in rdf:RDF tag' ); like( $xml, qr[en]sm, 'Qname literal tag' ); like( $xml, qr[]sm, 'Qname resource tag' ); } { my $serializer = RDF::Trine::Serializer::RDFXML->new(); my $model = RDF::Trine::Model->temporary_model; my $base_uri = 'http://example.org/'; my $url_with_amp = "$base_uri?foo=bar&doz=baz"; $model->add_statement( statement( iri($base_uri), iri("http://xmlns.com/foaf/0.1/page"), iri($url_with_amp) ) ); my $xml = $serializer->serialize_model_to_string($model); like( $xml, qr[&]sm, 'XML entity escaping' ); } { my $serializer = RDF::Trine::Serializer::RDFXML->new( scoped_namespaces => 1, namespaces => { ex => 'http://example.com/', unused1 => 'http://example.org/not-used', unused2 => 'tag:kasei.us,2012-01-01:' } ); my $model = RDF::Trine::Model->temporary_model; $model->add_hashref({ 'http://example.com/doc' => { 'http://example.com/maker' => [ {'type' => 'uri','value' => '_:a'}, ], }, '_:a' => { 'http://example.com/name' => [ {'type' => 'literal','value' => 'Alice', 'lang' => 'en'}, ], 'http://example.com/homepage' => [ {'type' => 'uri', 'value' => 'http://example.com/' }, ], }, }); my $expect = <<"END"; Alice END my $iter = $model->bounded_description( iri('http://example.com/doc') ); my $xml = $serializer->serialize_iterator_to_string( $iter ); is($xml, $expect, 'xmlns namespaces 2 with unused definitions'); }