#! /usr/local/bin/perl -w

use strict;
use warnings;
use constant SCRIPT_NAME => 'test-modules.pl';

use Getopt::Long;

use WordNet::Similarity::res;
use WordNet::Similarity::lin;
use WordNet::Similarity::jcn;
use WordNet::Similarity::path;
use WordNet::Similarity::wup;
use WordNet::Similarity::lch;
use WordNet::Similarity::hso;
use WordNet::Similarity::lesk;
use WordNet::Similarity::random;
use WordNet::Similarity::vector;

use WordNet::QueryData;


our ($opt_wnpath, $opt_version, $opt_help, $opt_type, $opt_outfile);
our ($opt_config);

my $result = GetOptions ("wnpath=s", "version", "help", "type=s", "outfile=s",
			 "config=s");

unless ($result) {
  showUsage ();
  exit (1);
}

if ($opt_help) {
  showHelp ();
  exit (0);
}

if ($opt_version) {
  print "".SCRIPT_NAME." version 0.07\n";
  print "Copyright (C) 2003, Jason Michelizzi and Ted Pedersen\n";
  exit (0);
}

unless ($opt_type) {
  showUsage ();
  exit (1);
}

my $outfh = *STDOUT;
if ($opt_outfile) {
  open ($outfh, ">$opt_outfile") or die "Cannot open $opt_outfile: $!";
}

# find WordNet
my $wnhome = '/usr/local/WordNet-2.0/dict';
$wnhome = $ENV{WNHOME} if $ENV{WNHOME};
$wnhome = $opt_wnpath if $opt_wnpath;

print STDERR "Loading WordNet... ";
my $wn = new WordNet::QueryData ($wnhome);
if ($wn) {
  print STDERR "done.\n";
}
else {
  print STDERR "failed.\n";
  exit (1);
}

my $module = $opt_type;
$module = "WordNet::Similarity::".$module
  unless $module =~ m/WordNet::Similarity/;


print STDERR "Loading $module... ";
my $measure = $opt_config ? new $module ($wn, $opt_config) : new $module ($wn);
print STDERR "done.\n";

my ($err, $errstr) = $measure->getError ();
$err and die "Error creating $module: ($errstr)";

# now do some tests
my @pairs = (['contrition#n#1', 'compunction#n#1'],
	     ['dog#n#1', 'hunting_dog#n#1'],
	     ['dog#n#1', 'cat#n#1'],
	     ['levity#n#1', 'contrition#n#1'],
	     ['hope#n#2', 'compunction#n#1'],
	     ['like#v#2', 'cotton#v#1'],
	     ['adore#v#1', 'like#v#2'],
	     ['hope#n#2', 'like#v#2'],
	     ['blue_sky#n#1', 'Earth#n#4'],
	     ['worship#v#1', 'adore#v#1'],
	     ['outer_space#n#1', 'abstraction#n#6'],
	     ['languish#v#2', 'weep#v#1'],
	     ['hjxlq#n', 'ynbr#n'],
	     ['intelligent#a#1', 'intelligence#n#1'],
	     ['weep#v#1', 'erupt#v#6'],
	     ['leather_carp#n#1', 'grotto#n#1'],
	    );

foreach my $pair (@pairs) {
  print $outfh "$pair->[0], $pair->[1]: ";
  my $score = $measure->getRelatedness ($pair->[0], $pair->[1]);
  if (defined $score) {
    print $outfh "$score\n";
  }
  else {
    my ($err, $errString) = $measure->getError ();
    print $outfh "undefined (error level $err)\n";
  }
}

close $outfh if $opt_outfile;

sub showUsage {
  print "Usage: ".SCRIPT_NAME." {--type=measure | --version | --help}\n";
}

sub showHelp {
  print "Usage: ".SCRIPT_NAME." {--type=measure | --version | --help}\n";
  print "Options:\n";
  print "\t--type=measure     specifies the name of a measure to test\n";
  print "\t--version          show version information\n";
  print "\t--help             show this help message\n";
}

__END__

=head1 NAME

test-modules.pl -- run tests on WordNet::Similarity modules

=head1 SYNOPSIS

test-modules.pl [--type=measure | --version | --help ]

=head1 DESCRIPTION

B<Warning>: The following is out-of-date and just plain wrong.

Use this to test WordNet::Similarity.  You must have run Makefile.PL and
make first (but before you run make install).  Runs some tests on a bunch
of pairs of word senses, printing to the standard output.  To see if a
new distribution is working correctly, do this:

  ./test-distro.pl res --no-debug > stable.text
  ./test-distro.pl res > test.text
  diff stable.text test.text

You may substitute the measure of your choice for 'res' above.

=head1 OPTIONS

B<--no-debug>

    When this option is given, the version of WordNet::Similarity found
    in /usr/lib/perl5/site_perl/5.8.0 (or something similar) is used instead
    of the version in ./blib/lib/

