--- /dev/null
+#!/usr/bin/perl -w
+
+
+use IO::File;
+use strict;
+
+$ENV{CLASSPATH} .= ":../../src/main/java";
+$ENV{CLASSPATH} .= ":../../lib/cql-java.jar";
+
+if (@ARGV != 2) {
+ print STDERR "Usage: $0 <CQL-compiler> <XML-normaliser>\n";
+ exit(1);
+}
+my $compiler = $ARGV[0];
+my $norman = $ARGV[1]; # name of XML normaliser program
+my($ntests, $ncorrect) = (0, 0);
+
+while (<sections/*>) {
+ my $sdir = $_;
+ s@sections/@@;
+ next if /^CVS$/;
+ print "testing section $_ - ", read_file("$sdir/name"), "\n";
+
+ while (<$sdir/*.cql>) {
+ my $qfile = $_;
+ s@sections/([0-9]+/.*)\.cql@$1@;
+ my $query = read_file($qfile);
+ my $afile = $qfile;
+ $afile =~ s/\.cql$/.xcql/;
+ print " query $_ - $query ";
+ $ntests++;
+ my $correct = read_file("$norman < $afile |");
+ my $tested = read_file("$compiler < $qfile | $norman |");
+ if (!$tested) {
+ print "\n *** test compiler exited non-zero\n";
+ } elsif ($tested eq $correct) {
+ print "OK\n";
+ $ncorrect++;
+ } else {
+ print "\n *** XCQL output differs from $afile\n";
+ print "=== tested ===\n$tested";
+ print "=== end ===\n";
+ }
+ }
+}
+
+print sprintf("%d of %d passed: %d%%\n",
+ $ncorrect, $ntests, (100 * $ncorrect) / $ntests);
+
+sub read_file {
+ my($name) = @_;
+
+ $name = "<$name" if $name !~ /\|$/;
+ my $fh = new IO::File("$name")
+ or die "can't read '$name': $!";
+ my $contents = join('', <$fh>);
+ $fh->close();
+ return $contents;
+}