#!perl

use Test::More tests => 24;

use FrameNet::WordNet::Detour;
use FrameNet::WordNet::Detour::Data;
use FrameNet::WordNet::Detour::Frame;
 SKIP: {
     skip "\$WNHOME and/or \$FNHOME not set", 24
	 unless ( exists($ENV{'WNHOME'}) and exists($ENV{'FNHOME'}) );
     my $detour = FrameNet::WordNet::Detour->new(-cached => 1);
#$detour->unlimited;
#$detour->cached;

# formal part - checking if all functions return the right type
     my $qr = $detour->query("get#v#1");
     like($qr,
	  qr/^FrameNet::WordNet::Detour::Data/, 
	  "Testing if query() returns a good reference");
     
     use WordNet::QueryData;
     my $qd = WordNet::QueryData->new($ENV{'WNHOME'}."/dict");
     my $detour2 = FrameNet::WordNet::Detour->new(-wnquerydata => $qd);
     like($detour->query("get#v#10"),qr/^FrameNet::WordNet::Detour::Data/,
	  "Testing if detour works with a given WordNet::QueryData object");
     
# FrameNet::WordNet::Detour::Data
     isnt($qr->message,"",
	  "Testing if Data::message returns a non-empty scalar");
     
     isnt($qr->query,"",
	  "Testing if Data::query returns a non-empty scalar");
     
     cmp_ok(scalar $qr->get_fees("getting"), '>', 0 ,
	    "Testing if Data::get_fees returns an array");
     
     isnt($qr->get_weight("Getting"),"",
	  "Testing if Data::get_weight returns a non-empty scalar");
     
     like($qr->get_number_of_frames, qr/\d+/,
	  "Testing if Data::get_number_of_frames returns a number");
     
     is(ref $qr->get_best_frames, "ARRAY",
	"Testing if Data::get_best_frames returns an array");
     
     is(ref $qr->get_best_framenames, "ARRAY",
	"Testing if Data::get_best_framenames returns an array");
     
     is(ref $qr->get_all_frames, "ARRAY",
	"Testing if Data::get_all_frames returns an array");

     is(ref $qr->get_all_framenames, "ARRAY",
	"Testing if Data::get_all_framenames returns an array");
     
     is(ref $qr->get_frame("Getting"), 
	"FrameNet::WordNet::Detour::Frame",
	"Testing if Data::get_frame returns a Detour::Frame object");
     
     like($qr->get_best_weight,qr/[\d\.]+/,
	  "Testing if Data::get_best_weight returns a number");
     
     is(ref $qr->get_frames_with_weight($qr->get_best_weight),
	"ARRAY",
	"Testing if Data::get_frames_with_weight returns an array");

# FrameNet::WordNet::Detour::Frame
     
     my $f = $qr->get_frame("Getting");
     like($f->weight,qr/[\d\.]+/,
	  "Testing if Frame::weight returns a number");
     
     like($f->name,qr/[\w_]/,
	  "Testing if Frame::name returns a potential frame name");
     
     is(ref scalar $f->fees,"ARRAY",
	"Testing if Frame::fees returns an array");

     is(ref scalar $f->sims, "ARRAY",
	"Testing if Frame::sims returns an array");

# content part
     ok($detour->query("get#v#1")->isOK, 
	"Testing if a simple Query returns a result");

     ok(! $detour->query("get#")->isOK,
	"Testing if a syntactically wrong query fails");
     
     my @l = @{$detour->query("get#v#7")->get_best_framenames};

     ok(@l > 0, "Examining a complex query");

     is($l[1],
	"Feeling",
	"Checking if the result is correct");

     is(ref $detour->query("drink#v"),
	"ARRAY",
	"Testing if a underspecified result returns an array");

     is($detour->query("get#v#1")->query,
	"get#v#1",
	"Checking if the embedded classes work correctly");
}