use lib qw(../blib/lib ../blib/lib/auto ); use strict; use warnings; use Data::Dumper; use Test::More qw(no_plan); use File::Temp qw(tempfile); use RDF::Core::Model; use RDF::Core::Model::Parser; use RDF::Core::Storage::Memory; use RDF::Core::Storage::DB_File; use RDF::Core::Storage::Postgres; my $one_labels = <<"END"; Restaurants END my $two_labels = <<"END"; Restaurants Restaurants END my @storage = ( ['Memory', sub { return (RDF::Core::Storage::Memory->new(), sub{}) }], ['DB_File', sub { my ($fh, $filename) = tempfile(); return (RDF::Core::Storage::DB_File->new( Name => $filename ), sub { unlink $filename }); }], ['Postgres', sub{ my $s = new RDF::Core::Storage::Postgres ( ConnectStr=>'dbi:Pg:dbname=rdf', DBUser=>'postgres', Model=>'rdf-test-01', ); sub cleanup { #warn "cleaning up...\n"; my $s = shift; my $enum = $s->getStmts(); my $stmt = $enum->getNext; while (defined $stmt) { $s->removeStmt($stmt); $stmt = $enum->getNext; } } cleanup($s); return ($s,\&cleanup); }], ); my @labels = ( [ $one_labels, 1, 3, [ qw(fr) ] ], [ $two_labels, 2, 4, [ qw(en fr) ] ], ); my $subj = RDF::Core::Resource->new( 'http://kr.newco.com/test.owl#Restaurants_fctsont_restaurantsF' ); my $pred = RDF::Core::Resource->new( 'http://www.w3.org/2000/01/rdf-schema#label' ); STORAGE: foreach my $storage_data (@storage) { my ($storage_name, $storage_factory) = @{ $storage_data }; warn "\n# $storage_name\n"; foreach my $data (@labels) { my ($source, $label_count, $st_count, $langs) = @$data; my %langs = map { $_ => 1 } @$langs; my ($storage, $storage_cleanup); eval {($storage, $storage_cleanup) = &$storage_factory}; if (! $storage) { warn "$storage_name NOT available, skipping tests...\n"; next STORAGE; } my $model = new RDF::Core::Model (Storage => $storage); my $parser = new RDF::Core::Model::Parser ( Model => $model, Source => $source, SourceType => 'string', BaseURI => "http://www.foo.com/", BNodePrefix => 'genid', ); isa_ok( $parser, 'RDF::Core::Model::Parser' ); is( $model->countStmts( undef, undef, undef ), 0, 'expected empty model' ); $parser->parse; is( $model->countStmts( undef, undef, undef ), $st_count, 'expected statement count' ); is( $model->countStmts( $subj, $pred, undef ), $label_count, 'expected label count from countStmts' ); foreach my $lang (keys %langs) { my $literal = RDF::Core::Literal->new( 'Restaurants', $lang ); is( $model->countStmts( undef, undef, $literal ), 1, 'expected statement count from countStmts with language-typed literal' ); my $count = 0; my $enum = $model->getStmts( undef, undef, $literal ); my $st = $enum->getNext; while (defined $st) { $count++; $st = $enum->getNext; } $enum->close; is( $count, 1, 'expected statement count from getStmts with language-typed literal' ); } my $count = 0; my $enum = $model->getStmts($subj, $pred, undef); my $st = $enum->getNext; while (defined $st) { my $literal = $st->getObject; my $lang = $literal->getLang; ok( exists( $langs{ $lang } ), "expected language: $lang" ); delete $langs{ $lang }; $count++; $st = $enum->getNext; } $enum->close; is( $count, $label_count, 'expected label count' ); my @keys = keys %langs; is( scalar(@keys), 0, 'found all expected languages' ); $storage_cleanup->($storage); } }