The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;

use Test::More tests => 57;
use Test::Exception;

use Data::Dumper;

use File::Basename;
use File::Spec::Functions;

use lib "../lib";

use_ok("Devel::PerlySense::Document");
use_ok("Devel::PerlySense::Document::Location");


BEGIN { -d "t" and chdir("t"); }


ok(my $oDocument = Devel::PerlySense::Document->new(oPerlySense => Devel::PerlySense->new()), "new ok");

my $dirData = "data/simple-lib";
my $fileOrigin = "$dirData/lib/Win32/Word/Writer.pm";
my $oLocation;



note("Find sub by name");

ok($oDocument->parse(file => $fileOrigin), "Parsed file ok");
is(my $package = $oDocument->packageAt(row => 429), "Win32::Word::Writer", "Correct package Table ok");

is($oDocument->oLocationSub(name => "Write", package => "missing package"), undef, "Didn't find missing package declaration");
ok($oLocation = $oDocument->oLocationSub(name => "Write", package => $package), "Found correct declaration");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 396, "  row");
is($oLocation->col, 1, "  col");

ok($oLocation = $oDocument->oLocationSub(name => "main_sub"), "Found correct declaration in default package main");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 132, "  row");
is($oLocation->col, 1, "  col");

ok($oLocation = $oDocument->oLocationSub(name => "NewParagraph", package => $package), "Found correct declaration");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 446, "  row");
is($oLocation->col, 1, "  col");





note("Find the sub at row/col");
$oLocation =  $oDocument->oLocationSubAt(row => 2, col => 1);
ok( ! $oLocation, "Missing sub returned undef") or warn(Dumper($oLocation));

ok(
    ! $oDocument->oLocationSubAt(row => 395, col => 1),
    "Missing sub (edge case: just before) returned undef",
);
ok( $oLocation = $oDocument->oLocationSubAt(row => 396, col => 1), "Found sub on start line");
is($oLocation->row, 396, "  Got correct sub start row");
is($oLocation->col, 1, "  Got correct sub start col");
is($oLocation->rhProperty->{nameSub}, "Write", "  Got correct sub name");
ok(my $oLocationEnd = $oLocation->rhProperty->{oLocationEnd}, "  Got and end oLocation");
is($oLocationEnd->row, 404, "  Got correct sub end row");
is($oLocationEnd->col, 2, "  Got correct sub end col");

ok( $oLocation = $oDocument->oLocationSubAt(row => 404, col => 1), "Found sub on end line");
ok(
    ! $oDocument->oLocationSubAt(row => 405, col => 1),
    "Missing sub (edge case: just after) returned undef",
);

#is($oLocation->file







ok($oDocument = Devel::PerlySense::Document->new(oPerlySense => Devel::PerlySense->new()), "new ok");
$fileOrigin = "$dirData/lib/Game/Event/Timed.pm";

ok($oDocument->parse(file => $fileOrigin), "Parsed file ok");
ok($oLocation = $oDocument->oLocationSubDefinition(name => "checkTick", row => 107), "Found sub from col package");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 123, "  row");
is($oLocation->col, 1, "  col");


ok($oLocation = $oDocument->oLocationSubDefinition(name => "checkTick", row => 1), "Found sub from col package main");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 21, "  row");
is($oLocation->col, 1, "  col");



ok($oLocation = $oDocument->oLocationSubDefinition(name => "checkTick", package => "main"), "Found sub from param package main");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 21, "  row");
is($oLocation->col, 1, "  col");


ok($oLocation = $oDocument->oLocationSubDefinition(name => "checkTick"), "Found sub from default package main");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 21, "  row");
is($oLocation->col, 1, "  col");


ok($oLocation = $oDocument->oLocationSubDefinition(name => "checkTick", package => "Game::Event::Timed"), "Found sub from default package main");
is($oLocation->file, $fileOrigin, " Got file");
is($oLocation->row, 123, "  row");
is($oLocation->col, 1, "  col");






print "\n*** Parent modules\n";

$dirData = "data/project-lib";
my $rexFileDest = qr/Game.Object.Worm.pm/;

ok($oDocument = Devel::PerlySense::Document->new(oPerlySense => Devel::PerlySense->new()), "new ok");
$fileOrigin = "$dirData/Game/Object/Worm/Bot.pm";

ok($oDocument->parse(file => $fileOrigin), "Parsed file ok");
ok($oLocation = $oDocument->oLocationSubDefinition(name => "loadFile", package => "Game::Object::Worm::Bot"), "Found sub in parent package");
like($oLocation->file, $rexFileDest, " Got file");
is($oLocation->row, 360, "  row");
is($oLocation->col, 1, "  col");




__END__