#!/usr/bin/env ruby
# Author:: Dan Brickley <danbri@w3.org>
# License:: W3C Software License
# $Id: gqt.rb,v 1.4 2003/04/18 18:06:09 danbri Exp $

# Fresh start attempt at a query tester
# loaded manifest file in RDF/XML format
#
# TODO:
#   - move to common www-rdf-rules manifest format
#   - write a query loader for ntriple-q format
#   - get some test data to load (eg. foaf a-z?)
#   - add a .toBindingsMarkup() method to resultset in Squish
#   - for in-mem and sql-based query

header=%q!
# This is a generated document, created by gqt.rb
# 
# Details: (todo)
#  - date generated, script version, manifest file name and version

$LOAD_PATH.unshift '../lib/'

puts "PATH is #{$:.inspect}"

require 'test/unit'
require 'basicrdf'
require 'squish'

class TC_QueryTest < Test::Unit::TestCase

  attr_accessor :data

  def setup
    # no setup needed for testing query parser
    # when test query results, may need to do RDBMS sessions startup here
  end
!


looptext=%q!
  def test_query_XXXXX1
    query = SquishQuery.new
    query_name="XXXXX2"      
    #puts "testing query: #{query_name}"
    format = "XXXXX3"
    q = "XXXXX4"
    fn = "#{q}.#{format}"
    num_clauses_expected = "XXXXX5"
    num_vars_expected = "XXXXX6"
    wf_expected = "XXXXX7"
    wf_actual = "unknown"
    begin
      qtxt = File.new("../#{fn}").read 
      query.parseFromText qtxt
      wf_actual="true" # no exception
    rescue
      wfmsg= "Error: #{XXXXX8}"
      wf_actual="false"
    end
    num_vars_actual = query.all_vars.keys.size.to_s
    num_clauses_actual = query.clauses.size.to_s

    # Assert things about this test
    assert(num_vars_actual == num_vars_expected, 
      "The actual (#{num_vars_actual}) and expected (#{num_vars_expected} number of variables should agree")
    assert(num_clauses_actual == num_clauses_expected, 
	"The actual (#{num_clauses_actual}) and expected (#{num_clauses_expected} number of variables should agree")

    assert(wf_actual == wf_expected, 
	"The actual (#{wf_actual}) and expected (#{wf_expected} wellformedness should agree")

  end # loop through all queries in test suite
!


###########################################################################
# Test Code Generator    

$:.unshift '../lib/'

require 'basicrdf'
require 'squish'
manifest = 'querymanifest.rdf'	# which tests to run
data = Loader.get_rdf manifest 
rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
rdf_type = rdf+'type'
q = 'http://www.w3.org/2002/06/rdfq_test#'
data.reg_xmlns(q,'q')

out=header.clone
n=0
a1 = data.ask(Statement.new(nil,rdf_type,q+'Query')).subjects.each do |t| 
  test=Node.getResource(t,data)
  # This is Ugly, but (a) it works 
  # (b) makes the variable-ized bits of the cookie-cutter text very visible
  #
  item=looptext.clone.gsub!(/XXXXX1/,"#{n}")  
  item.gsub!(/XXXXX2/,test.q_name.to_s)
  item.gsub!(/XXXXX3/,test.q_format.to_s)
  item.gsub!(/XXXXX4/,test.q_name.to_s)
  item.gsub!(/XXXXX5/,test.q_clauses.to_s)
  item.gsub!(/XXXXX6/,test.q_variables.to_s)
  item.gsub!(/XXXXX7/,test.q_wf.to_s)
  item.gsub!(/XXXXX8/,"$!")
  out += item
  n+=1
end
out += "\n\nend\n\n"

puts out
