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');
}