The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl

use Test::More;
use Test::RDF;
use File::Util;
use RDF::Trine;
use File::Temp qw/tempfile cleanup/;

use_ok('RDF::Trine::Store::File');

my ($fh, $filename) = tempfile(EXLOCK => 0);

my $store = RDF::Trine::Store::File->new($filename);

ok($store, 'Store object OK');

$store->add_statement(RDF::Trine::Statement->new(
						 RDF::Trine::Node::Resource->new('http://example.org/a'),
						 RDF::Trine::Node::Resource->new('http://example.org/b'),
						 RDF::Trine::Node::Resource->new('http://example.org/c')
						));

is($store->size, 1, 'Store has one statement according to size');

is($store->count_statements(undef, undef, undef), 1, 'Store has one statement according to count');

my $first_etag = $store->etag;

like($first_etag, qr/\w{32}/, 'Etag is 32 chars long, only hex');

note "Sleep one second to ensure new etag";
sleep 1;

my($f) = File::Util->new();

{
  my($content) = $f->load_file($filename);

  is_valid_rdf($content, 'ntriples', 'Content is valid N-Triples');

  is_rdf($content, 'ntriples', '<http://example.org/a> <http://example.org/b> <http://example.org/c> .', 'turtle', 'Content is correct');
}

$store->add_statement(RDF::Trine::Statement->new(
						 RDF::Trine::Node::Resource->new('http://example.org/a'),
						 RDF::Trine::Node::Resource->new('http://example.org/d'),
						 RDF::Trine::Node::Resource->new('http://example.org/e')
						));

$store->add_statement(RDF::Trine::Statement->new(
						 RDF::Trine::Node::Resource->new('http://example.org/a'),
						 RDF::Trine::Node::Resource->new('http://example.org/d'),
						 RDF::Trine::Node::Literal->new('Dahut')
						));
$store->add_statement(RDF::Trine::Statement->new(
						 RDF::Trine::Node::Resource->new('http://example.org/a'),
						 RDF::Trine::Node::Resource->new('http://example.org/d'),
						 RDF::Trine::Node::Literal->new('Dahut', 'en')
						));

is($store->size, 4, 'Store has four statements');

is($store->count_statements(
			    RDF::Trine::Node::Resource->new('http://example.org/a'),
			    RDF::Trine::Node::Resource->new('http://example.org/d'),
			    undef), 3, 'Three statements with object unbound');

is($store->count_statements(
			    undef,
			    RDF::Trine::Node::Resource->new('http://example.org/d'),
			    RDF::Trine::Node::Literal->new('Dahut', 'en')),
   1, '1 statement with object bound to lang literal');

my $second_etag = $store->etag;

like($second_etag, qr/\w{32}/, 'Etag is 32 chars long, only hex');

isnt($first_etag, $second_etag, 'Etags differ');

{
  my($content) = $f->load_file($filename);
  is_valid_rdf($content, 'ntriples', 'Content is valid N-Triples');

#  is_rdf($content, 'ntriples', '<http://example.org/a> <http://example.org/b> <http://example.org/c> .', 'ntriples', 'Content is correct');
}

$store->remove_statement(RDF::Trine::Statement->new(
						 RDF::Trine::Node::Resource->new('http://example.org/a'),
						 RDF::Trine::Node::Resource->new('http://example.org/d'),
						 RDF::Trine::Node::Resource->new('http://example.org/e')
						));

is($store->size, 3, 'Store has 3 statements after single remove');

is($store->size, $store->count_statements(undef, undef, undef), 'count and size are equal');

$store->remove_statements(
			  RDF::Trine::Node::Resource->new('http://example.org/a'),
			  RDF::Trine::Node::Resource->new('http://example.org/d'),
			  undef);

is($store->size, 1, 'Store has one statement after match-remove');

$store->nuke;

ok(! -e $filename, 'File is gone');

{
  my $store2 = RDF::Trine::Store::File->new_with_string('File;' . $filename);

  ok($store2, 'Store with string config object OK');

  $store2->add_statement(RDF::Trine::Statement->new(
						    RDF::Trine::Node::Resource->new('http://example.org/a'),
						    RDF::Trine::Node::Resource->new('http://example.org/b'),
						    RDF::Trine::Node::Resource->new('http://example.org/c')
						   ));

  is($store2->size, 1, 'Store with string config has one statement according to size');

  $store2->nuke;

  ok(! -e $filename, 'File with string config is gone');
}

done_testing;