# -*- Mode: Perl -*-
#
# test1.t - Redland perl test 1 - RDF::Redland::CORE low level APIs
#
# Copyright (C) 2000-2003 David Beckett - http://www.dajobe.org/
# Copyright (C) 2000-2003 University of Bristol - http://www.bristol.ac.uk/
# 
# This package is Free Software and part of Redland http://librdf.org/
# 
# It is licensed under the following three licenses as alternatives:
#   1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
#   2. GNU General Public License (GPL) V2 or any newer version
#   3. Apache License, V2.0 or any newer version
# 
# You may not use this file except in compliance with at least one of
# the above three licenses.
# 
# See LICENSE.html or LICENSE.txt at the top of this package for the
# full license terms.
# 
# 
#

######################### We start with some black magic to print on failure.

BEGIN { $| = 1; print "1..6\n"; }
END {print "not ok 1\n" unless $loaded;}
use RDF::Redland::CORE;
$loaded = 1;
print "ok 1\n";

######################### End of black magic.

use strict;

my $test=2;

# Test using RDF::Redland::CORE module only

my $debug=defined $ENV{'TEST_VERBOSE'};

my $world=&RDF::Redland::CORE::librdf_new_world();
&RDF::Redland::CORE::librdf_world_open($world);
&RDF::Redland::CORE::librdf_perl_world_init($world);

my $storage=&RDF::Redland::CORE::librdf_new_storage($world, "hashes", "test", "new='yes',hash-type='memory',dir='.'");
if(!$storage) {
  warn "Redland::librdf_new_storage failed\n";
  print "not ok $test\n";
  exit 1;
}
print "ok $test\n";
$test++;

my $model=&RDF::Redland::CORE::librdf_new_model($world, $storage, "");
if(!$model) {
  warn "Redland::librdf_new_model failed\n";
  print "not ok $test\n";
  exit 1;
}
print "ok $test\n";
$test++;

my $statement=&RDF::Redland::CORE::librdf_new_statement_from_nodes($world, 
							  &RDF::Redland::CORE::librdf_new_node_from_uri_string($world, "http://www.dajobe.org/"),
							  &RDF::Redland::CORE::librdf_new_node_from_uri_string($world, "http://purl.org/dc/elements/1.1/creator"),
							  &RDF::Redland::CORE::librdf_new_node_from_literal($world, "Dave Beckett", "", 0)
							  );
if(!$statement) {
  warn "Redland::librdf_new_statement_from_nodes failed\n";
  print "not ok $test\n";
  exit 1;
}
print "ok $test\n";
$test++;

&RDF::Redland::CORE::librdf_model_add_statement($model, $statement);
&RDF::Redland::CORE::librdf_free_statement($statement);
$statement=undef;


$statement=&RDF::Redland::CORE::librdf_new_statement($world);
my $stream=&RDF::Redland::CORE::librdf_model_find_statements($model,$statement);
&RDF::Redland::CORE::librdf_free_statement($statement);
$statement=undef;

my $failed=0;
while(!&RDF::Redland::CORE::librdf_stream_end($stream)) {
  $statement=&RDF::Redland::CORE::librdf_stream_get_object($stream);
  my $s=&RDF::Redland::CORE::librdf_statement_to_string($statement);
  if(!length $s) {
    warn "Redland::librdf_new_statement_to_string failed\n";
    print "not ok $test\n";
    $failed=1;
    last;
  }
  warn "found statement: $s\n" if $debug;
  &RDF::Redland::CORE::librdf_stream_next($stream);
}
&RDF::Redland::CORE::librdf_free_stream($stream);
$stream=undef;
last if $failed;

print "ok $test\n";
$test++;

my $source_node=&RDF::Redland::CORE::librdf_new_node_from_uri_string($world, "http://www.dajobe.org/");
my $target_node=&RDF::Redland::CORE::librdf_new_node_from_uri_string($world, "http://purl.org/dc/elements/1.1/creator");

my $iterator=&RDF::Redland::CORE::librdf_model_get_targets($model,$source_node,$target_node);
$failed=0;
while(!&RDF::Redland::CORE::librdf_iterator_end($iterator)) {
  my $node=&RDF::Redland::CORE::librdf_iterator_get_object($iterator);
  my $n=&RDF::Redland::CORE::librdf_node_to_string($node);
  if(!length $n) {
    warn "Redland::librdf_node_to_string failed\n";
    print "not ok $test\n";
    $failed=1;
    last;
  }
  warn "found node: $n\n" if $debug;
  &RDF::Redland::CORE::librdf_iterator_next($iterator);
}
&RDF::Redland::CORE::librdf_free_iterator($iterator);
$iterator=undef;
&RDF::Redland::CORE::librdf_free_node($source_node);
$source_node=undef;
&RDF::Redland::CORE::librdf_free_node($target_node);
$target_node=undef;

unless($failed)  {
  print "ok $test\n";
}

$test++;

&RDF::Redland::CORE::librdf_free_model($model);
$model=undef;
&RDF::Redland::CORE::librdf_free_storage($storage);
$storage=undef;

&RDF::Redland::CORE::librdf_perl_world_finish();
$world=undef;

exit 0;
