#!/usr/bin/env ruby

# Test our basic RDF API
# Dan Brickley <danbri@w3.org>
# $Id: tc_basicapi.rb,v 1.2 2003/04/18 18:06:10 danbri Exp $

$LOAD_PATH.unshift '../lib/'
$LOAD_PATH.unshift '../../lib/'

require 'basicrdf'
require 'test/unit'

class TC_BasicAPI < Test::Unit::TestCase

  FOAF='http://xmlns.com/foaf/0.1/'
  DC='http://purl.org/dc/elements/1.1'

  attr_accessor :db

  def setup
   @db=Graph.new([])
  end

  def test_got_db
    assert(@db != nil, "We need a database to test.")
  end
 
  def test_populate
    assert @db.size==0, 'It should start out empty'
    @db.tell Statement.new(Node.getBlank, FOAF+'name' ,Node.getLiteral("Dan Brickley"))
    assert @db.size==1, 'After one addition, should contain a single triple.'
    @db.tell Statement.new(Node.getBlank, FOAF+'name', Node.getLiteral("Libby Miller"))
    assert @db.size==2,"After 2nd eaddition, should contain a 2 triples."
    d2=Node.getBlank
    @db.tell(Statement.new(d2, FOAF+'mbox', Node.getResource('mailto:danbri@w3.org')))
    @db.tell(Statement.new(d2, FOAF+'mbox', Node.getResource('mailto:danbri@rdfweb.org')))
    @db.tell(Statement.new(d2, FOAF+'mbox', Node.getResource('mailto:daniel.brickley@bristol.ac.uk')))
    assert @db.size==5,'should be 5 triples by now' 
    a1=@db.ask(Statement.new(nil, FOAF+'mbox',Node.getResource('mailto:daniel.brickley@bristol.ac.uk')))
    assert a1.size==1, 'only one triple in answerset one'
    danbri=a1.subjects.shift
    bn1=danbri.to_s
    bn2=a1.statements[0].subject.to_s
    assert bn1==bn2, 'should be two equiv ways of getting value from graph'
    a2=@db.ask Statement.new(bn1, FOAF+'mbox', nil)
    assert a2.size==3, 'should get three mailbox uris'

    names=[]
    @db.ask(Statement.new(nil,FOAF+'name',nil)).objects.each {|n| names.push n}
    # puts "Actual:"+names.inspect
    mismatch=false
    expected_names=['Dan Brickley','Libby Miller']
    names.each do |name|
      assert(name.class.to_s=="Node","literal values are represented as Node instances. type found: #{name.class}")
      name=name.to_s
      # puts "Looking for name matching find: #{name} type: #{name.type}"
      mismatch=true unless
      assert expected_names.member?(name)==true, 
	"Found name, string: #{name}  should  be expected in list: #{expected_names.inspect}"
    end
  @db.tell Statement.new(a1, FOAF+'age', Node.getLiteral("31"))

# to much of a crock to even test, currently. i can't remember the api!
#  --danbri
#  a1.reg_xmlns 'foaf', FOAF
#  assert danbri.type.to_s=="Node", 'Test node should be of type Node'
#  assert danbri.foaf_age=='31','age should be 31, use node api'
  end

  def teardown
   @db=nil
  end

end
